dbus-monitor: use unbuffered stdout instead of handling SIGINT
authorLennart Poettering <mzqohf@0pointer.de>
Fri, 31 Jul 2009 16:26:57 +0000 (12:26 -0400)
committerColin Walters <walters@verbum.org>
Fri, 31 Jul 2009 16:27:48 +0000 (12:27 -0400)
The current SIGINT handling of dbus-monitor ain't making too many people
happy since it defers the exit to the next msg received -- which might
be quite some time away often enough.

This patch replaces the SIGINT handling by simply enabling line-buffered
IO for STDOUT so that even if you redirect dbus-monitor into a file no
lines get accidently lost and the effect of C-c is still immediate.

halfline came up with the great idea to use setvbuf here instead of
fflush()ing after each printf().

(Oh and the old signal handler was broken anyway, the flag should have
been of type sigatomic_t and be marked volatile)

Signed-off-by: Colin Walters <walters@verbum.org>
tools/dbus-monitor.c

index 873108b..c368128 100644 (file)
@@ -33,8 +33,6 @@
 
 #include <time.h>
 
-#include <signal.h>
-
 #include "dbus-print-message.h"
 
 #ifdef DBUS_WIN
@@ -214,6 +212,13 @@ main (int argc, char *argv[])
   
   int i = 0, j = 0, numFilters = 0;
   char **filters = NULL;
+
+  /* Set stdout to be unbuffered; this is basically so that if people
+   * do dbus-monitor > file, then send SIGINT via Control-C, they
+   * don't lose the last chunk of messages.
+   */
+  setvbuf (stdout, NULL, _IOLBF, 0);
+
   for (i = 1; i < argc; i++)
     {
       char *arg = argv[i];
@@ -339,10 +344,7 @@ main (int argc, char *argv[])
     exit (1);
   }
 
-  /* we handle SIGINT so exit() is reached and flushes stdout */
-  signal (SIGINT, sigint_handler);
-  while (dbus_connection_read_write_dispatch(connection, -1)
-          && !sigint_received)
+  while (dbus_connection_read_write_dispatch(connection, -1))
     ;
   exit (0);
  lose: