diff options
author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2011-06-13 15:59:14 +0100 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2011-06-13 15:59:22 +0100 |
commit | c7ef3ead558e147db03e358ff37f630cac083c07 (patch) | |
tree | 61db817e68cd35bb651e72b2e4b9e8c7d9e5fff0 | |
parent | 50c81a35a7c692b0e19b4a5d92343267f4a10c06 (diff) | |
download | dbus-c7ef3ead558e147db03e358ff37f630cac083c07.tar.gz |
bus signal_handler: don't use _dbus_warn, and don't pretend to be portable
_dbus_warn isn't async-signal-safe, so that's out. We can use write()
instead; it's POSIX but not ISO C, but then again, so are signals.
Accordingly, guard it with DBUS_UNIX.
dbus-sysdeps-util-win doesn't actually implement _dbus_set_signal_handler
anyway, so not compiling this code on non-Unix seems more honest.
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=33336
Reviewed-by: Thiago Macieira <thiago@kde.org>
-rw-r--r-- | bus/main.c | 23 |
1 files changed, 21 insertions, 2 deletions
@@ -35,6 +35,9 @@ #ifdef HAVE_ERRNO_H #include <errno.h> #endif +#ifdef HAVE_UNISTD_H +#include <unistd.h> /* for write() and STDERR_FILENO */ +#endif #include "selinux.h" static BusContext *context; @@ -45,6 +48,7 @@ static int reload_pipe[2]; static void close_reload_pipe (DBusWatch **); +#ifdef DBUS_UNIX static void signal_handler (int sig) { @@ -69,14 +73,24 @@ signal_handler (int sig) * reloaded while draining the pipe buffer, which is what we * wanted. It's harmless that it will be reloaded fewer times than * we asked for, since the reload is delayed anyway, so new changes - * will be picked up. */ - _dbus_warn ("Unable to write to reload pipe.\n"); + * will be picked up. + * + * We use write() because _dbus_warn uses vfprintf, which isn't + * async-signal-safe. + * + * This is necessarily Unix-specific, but so are POSIX signals, + * so... */ + static const char message[] = + "Unable to write to reload pipe - buffer full?\n"; + + write (STDERR_FILENO, message, strlen (message)); } } break; #endif } } +#endif /* DBUS_UNIX */ static void usage (void) @@ -521,12 +535,17 @@ main (int argc, char **argv) setup_reload_pipe (bus_context_get_loop (context)); +#ifdef DBUS_UNIX + /* POSIX signals are Unix-specific, and _dbus_set_signal_handler is + * unimplemented (and probably unimplementable) on Windows, so there's + * no point in trying to make the handler portable to non-Unix. */ #ifdef SIGHUP _dbus_set_signal_handler (SIGHUP, signal_handler); #endif #ifdef DBUS_BUS_ENABLE_DNOTIFY_ON_LINUX _dbus_set_signal_handler (SIGIO, signal_handler); #endif /* DBUS_BUS_ENABLE_DNOTIFY_ON_LINUX */ +#endif /* DBUS_UNIX */ _dbus_verbose ("We are on D-Bus...\n"); _dbus_loop_run (bus_context_get_loop (context)); |