X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=dbus.c;h=e2f8f3cd496b15598e5367786e90ddfe4dd8cda0;hp=5829a54f9e22d208efad62cdb382105e73555f38;hb=dd8f71ee9fe4408311b335726e0787a37fbf9d42;hpb=f278026d21e2ded46f7f91152d60842525e74956 diff --git a/dbus.c b/dbus.c index 5829a54f9..e2f8f3cd4 100644 --- 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; @@ -687,7 +697,7 @@ DBusHandlerResult bus_default_message_handler(Manager *m, DBusMessage *message, if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, p->signature, &sub)) goto oom; - if ((r = p->append(m, &sub, property, p->data)) < 0) { + if ((r = p->append(m, &sub, property, (void*) p->data)) < 0) { if (r == -ENOMEM) goto oom; @@ -729,7 +739,7 @@ DBusHandlerResult bus_default_message_handler(Manager *m, DBusMessage *message, !dbus_message_iter_open_container(&sub2, DBUS_TYPE_VARIANT, p->signature, &sub3)) goto oom; - if ((r = p->append(m, &sub3, p->property, p->data)) < 0) { + if ((r = p->append(m, &sub3, p->property, (void*) p->data)) < 0) { if (r == -ENOMEM) goto oom;