[Libguestfs] Redirecting libguestfs error messages
Or Goshen
oberonc at gmail.com
Wed Jul 17 14:12:34 UTC 2013
Well, I get these error messages during the execution of
guestfs_mount_local_run(). What can I do then ?
On Wed, Jul 17, 2013 at 5:08 PM, Richard W.M. Jones <rjones at redhat.com>wrote:
> On Wed, Jul 17, 2013 at 04:43:34PM +0300, Or Goshen wrote:
> > Hi,
> >
> > When I register a callback for events with this function call:
> > eh = guestfs_set_event_callback(g, message_callback, GUESTFS_EVENT_ALL,
> 0,
> > dev);
> >
> > Shouldnt it capture and redirect messages like this to
> message_callback():
> > "libguestfs: error: lstat: /.Trash: No such file or directory"
> >
> > I still get them in stderr ..
>
> Right. Error messages are handled by a separate path from
> log/trace/debug messages.
>
> It's possible to capture error messages and send them somewhere else
> (or nowhere). Here's how to do it from C:
>
> (1) Replace guestfs_create with guestfs_create_flags:
>
> guestfs_h *g = guestfs_create_flags (GUESTFS_CREATE_NO_ENVIRONMENT);
> if (!g) {
> /* guestfs_create_flags with the flag GUESTFS_CREATE_NO_ENVIRONMENT
> * never prints anything on stderr. If it fails, it sets the
> * global errno. So something like this should be used:
> */
> fprintf (logfp, "error: %s\n", strerror (errno));
> exit (EXIT_FAILURE);
> }
>
> (2) Call guestfs_set_error_handler just after creating the handle:
>
> guestfs_set_error_handler (g, NULL, NULL);
>
> (3) Call guestfs_parse_environment to parse the environment. This
> would have been done by guestfs_create, except you set the
> NO_ENVIRONMENT flag.
>
> if (guestfs_parse_environment (g) == -1) {
> /* see below ... */
>
> (4) For guestfs_parse_environment and all other libguestfs calls, you
> should check the return codes, and handle errors, like this:
>
> if (guestfs_parse_environment (g) == -1) {
> const char *errstr = guestfs_last_error (g);
> int errnum = guestfs_last_errno (g);
> fprintf (logfp, "error: %s", errstr);
> if (errnum > 0)
> fprintf (logfp, " (%s)", strerror (errnum));
> fprintf (logfp, "\n");
> }
>
> It's usually helpful to put all of that in a separate utility function
> or macro. Note that 'errstr' does not need to be freed, but the
> string only valid for as long as the handle is open and there are no
> more errors on the handle, so if you need to store it you should
> probably copy (strdup) it.
>
> (5) Note that guestfs_close does not return an error indication. If
> you want to detect errors from shutting down the handle, you have to do:
>
> if (guestfs_shutdown (g) == -1) {
> /* error handling as above */
> }
> guestfs_close (g);
>
> Non C bindings are a little bit different. Most (possibly all?) of
> them already set the error handler to NULL and handle errors as above.
> Typically they are turned into exceptions. Most (but not all) also
> support the new guestfs_create_flags call. All support
> guestfs_parse_environment and guestfs_shutdown.
>
> Rich.
>
> --
> Richard Jones, Virtualization Group, Red Hat
> http://people.redhat.com/~rjones
> virt-top is 'top' for virtual machines. Tiny program with many
> powerful monitoring features, net stats, disk stats, logging, etc.
> http://people.redhat.com/~rjones/virt-top
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20130717/999e377d/attachment.htm>
More information about the Libguestfs
mailing list