X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Fdbus.c;h=580bdf3f71ca811c8ae0228d138d05822d2ff7ed;hp=1cb4d0fa7dd37d09b82e3bb06c9d495afaf77dc2;hb=6d99330e26977a9970e33fd83085c8c8c9de660f;hpb=969987ea93a7fdcd2c87b551eb0adf0bd9338b32 diff --git a/src/core/dbus.c b/src/core/dbus.c index 1cb4d0fa7..580bdf3f7 100644 --- a/src/core/dbus.c +++ b/src/core/dbus.c @@ -247,9 +247,14 @@ static int selinux_filter(sd_bus *bus, sd_bus_message *message, void *userdata, } if (streq_ptr(path, "/org/freedesktop/systemd1/unit/self")) { + _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; pid_t pid; - r = sd_bus_get_owner_pid(bus, sd_bus_message_get_sender(message), &pid); + r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_PID, &creds); + if (r < 0) + return 0; + + r = sd_bus_creds_get_pid(creds, &pid); if (r < 0) return 0; @@ -272,7 +277,7 @@ static int selinux_filter(sd_bus *bus, sd_bus_message *message, void *userdata, return 0; } -static int bus_job_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) { +static int bus_job_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) { Manager *m = userdata; Job *j; int r; @@ -291,7 +296,7 @@ static int bus_job_find(sd_bus *bus, const char *path, const char *interface, vo return 1; } -static Unit *find_unit(Manager *m, sd_bus *bus, const char *path) { +static int find_unit(Manager *m, sd_bus *bus, const char *path, Unit **unit, sd_bus_error *error) { Unit *u; int r; @@ -300,30 +305,38 @@ static Unit *find_unit(Manager *m, sd_bus *bus, const char *path) { assert(path); if (streq_ptr(path, "/org/freedesktop/systemd1/unit/self")) { + _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; sd_bus_message *message; pid_t pid; message = sd_bus_get_current(bus); if (!message) - return NULL; + return 0; - r = sd_bus_get_owner_pid(bus, sd_bus_message_get_sender(message), &pid); + r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_PID, &creds); if (r < 0) - return NULL; + return r; + + r = sd_bus_creds_get_pid(creds, &pid); + if (r < 0) + return r; u = manager_get_unit_by_pid(m, pid); } else { - r = manager_load_unit_from_dbus_path(m, path, NULL, &u); + r = manager_load_unit_from_dbus_path(m, path, error, &u); if (r < 0) - return NULL; + return 0; } - return u; + if (!u) + return 0; + + *unit = u; + return 1; } -static int bus_unit_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) { +static int bus_unit_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) { Manager *m = userdata; - Unit *u; assert(bus); assert(path); @@ -331,17 +344,13 @@ static int bus_unit_find(sd_bus *bus, const char *path, const char *interface, v assert(found); assert(m); - u = find_unit(m, bus, path); - if (!u) - return 0; - - *found = u; - return 1; + return find_unit(m, bus, path, (Unit**) found, error); } -static int bus_unit_interface_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) { +static int bus_unit_interface_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) { Manager *m = userdata; Unit *u; + int r; assert(bus); assert(path); @@ -349,9 +358,9 @@ static int bus_unit_interface_find(sd_bus *bus, const char *path, const char *in assert(found); assert(m); - u = find_unit(m, bus, path); - if (!u) - return 0; + r = find_unit(m, bus, path, &u, error); + if (r <= 0) + return r; if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface)) return 0; @@ -360,9 +369,10 @@ static int bus_unit_interface_find(sd_bus *bus, const char *path, const char *in return 1; } -static int bus_unit_cgroup_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) { +static int bus_unit_cgroup_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) { Manager *m = userdata; Unit *u; + int r; assert(bus); assert(path); @@ -370,9 +380,9 @@ static int bus_unit_cgroup_find(sd_bus *bus, const char *path, const char *inter assert(found); assert(m); - u = find_unit(m, bus, path); - if (!u) - return 0; + r = find_unit(m, bus, path, &u, error); + if (r <= 0) + return r; if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface)) return 0; @@ -384,10 +394,11 @@ static int bus_unit_cgroup_find(sd_bus *bus, const char *path, const char *inter return 1; } -static int bus_cgroup_context_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) { +static int bus_cgroup_context_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) { Manager *m = userdata; CGroupContext *c; Unit *u; + int r; assert(bus); assert(path); @@ -395,9 +406,9 @@ static int bus_cgroup_context_find(sd_bus *bus, const char *path, const char *in assert(found); assert(m); - u = find_unit(m, bus, path); - if (!u) - return 0; + r = find_unit(m, bus, path, &u, error); + if (r <= 0) + return r; if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface)) return 0; @@ -410,10 +421,11 @@ static int bus_cgroup_context_find(sd_bus *bus, const char *path, const char *in return 1; } -static int bus_exec_context_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) { +static int bus_exec_context_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) { Manager *m = userdata; ExecContext *c; Unit *u; + int r; assert(bus); assert(path); @@ -421,9 +433,9 @@ static int bus_exec_context_find(sd_bus *bus, const char *path, const char *inte assert(found); assert(m); - u = find_unit(m, bus, path); - if (!u) - return 0; + r = find_unit(m, bus, path, &u, error); + if (r <= 0) + return r; if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface)) return 0; @@ -436,10 +448,11 @@ static int bus_exec_context_find(sd_bus *bus, const char *path, const char *inte return 1; } -static int bus_kill_context_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) { +static int bus_kill_context_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) { Manager *m = userdata; KillContext *c; Unit *u; + int r; assert(bus); assert(path); @@ -447,9 +460,9 @@ static int bus_kill_context_find(sd_bus *bus, const char *path, const char *inte assert(found); assert(m); - u = find_unit(m, bus, path); - if (!u) - return 0; + r = find_unit(m, bus, path, &u, error); + if (r <= 0) + return r; if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface)) return 0; @@ -462,7 +475,7 @@ static int bus_kill_context_find(sd_bus *bus, const char *path, const char *inte return 1; } -static int bus_job_enumerate(sd_bus *bus, const char *path, char ***nodes, void *userdata) { +static int bus_job_enumerate(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) { _cleanup_free_ char **l = NULL; Manager *m = userdata; unsigned k = 0; @@ -489,7 +502,7 @@ static int bus_job_enumerate(sd_bus *bus, const char *path, char ***nodes, void return k; } -static int bus_unit_enumerate(sd_bus *bus, const char *path, char ***nodes, void *userdata) { +static int bus_unit_enumerate(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) { _cleanup_free_ char **l = NULL; Manager *m = userdata; unsigned k = 0; @@ -729,42 +742,24 @@ static int bus_on_connection(sd_event_source *s, int fd, uint32_t revents, void } static int bus_list_names(Manager *m, sd_bus *bus) { - _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; - _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; - const char *name; + _cleanup_strv_free_ char **names = NULL; + char **i; int r; assert(m); assert(bus); - r = sd_bus_call_method( - bus, - "org.freedesktop.DBus", - "/org/freedesktop/DBus", - "org.freedesktop.DBus", - "ListNames", - &error, &reply, - NULL); + r = sd_bus_list_names(bus, &names, NULL); if (r < 0) { - log_error("Failed to get initial list of names: %s", bus_error_message(&error, r)); + log_error("Failed to get initial list of names: %s", strerror(-r)); return r; } - r = sd_bus_message_enter_container(reply, 'a', "s"); - if (r < 0) - return bus_log_parse_error(r); - /* This is a bit hacky, we say the owner of the name is the * name itself, because we don't want the extra traffic to * figure out the real owner. */ - while ((r = sd_bus_message_read(reply, "s", &name)) > 0) - manager_dispatch_bus_name_owner_changed(m, name, NULL, name); - if (r < 0) - return bus_log_parse_error(r); - - r = sd_bus_message_exit_container(reply); - if (r < 0) - return bus_log_parse_error(r); + STRV_FOREACH(i, names) + manager_dispatch_bus_name_owner_changed(m, *i, NULL, *i); return 0; } @@ -806,17 +801,12 @@ static int bus_setup_api(Manager *m, sd_bus *bus) { * after the new connection is set up and the name installed * to allow clients to synchronously wait for reexecution to * finish */ - r = sd_bus_request_name(bus,"org.freedesktop.systemd1", SD_BUS_NAME_ALLOW_REPLACEMENT|SD_BUS_NAME_REPLACE_EXISTING); + r = sd_bus_request_name(bus,"org.freedesktop.systemd1", SD_BUS_NAME_REPLACE_EXISTING|SD_BUS_NAME_DO_NOT_QUEUE|SD_BUS_NAME_ALLOW_REPLACEMENT); if (r < 0) { log_error("Failed to register name: %s", strerror(-r)); return r; } - if (r != SD_BUS_NAME_PRIMARY_OWNER) { - log_error("Failed to acquire name."); - return -EEXIST; - } - bus_list_names(m, bus); log_debug("Successfully connected to API bus."); @@ -948,6 +938,10 @@ static int bus_init_private(Manager *m) { if (m->private_listen_fd >= 0) return 0; + /* We don't need the private socket if we have kdbus */ + if (m->kdbus_fd >= 0) + return 0; + if (m->running_as == SYSTEMD_SYSTEM) { /* We want the private bus only when running as init */