dbus/bus bus.c,1.73,1.74 main.c,1.35,1.36
Ray Strode
halfline at kemper.freedesktop.org
Tue Dec 19 22:18:21 PST 2006
Update of /cvs/dbus/dbus/bus
In directory kemper:/tmp/cvs-serv4412/bus
Modified Files:
bus.c main.c
Log Message:
2006-12-19 Ray Strode <rstrode at redhat.com>
* bus/bus.c (process_config_every_time):
don't overwrite existing bus context activation object
until after we've checked that the new activation is
valid.
* bus/main.c
(signal_handler), (handle_reload_watch):
don't call exit() on failure, instead make do and keep
going.
(close_reload_pipe): new function to turn off
hangup-causes-config-reload behavior if an unexpected
error occurs
Index: bus.c
===================================================================
RCS file: /cvs/dbus/dbus/bus/bus.c,v
retrieving revision 1.73
retrieving revision 1.74
diff -u -d -r1.73 -r1.74
--- bus.c 12 Dec 2006 21:24:07 -0000 1.73
+++ bus.c 20 Dec 2006 06:18:19 -0000 1.74
@@ -402,6 +402,7 @@
{
DBusString full_address;
DBusList *link;
+ BusActivation *new_activation;
char *addr;
dbus_bool_t retval;
@@ -467,19 +468,20 @@
}
/* Create activation subsystem */
-
- if (is_reload)
- bus_activation_unref (context->activation);
-
- context->activation = bus_activation_new (context, &full_address,
- bus_config_parser_get_service_dirs (parser),
- error);
- if (context->activation == NULL)
+ new_activation = bus_activation_new (context, &full_address,
+ bus_config_parser_get_service_dirs (parser),
+ error);
+ if (new_activation == NULL)
{
_DBUS_ASSERT_ERROR_IS_SET (error);
goto failed;
}
+ if (is_reload)
+ bus_activation_unref (context->activation);
+
+ context->activation = new_activation;
+
/* Drop existing conf-dir watches (if applicable) */
if (is_reload)
Index: main.c
===================================================================
RCS file: /cvs/dbus/dbus/bus/main.c,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -d -r1.35 -r1.36
--- main.c 16 Sep 2006 15:34:34 -0000 1.35
+++ main.c 20 Dec 2006 06:18:19 -0000 1.36
@@ -37,6 +37,7 @@
#define RELOAD_READ_END 0
#define RELOAD_WRITE_END 1
+static void close_reload_pipe (void);
static void
signal_handler (int sig)
@@ -51,11 +52,12 @@
#endif /* DBUS_BUS_ENABLE_DNOTIFY_ON_LINUX */
case SIGHUP:
_dbus_string_init_const (&str, "foo");
- if (!_dbus_write_socket (reload_pipe[RELOAD_WRITE_END], &str, 0, 1))
- {
- _dbus_warn ("Unable to write to reload pipe.\n");
- exit (1);
- }
+ if ((reload_pipe[RELOAD_WRITE_END] > 0) &&
+ !_dbus_write_socket (reload_pipe[RELOAD_WRITE_END], &str, 0, 1))
+ {
+ _dbus_warn ("Unable to write to reload pipe.\n");
+ close_reload_pipe ();
+ }
break;
case SIGTERM:
@@ -150,20 +152,28 @@
DBusError error;
DBusString str;
_dbus_string_init (&str);
- if (_dbus_read_socket (reload_pipe[RELOAD_READ_END], &str, 1) != 1)
+ if ((reload_pipe[RELOAD_READ_END] > 0) &&
+ _dbus_read_socket (reload_pipe[RELOAD_READ_END], &str, 1) != 1)
{
_dbus_warn ("Couldn't read from reload pipe.\n");
- exit (1);
+ close_reload_pipe ();
+ return TRUE;
}
_dbus_string_free (&str);
+ /* this can only fail if we don't understand the config file
+ * or OOM. Either way we should just stick with the currently
+ * loaded config.
+ */
dbus_error_init (&error);
if (! bus_context_reload_config (context, &error))
{
+ _DBUS_ASSERT_ERROR_IS_SET (&error);
+ _dbus_assert (dbus_error_has_name (&error, DBUS_ERROR_FAILED) ||
+ dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY));
_dbus_warn ("Unable to reload configuration: %s\n",
error.message);
dbus_error_free (&error);
- exit (1);
}
return TRUE;
}
@@ -219,6 +229,16 @@
}
+static void
+close_reload_pipe (void)
+{
+ _dbus_close_socket (reload_pipe[RELOAD_READ_END], NULL);
+ reload_pipe[RELOAD_READ_END] = -1;
+
+ _dbus_close_socket (reload_pipe[RELOAD_WRITE_END], NULL);
+ reload_pipe[RELOAD_WRITE_END] = -1;
+}
+
int
main (int argc, char **argv)
{
More information about the dbus-commit
mailing list