chiark / gitweb /
dbus: shut down bus connection cleanly and fully when a direct client disconnects
[elogind.git] / src / dbus.c
index 6660cf0c5a7ed77d0ecd956fbe327f24905a2640..0008cfd303a933ed24b0bc6a5153f6ec4a3dd9a1 100644 (file)
@@ -71,6 +71,7 @@ static const char *error_to_dbus(int error);
 static void bus_done_api(Manager *m);
 static void bus_done_system(Manager *m);
 static void bus_done_private(Manager *m);
+static void shutdown_connection(Manager *m, DBusConnection *c);
 
 static void bus_dispatch_status(DBusConnection *bus, DBusDispatchStatus status, void *data)  {
         Manager *m = data;
@@ -336,10 +337,10 @@ static DBusHandlerResult api_bus_message_filter(DBusConnection *connection, DBus
 
         dbus_error_init(&error);
 
-        /* log_debug("Got D-Bus request: %s.%s() on %s", */
-        /*           dbus_message_get_interface(message), */
-        /*           dbus_message_get_member(message), */
-        /*           dbus_message_get_path(message)); */
+        log_debug("Got D-Bus request: %s.%s() on %s",
+                  dbus_message_get_interface(message),
+                  dbus_message_get_member(message),
+                  dbus_message_get_path(message));
 
         if (dbus_message_is_signal(message, DBUS_INTERFACE_LOCAL, "Disconnected")) {
                 log_error("Warning! API D-Bus connection terminated.");
@@ -441,10 +442,10 @@ static DBusHandlerResult system_bus_message_filter(DBusConnection *connection, D
 
         dbus_error_init(&error);
 
-        /* log_debug("Got D-Bus request: %s.%s() on %s", */
-        /*           dbus_message_get_interface(message), */
-        /*           dbus_message_get_member(message), */
-        /*           dbus_message_get_path(message)); */
+        log_debug("Got D-Bus request: %s.%s() on %s",
+                  dbus_message_get_interface(message),
+                  dbus_message_get_member(message),
+                  dbus_message_get_path(message));
 
         if (dbus_message_is_signal(message, DBUS_INTERFACE_LOCAL, "Disconnected")) {
                 log_error("Warning! System D-Bus connection terminated.");
@@ -472,16 +473,13 @@ static DBusHandlerResult private_bus_message_filter(DBusConnection *connection,
         assert(message);
         assert(m);
 
-        /* log_debug("Got D-Bus request: %s.%s() on %s", */
-        /*           dbus_message_get_interface(message), */
-        /*           dbus_message_get_member(message), */
-        /*           dbus_message_get_path(message)); */
+        log_debug("Got D-Bus request: %s.%s() on %s",
+                  dbus_message_get_interface(message),
+                  dbus_message_get_member(message),
+                  dbus_message_get_path(message));
 
-        if (dbus_message_is_signal(message, DBUS_INTERFACE_LOCAL, "Disconnected")) {
-                set_remove(m->bus_connections, connection);
-                set_remove(m->bus_connections_for_dispatch, connection);
-                dbus_connection_unref(connection);
-        }
+        if (dbus_message_is_signal(message, DBUS_INTERFACE_LOCAL, "Disconnected"))
+                shutdown_connection(m, connection);
 
         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
@@ -496,12 +494,13 @@ unsigned bus_dispatch(Manager *m) {
                  * dispatch any D-Bus messages, so that we won't end
                  * up wanting to queue another message. */
 
-                if (m->api_bus)
-                        if (!dbus_connection_send(m->api_bus, m->queued_message, NULL))
+                if (m->queued_message_connection)
+                        if (!dbus_connection_send(m->queued_message_connection, m->queued_message, NULL))
                                 return 0;
 
                 dbus_message_unref(m->queued_message);
                 m->queued_message = NULL;
+                m->queued_message_connection = NULL;
         }
 
         if ((c = set_first(m->bus_connections_for_dispatch))) {
@@ -793,9 +792,9 @@ static int bus_init_system(Manager *m) {
                 goto fail;
         }
 
-        log_debug("Successfully connected to system D-Bus bus %s as %s",
-                  strnull((id = dbus_connection_get_server_id(m->system_bus))),
-                  strnull(dbus_bus_get_unique_name(m->system_bus)));
+        log_info("Successfully connected to system D-Bus bus %s as %s",
+                 strnull((id = dbus_connection_get_server_id(m->system_bus))),
+                 strnull(dbus_bus_get_unique_name(m->system_bus)));
         dbus_free(id);
 
         return 0;
@@ -877,9 +876,9 @@ static int bus_init_api(Manager *m) {
         if ((r = query_name_list(m)) < 0)
                 goto fail;
 
-        log_debug("Successfully connected to API D-Bus bus %s as %s",
-                  strnull((id = dbus_connection_get_server_id(m->api_bus))),
-                  strnull(dbus_bus_get_unique_name(m->api_bus)));
+        log_info("Successfully connected to API D-Bus bus %s as %s",
+                 strnull((id = dbus_connection_get_server_id(m->api_bus))),
+                 strnull(dbus_bus_get_unique_name(m->api_bus)));
         dbus_free(id);
 
         return 0;
@@ -926,7 +925,7 @@ static int bus_init_private(Manager *m) {
 
         dbus_server_set_new_connection_function(m->private_bus, bus_new_connection, m, NULL);
 
-        log_debug("Successfully create private D-Bus server.");
+        log_debug("Successfully created private D-Bus server.");
 
         return 0;
 
@@ -991,6 +990,15 @@ static void shutdown_connection(Manager *m, DBusConnection *c) {
                 set_free(s);
         }
 
+        if (m->queued_message_connection == c) {
+                m->queued_message_connection = NULL;
+
+                if (m->queued_message) {
+                        dbus_message_unref(m->queued_message);
+                        m->queued_message = NULL;
+                }
+        }
+
         dbus_connection_set_dispatch_status_function(c, NULL, NULL, NULL);
         dbus_connection_flush(c);
         dbus_connection_close(c);