summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2011-06-13 15:59:14 +0100
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2011-06-13 15:59:22 +0100
commitc7ef3ead558e147db03e358ff37f630cac083c07 (patch)
tree61db817e68cd35bb651e72b2e4b9e8c7d9e5fff0
parent50c81a35a7c692b0e19b4a5d92343267f4a10c06 (diff)
downloaddbus-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.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/bus/main.c b/bus/main.c
index 136d122f..72c9d74f 100644
--- a/bus/main.c
+++ b/bus/main.c
@@ -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));