events: Add a warning event and direct all warning messages through it.

This also causes warnings to be printed even in non-verbose mode,
which is useful.
This commit is contained in:
Richard W.M. Jones
2013-10-11 14:35:12 +01:00
parent aada08a91c
commit 92e1864913
12 changed files with 42 additions and 22 deletions

View File

@@ -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[])

View File

@@ -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

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);

View File

@@ -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.

View File

@@ -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.

View File

@@ -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. */

View File

@@ -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 => <buf>
* LIBRARY => libguestfs: <buf>\n
* WARNING => libguestfs: warning: <buf>\n
* TRACE => libguestfs: trace: <buf>\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);

View File

@@ -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<event_bitmask>.
For example, to register for all log message events, you could call
this function with the bitmask
C<GUESTFS_EVENT_APPLIANCE|GUESTFS_EVENT_LIBRARY>. To register a
single callback for all possible classes of events, use
C<GUESTFS_EVENT_APPLIANCE|GUESTFS_EVENT_LIBRARY|GUESTFS_EVENT_WARNING>.
To register a single callback for all possible classes of events, use
C<GUESTFS_EVENT_ALL>.
C<flags> should always be passed as 0.
@@ -2933,9 +2943,9 @@ capture debug and other messages. In libguestfs E<le> 1.8 these were
sent unconditionally to C<stderr>.
Events associated with log messages are: C<GUESTFS_EVENT_LIBRARY>,
C<GUESTFS_EVENT_APPLIANCE> and C<GUESTFS_EVENT_TRACE>. (Note that
error messages are not events; you must capture error messages
separately).
C<GUESTFS_EVENT_APPLIANCE>, C<GUESTFS_EVENT_WARNING> and
C<GUESTFS_EVENT_TRACE>. (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

View File

@@ -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);