chiark / gitweb /
service: don't necessarily add ordering links for non-sysv services
[elogind.git] / dbus.c
diff --git a/dbus.c b/dbus.c
index 5829a54f9e22d208efad62cdb382105e73555f38..96527ac8cfd1576e83e7708fb1db56d18225fc68 100644 (file)
--- a/dbus.c
+++ b/dbus.c
@@ -36,6 +36,10 @@ static void api_bus_dispatch_status(DBusConnection *bus, DBusDispatchStatus stat
 
         assert(bus);
         assert(m);
+
+        if (!m->api_bus)
+                return;
+
         assert(m->api_bus == bus);
 
         m->request_api_bus_dispatch = status != DBUS_DISPATCH_COMPLETE;
@@ -46,6 +50,10 @@ static void system_bus_dispatch_status(DBusConnection *bus, DBusDispatchStatus s
 
         assert(bus);
         assert(m);
+
+        if (!m->system_bus)
+                return;
+
         assert(m->system_bus == bus);
 
         m->request_system_bus_dispatch = status != DBUS_DISPATCH_COMPLETE;
@@ -304,7 +312,7 @@ static DBusHandlerResult api_bus_message_filter(DBusConnection  *connection, DBu
         /*           dbus_message_get_path(message)); */
 
         if (dbus_message_is_signal(message, DBUS_INTERFACE_LOCAL, "Disconnected")) {
-                log_error("Warning! D-Bus connection terminated.");
+                log_error("Warning! API D-Bus connection terminated.");
                 bus_done_api(m);
 
         } else if (dbus_message_is_signal(message, DBUS_INTERFACE_DBUS, "NameOwnerChanged")) {
@@ -342,7 +350,7 @@ static DBusHandlerResult system_bus_message_filter(DBusConnection  *connection,
         /*           dbus_message_get_path(message)); */
 
         if (dbus_message_is_signal(message, DBUS_INTERFACE_LOCAL, "Disconnected")) {
-                log_error("Warning! D-Bus connection terminated.");
+                log_error("Warning! System D-Bus connection terminated.");
                 bus_done_system(m);
 
         } if (dbus_message_is_signal(message, "org.freedesktop.systemd1.Agent", "Released")) {
@@ -363,17 +371,19 @@ static DBusHandlerResult system_bus_message_filter(DBusConnection  *connection,
 unsigned bus_dispatch(Manager *m) {
         assert(m);
 
-        if (m->request_api_bus_dispatch)
-                if (dbus_connection_dispatch(m->api_bus) == DBUS_DISPATCH_COMPLETE) {
+        if (m->request_api_bus_dispatch) {
+                if (dbus_connection_dispatch(m->api_bus) == DBUS_DISPATCH_COMPLETE)
                         m->request_api_bus_dispatch = false;
-                        return 1;
-                }
 
-        if (m->request_system_bus_dispatch)
-                if (dbus_connection_dispatch(m->system_bus) == DBUS_DISPATCH_COMPLETE) {
+                return 1;
+        }
+
+        if (m->request_system_bus_dispatch) {
+                if (dbus_connection_dispatch(m->system_bus) == DBUS_DISPATCH_COMPLETE)
                         m->request_system_bus_dispatch = false;
-                        return 1;
-                }
+
+                return 1;
+        }
 
         return 0;
 }
@@ -471,6 +481,7 @@ static int bus_setup_loop(Manager *m, DBusConnection *bus) {
         assert(bus);
 
         dbus_connection_set_exit_on_disconnect(bus, FALSE);
+
         if (!dbus_connection_set_watch_functions(bus, bus_add_watch, bus_remove_watch, bus_toggle_watch, m, NULL) ||
             !dbus_connection_set_timeout_functions(bus, bus_add_timeout, bus_remove_timeout, bus_toggle_timeout, m, NULL))
                 return -ENOMEM;
@@ -494,17 +505,18 @@ int bus_init_system(Manager *m) {
                 m->system_bus = m->api_bus;
         else {
                 if (!(m->system_bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error))) {
-                        log_error("Failed to get D-Bus connection, retrying later: %s", error.message);
+                        log_debug("Failed to get system D-Bus connection, retrying later: %s", error.message);
                         dbus_error_free(&error);
                         return 0;
                 }
 
+                dbus_connection_set_dispatch_status_function(m->system_bus, system_bus_dispatch_status, m, NULL);
+                m->request_system_bus_dispatch = true;
+
                 if ((r = bus_setup_loop(m, m->system_bus)) < 0) {
                         bus_done_system(m);
                         return r;
                 }
-
-                dbus_connection_set_dispatch_status_function(m->system_bus, system_bus_dispatch_status, m, NULL);
         }
 
         if (!dbus_connection_add_filter(m->system_bus, system_bus_message_filter, m, NULL)) {
@@ -530,8 +542,6 @@ int bus_init_system(Manager *m) {
                   strnull(dbus_bus_get_unique_name(m->system_bus)));
         dbus_free(id);
 
-        m->request_system_bus_dispatch = true;
-
         return 0;
 }
 
@@ -551,17 +561,18 @@ int bus_init_api(Manager *m) {
                 m->api_bus = m->system_bus;
         else {
                 if (!(m->api_bus = dbus_bus_get_private(m->running_as == MANAGER_SESSION ? DBUS_BUS_SESSION : DBUS_BUS_SYSTEM, &error))) {
-                        log_debug("Failed to get D-Bus connection, retrying later: %s", error.message);
+                        log_debug("Failed to get API D-Bus connection, retrying later: %s", error.message);
                         dbus_error_free(&error);
                         return 0;
                 }
 
+                dbus_connection_set_dispatch_status_function(m->api_bus, api_bus_dispatch_status, m, NULL);
+                m->request_api_bus_dispatch = true;
+
                 if ((r = bus_setup_loop(m, m->api_bus)) < 0) {
                         bus_done_api(m);
                         return r;
                 }
-
-                dbus_connection_set_dispatch_status_function(m->api_bus, api_bus_dispatch_status, m, NULL);
         }
 
         if (!dbus_connection_register_object_path(m->api_bus, "/org/freedesktop/systemd1", &bus_manager_vtable, m) ||
@@ -600,8 +611,6 @@ int bus_init_api(Manager *m) {
                 if (!(m->subscribed = set_new(string_hash_func, string_compare_func)))
                         return -ENOMEM;
 
-        m->request_api_bus_dispatch = true;
-
         return 0;
 }
 
@@ -612,10 +621,10 @@ void bus_done_api(Manager *m) {
                 if (m->system_bus == m->api_bus)
                         m->system_bus = NULL;
 
+                dbus_connection_set_dispatch_status_function(m->api_bus, NULL, NULL, NULL);
                 dbus_connection_close(m->api_bus);
                 dbus_connection_unref(m->api_bus);
                 m->api_bus = NULL;
-
         }
 
         if (m->subscribed) {
@@ -636,6 +645,7 @@ void bus_done_system(Manager *m) {
                 bus_done_api(m);
 
         if (m->system_bus) {
+                dbus_connection_set_dispatch_status_function(m->system_bus, NULL, NULL, NULL);
                 dbus_connection_close(m->system_bus);
                 dbus_connection_unref(m->system_bus);
                 m->system_bus = NULL;