diff --git a/examples/debug-logging.c b/examples/debug-logging.c index 0836fef5c..755e69b19 100644 --- a/examples/debug-logging.c +++ b/examples/debug-logging.c @@ -17,7 +17,10 @@ static void message_callback (guestfs_h *g, void *opaque, uint64_t event, int ev * debug messages. */ static const uint64_t event_bitmask = - GUESTFS_EVENT_LIBRARY | GUESTFS_EVENT_APPLIANCE | GUESTFS_EVENT_TRACE; + GUESTFS_EVENT_LIBRARY | + GUESTFS_EVENT_WARNING | + GUESTFS_EVENT_APPLIANCE | + GUESTFS_EVENT_TRACE; int main (int argc, char *argv[]) diff --git a/generator/events.ml b/generator/events.ml index 58c0c5442..c92c76014 100644 --- a/generator/events.ml +++ b/generator/events.ml @@ -39,6 +39,8 @@ let events = [ "enter"; (* enter a function *) "libvirt_auth"; (* libvirt authentication request *) + + "warning"; (* warnings from the library *) ] let events = mapi (fun i name -> name, 1 lsl i) events diff --git a/java/t/GuestFS420LogMessages.java b/java/t/GuestFS420LogMessages.java index 3ff7d9c11..624027d4f 100644 --- a/java/t/GuestFS420LogMessages.java +++ b/java/t/GuestFS420LogMessages.java @@ -62,7 +62,7 @@ public class GuestFS420LogMessages LogEvent le = new LogEvent (); g.set_event_callback (le, GuestFS.EVENT_APPLIANCE|GuestFS.EVENT_LIBRARY| - GuestFS.EVENT_TRACE); + GuestFS.EVENT_WARNING|GuestFS.EVENT_TRACE); // Now make sure we see some messages. g.set_trace (true); diff --git a/ocaml/t/guestfs_420_log_messages.ml b/ocaml/t/guestfs_420_log_messages.ml index a8897c287..860d5be30 100644 --- a/ocaml/t/guestfs_420_log_messages.ml +++ b/ocaml/t/guestfs_420_log_messages.ml @@ -32,7 +32,7 @@ let log g ev eh buf array = let () = let g = new Guestfs.guestfs () in let events = [ Guestfs.EVENT_APPLIANCE; Guestfs.EVENT_LIBRARY; - Guestfs.EVENT_TRACE ] in + Guestfs.EVENT_WARNING; Guestfs.EVENT_TRACE ] in ignore (g#set_event_callback log events); g#set_trace true; diff --git a/perl/t/410-close-event.t b/perl/t/410-close-event.t index aa323a621..fbba614ac 100644 --- a/perl/t/410-close-event.t +++ b/perl/t/410-close-event.t @@ -48,7 +48,7 @@ sub close_callback { # Register an event callback for all log messages. my $events = $Sys::Guestfs::EVENT_APPLIANCE | $Sys::Guestfs::EVENT_LIBRARY | - $Sys::Guestfs::EVENT_TRACE; + $Sys::Guestfs::EVENT_WARNING | $Sys::Guestfs::EVENT_TRACE; my $eh; $eh = $g->set_event_callback (\&log_callback, $events); ok ($eh >= 0); diff --git a/perl/t/420-log-messages.t b/perl/t/420-log-messages.t index aa323a621..fbba614ac 100644 --- a/perl/t/420-log-messages.t +++ b/perl/t/420-log-messages.t @@ -48,7 +48,7 @@ sub close_callback { # Register an event callback for all log messages. my $events = $Sys::Guestfs::EVENT_APPLIANCE | $Sys::Guestfs::EVENT_LIBRARY | - $Sys::Guestfs::EVENT_TRACE; + $Sys::Guestfs::EVENT_WARNING | $Sys::Guestfs::EVENT_TRACE; my $eh; $eh = $g->set_event_callback (\&log_callback, $events); ok ($eh >= 0); diff --git a/python/t/420-log-messages.py b/python/t/420-log-messages.py index 9d129ee60..470c07a46 100644 --- a/python/t/420-log-messages.py +++ b/python/t/420-log-messages.py @@ -34,7 +34,8 @@ def log_callback (ev,eh,buf,array): (guestfs.event_to_string (ev), eh, buf, array)) # Register an event callback for all log messages. -events = guestfs.EVENT_APPLIANCE | guestfs.EVENT_LIBRARY | guestfs.EVENT_TRACE +events = guestfs.EVENT_APPLIANCE | guestfs.EVENT_LIBRARY \ + | guestfs.EVENT_WARNING | guestfs.EVENT_TRACE g.set_event_callback (log_callback, events) # Now make sure we see some messages. diff --git a/ruby/t/tc_420_log_messages.rb b/ruby/t/tc_420_log_messages.rb index d23a0fbbc..3fe70de7e 100644 --- a/ruby/t/tc_420_log_messages.rb +++ b/ruby/t/tc_420_log_messages.rb @@ -36,7 +36,7 @@ class TestLoad < Test::Unit::TestCase # Grab log, trace and daemon messages into our custom callback. event_bitmask = Guestfs::EVENT_APPLIANCE | Guestfs::EVENT_LIBRARY | - Guestfs::EVENT_TRACE + Guestfs::EVENT_WARNING | Guestfs::EVENT_TRACE g.set_event_callback(log, event_bitmask) # Make sure we see some messages. diff --git a/src/errors.c b/src/errors.c index 53f202d9b..4829dd39e 100644 --- a/src/errors.c +++ b/src/errors.c @@ -57,7 +57,7 @@ void guestfs___warning (guestfs_h *g, const char *fs, ...) { va_list args; - CLEANUP_FREE char *msg = NULL, *msg2 = NULL; + CLEANUP_FREE char *msg = NULL; int len; va_start (args, fs); @@ -66,11 +66,7 @@ guestfs___warning (guestfs_h *g, const char *fs, ...) if (len < 0) return; - len = asprintf (&msg2, _("warning: %s"), msg); - - if (len < 0) return; - - guestfs___call_callbacks_message (g, GUESTFS_EVENT_LIBRARY, msg2, len); + guestfs___call_callbacks_message (g, GUESTFS_EVENT_WARNING, msg, len); } /* Debug messages. */ diff --git a/src/events.c b/src/events.c index 4be56f142..21c610f3b 100644 --- a/src/events.c +++ b/src/events.c @@ -130,19 +130,26 @@ guestfs___call_callbacks_message (guestfs_h *g, uint64_t event, if ((event == GUESTFS_EVENT_APPLIANCE || event == GUESTFS_EVENT_LIBRARY || + event == GUESTFS_EVENT_WARNING || event == GUESTFS_EVENT_TRACE) && - (g->verbose || event == GUESTFS_EVENT_TRACE)) { + (g->verbose || + event == GUESTFS_EVENT_WARNING || + event == GUESTFS_EVENT_TRACE)) { bool from_appliance = event == GUESTFS_EVENT_APPLIANCE; size_t i, i0; /* APPLIANCE => * LIBRARY => libguestfs: \n + * WARNING => libguestfs: warning: \n * TRACE => libguestfs: trace: \n (RHBZ#673479) */ if (event != GUESTFS_EVENT_APPLIANCE) fputs ("libguestfs: ", stderr); + if (event == GUESTFS_EVENT_WARNING) + fputs ("warning: ", stderr); + if (event == GUESTFS_EVENT_TRACE) fputs ("trace: ", stderr); diff --git a/src/guestfs.pod b/src/guestfs.pod index 908ce961b..5908c2be4 100644 --- a/src/guestfs.pod +++ b/src/guestfs.pod @@ -2791,6 +2791,16 @@ verbose flag is set in which case they are sent to stderr. You can override the printing of verbose messages to stderr by setting up a callback. +=item GUESTFS_EVENT_WARNING +(payload type: message buffer) + +The callback function is called whenever a warning message is +generated by the library part of libguestfs. + +If no callback is registered: the messages are printed to stderr. You +can override the printing of warning messages to stderr by setting up +a callback. + =item GUESTFS_EVENT_TRACE (payload type: message buffer) @@ -2843,8 +2853,8 @@ in the C. For example, to register for all log message events, you could call this function with the bitmask -C. To register a -single callback for all possible classes of events, use +C. +To register a single callback for all possible classes of events, use C. C should always be passed as 0. @@ -2933,9 +2943,9 @@ capture debug and other messages. In libguestfs E 1.8 these were sent unconditionally to C. Events associated with log messages are: C, -C and C. (Note that -error messages are not events; you must capture error messages -separately). +C, C and +C. (Note that error messages are not events; you +must capture error messages separately). Programs have to set up a callback to capture the classes of events of interest: @@ -2943,8 +2953,8 @@ interest: int eh = guestfs_set_event_callback (g, message_callback, - GUESTFS_EVENT_LIBRARY|GUESTFS_EVENT_APPLIANCE| - GUESTFS_EVENT_TRACE, + GUESTFS_EVENT_LIBRARY | GUESTFS_EVENT_APPLIANCE | + GUESTFS_EVENT_WARNING | GUESTFS_EVENT_TRACE, 0, NULL) == -1) if (eh == -1) { // handle error in the usual way diff --git a/tests/c-api/test-debug-to-file.c b/tests/c-api/test-debug-to-file.c index 4fab5a1da..99e14e829 100644 --- a/tests/c-api/test-debug-to-file.c +++ b/tests/c-api/test-debug-to-file.c @@ -67,7 +67,8 @@ main (int argc, char *argv[]) if (guestfs_set_event_callback (g, debug_to_file, - GUESTFS_EVENT_LIBRARY|GUESTFS_EVENT_APPLIANCE|GUESTFS_EVENT_TRACE, + GUESTFS_EVENT_LIBRARY | GUESTFS_EVENT_APPLIANCE | + GUESTFS_EVENT_WARNING | GUESTFS_EVENT_TRACE, 0, debugfp) == -1) exit (EXIT_FAILURE);