X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fdbus.c;h=daa2c84a05925d9d5b51feeee972e7b823972580;hp=2a379a2b3e0dd69dfeeb5c74f8422f7a85ea48e8;hb=c375a7f750d0ac3ab130b8d84ebbcbbf32b96c72;hpb=8d0e38a2b966799af884e78a54fd6a2dffa44788 diff --git a/src/dbus.c b/src/dbus.c index 2a379a2b3..daa2c84a0 100644 --- a/src/dbus.c +++ b/src/dbus.c @@ -332,7 +332,7 @@ static DBusHandlerResult api_bus_message_filter(DBusConnection *connection, DBus DBUS_TYPE_STRING, &old_owner, DBUS_TYPE_STRING, &new_owner, DBUS_TYPE_INVALID)) - log_error("Failed to parse NameOwnerChanged message: %s", error.message); + log_error("Failed to parse NameOwnerChanged message: %s", bus_error_message(&error)); else { if (set_remove(BUS_CONNECTION_SUBSCRIBED(m, connection), (char*) name)) log_debug("Subscription client vanished: %s (left: %u)", name, set_size(BUS_CONNECTION_SUBSCRIBED(m, connection))); @@ -351,7 +351,7 @@ static DBusHandlerResult api_bus_message_filter(DBusConnection *connection, DBus if (!dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID)) - log_error("Failed to parse ActivationRequest message: %s", error.message); + log_error("Failed to parse ActivationRequest message: %s", bus_error_message(&error)); else { int r; Unit *u; @@ -446,7 +446,7 @@ static DBusHandlerResult system_bus_message_filter(DBusConnection *connection, D if (!dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &cgroup, DBUS_TYPE_INVALID)) - log_error("Failed to parse Released message: %s", error.message); + log_error("Failed to parse Released message: %s", bus_error_message(&error)); else cgroup_notify_empty(m, cgroup); } @@ -482,7 +482,7 @@ static DBusHandlerResult private_bus_message_filter(DBusConnection *connection, if (!dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &cgroup, DBUS_TYPE_INVALID)) - log_error("Failed to parse Released message: %s", error.message); + log_error("Failed to parse Released message: %s", bus_error_message(&error)); else cgroup_notify_empty(m, cgroup); @@ -540,7 +540,7 @@ static void request_name_pending_cb(DBusPendingCall *pending, void *userdata) { case DBUS_MESSAGE_TYPE_ERROR: assert_se(dbus_set_error_from_message(&error, reply)); - log_warning("RequestName() failed: %s", error.message); + log_warning("RequestName() failed: %s", bus_error_message(&error)); break; case DBUS_MESSAGE_TYPE_METHOD_RETURN: { @@ -550,7 +550,7 @@ static void request_name_pending_cb(DBusPendingCall *pending, void *userdata) { &error, DBUS_TYPE_UINT32, &r, DBUS_TYPE_INVALID)) { - log_error("Failed to parse RequestName() reply: %s", error.message); + log_error("Failed to parse RequestName() reply: %s", bus_error_message(&error)); break; } @@ -637,7 +637,7 @@ static void query_name_list_pending_cb(DBusPendingCall *pending, void *userdata) case DBUS_MESSAGE_TYPE_ERROR: assert_se(dbus_set_error_from_message(&error, reply)); - log_warning("ListNames() failed: %s", error.message); + log_warning("ListNames() failed: %s", bus_error_message(&error)); break; case DBUS_MESSAGE_TYPE_METHOD_RETURN: { @@ -731,8 +731,8 @@ static int bus_setup_loop(Manager *m, DBusConnection *bus) { return 0; } -static dbus_bool_t allow_only_root(DBusConnection *connection, unsigned long uid, void *data) { - return uid == 0; +static dbus_bool_t allow_only_same_user(DBusConnection *connection, unsigned long uid, void *data) { + return uid == 0 || uid == geteuid(); } static void bus_new_connection( @@ -749,7 +749,7 @@ static void bus_new_connection( return; } - dbus_connection_set_unix_user_function(new_connection, allow_only_root, NULL, NULL); + dbus_connection_set_unix_user_function(new_connection, allow_only_same_user, NULL, NULL); if (bus_setup_loop(m, new_connection) < 0) return; @@ -782,7 +782,7 @@ static 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_debug("Failed to get system D-Bus connection, retrying later: %s", error.message); + log_debug("Failed to get system D-Bus connection, retrying later: %s", bus_error_message(&error)); r = 0; goto fail; } @@ -806,7 +806,7 @@ static int bus_init_system(Manager *m) { &error); if (dbus_error_is_set(&error)) { - log_error("Failed to register match: %s", error.message); + log_error("Failed to register match: %s", bus_error_message(&error)); r = -EIO; goto fail; } @@ -844,7 +844,7 @@ static 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_USER ? DBUS_BUS_SESSION : DBUS_BUS_SYSTEM, &error))) { - log_debug("Failed to get API D-Bus connection, retrying later: %s", error.message); + log_debug("Failed to get API D-Bus connection, retrying later: %s", bus_error_message(&error)); r = 0; goto fail; } @@ -872,7 +872,7 @@ static int bus_init_api(Manager *m) { &error); if (dbus_error_is_set(&error)) { - log_error("Failed to register match: %s", error.message); + log_error("Failed to register match: %s", bus_error_message(&error)); r = -EIO; goto fail; } @@ -887,7 +887,7 @@ static int bus_init_api(Manager *m) { &error); if (dbus_error_is_set(&error)) { - log_error("Failed to register match: %s", error.message); + log_error("Failed to register match: %s", bus_error_message(&error)); r = -EIO; goto fail; } @@ -930,13 +930,36 @@ static int bus_init_private(Manager *m) { if (m->private_bus) return 0; - /* We want the private bus only when running as init */ - if (getpid() != 1) - return 0; + if (m->running_as == MANAGER_SYSTEM) { + + /* We want the private bus only when running as init */ + if (getpid() != 1) + return 0; + + unlink("/run/systemd/private"); + m->private_bus = dbus_server_listen("unix:path=/run/systemd/private", &error); + } else { + const char *e; + char *p; + + e = getenv("XDG_RUNTIME_DIR"); + if (!e) + return 0; - unlink("/run/systemd/private"); - if (!(m->private_bus = dbus_server_listen("unix:path=/run/systemd/private", &error))) { - log_error("Failed to create private D-Bus server: %s", error.message); + if (asprintf(&p, "unix:path=%s/systemd/private", e) < 0) { + log_error("Not enough memory"); + r = -ENOMEM; + goto fail; + } + + mkdir_parents(p+10, 0755); + unlink(p+10); + m->private_bus = dbus_server_listen(p, &error); + free(p); + } + + if (!m->private_bus) { + log_error("Failed to create private D-Bus server: %s", bus_error_message(&error)); r = -EIO; goto fail; } @@ -1113,7 +1136,7 @@ static void query_pid_pending_cb(DBusPendingCall *pending, void *userdata) { case DBUS_MESSAGE_TYPE_ERROR: assert_se(dbus_set_error_from_message(&error, reply)); - log_warning("GetConnectionUnixProcessID() failed: %s", error.message); + log_warning("GetConnectionUnixProcessID() failed: %s", bus_error_message(&error)); break; case DBUS_MESSAGE_TYPE_METHOD_RETURN: { @@ -1123,7 +1146,7 @@ static void query_pid_pending_cb(DBusPendingCall *pending, void *userdata) { &error, DBUS_TYPE_UINT32, &r, DBUS_TYPE_INVALID)) { - log_error("Failed to parse GetConnectionUnixProcessID() reply: %s", error.message); + log_error("Failed to parse GetConnectionUnixProcessID() reply: %s", bus_error_message(&error)); break; } @@ -1274,3 +1297,42 @@ int bus_fdset_add_all(Manager *m, FDSet *fds) { return 0; } + +void bus_broadcast_finished( + Manager *m, + usec_t kernel_usec, + usec_t initrd_usec, + usec_t userspace_usec, + usec_t total_usec) { + + DBusMessage *message; + + assert(m); + + message = dbus_message_new_signal("/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "StartupFinished"); + if (!message) { + log_error("Out of memory."); + return; + } + + assert_cc(sizeof(usec_t) == sizeof(uint64_t)); + if (!dbus_message_append_args(message, + DBUS_TYPE_UINT64, &kernel_usec, + DBUS_TYPE_UINT64, &initrd_usec, + DBUS_TYPE_UINT64, &userspace_usec, + DBUS_TYPE_UINT64, &total_usec, + DBUS_TYPE_INVALID)) { + log_error("Out of memory."); + goto finish; + } + + + if (bus_broadcast(m, message) < 0) { + log_error("Out of memory."); + goto finish; + } + +finish: + if (message) + dbus_message_unref(message); +}