mirror of
https://github.com/libguestfs/libguestfs.git
synced 2026-03-21 22:53:37 +00:00
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:
@@ -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[])
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user