X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fbus-driverd%2Fbus-driverd.c;h=4756c481bd60b15709da35a892c21c26598d2aed;hp=319596a40bdfc599327b7e65ebcb97d069564d28;hb=862bbf89c6e3db0a3ec265310eb6a92e0f1c375d;hpb=5b590f97640546962b16b3b32684b3ee6b477f93 diff --git a/src/bus-driverd/bus-driverd.c b/src/bus-driverd/bus-driverd.c index 319596a40..4756c481b 100644 --- a/src/bus-driverd/bus-driverd.c +++ b/src/bus-driverd/bus-driverd.c @@ -29,7 +29,6 @@ #include #include #include -#include #include "kdbus.h" #include "sd-bus.h" @@ -365,23 +364,18 @@ finish: return r; } -static int get_creds(sd_bus *bus, sd_bus_message *m, uint64_t mask, sd_bus_creds **_creds, sd_bus_error *error) { +static int get_creds_by_name(sd_bus *bus, const char *name, uint64_t mask, sd_bus_creds **_creds, sd_bus_error *error) { _cleanup_bus_creds_unref_ sd_bus_creds *c = NULL; - const char *name; int r; assert(bus); - assert(m); + assert(name); assert(_creds); - r = sd_bus_message_read(m, "s", &name); - if (r < 0) - return r; - assert_return(service_name_is_valid(name), -EINVAL); r = sd_bus_get_owner(bus, name, mask, &c); - if (r == -ENOENT || r == -ENXIO) + if (r == -ESRCH || r == -ENXIO) return sd_bus_error_setf(error, SD_BUS_ERROR_NAME_HAS_NO_OWNER, "Name %s is currently not owned by anyone.", name); if (r < 0) return r; @@ -395,12 +389,28 @@ static int get_creds(sd_bus *bus, sd_bus_message *m, uint64_t mask, sd_bus_creds return 0; } + +static int get_creds_by_message(sd_bus *bus, sd_bus_message *m, uint64_t mask, sd_bus_creds **_creds, sd_bus_error *error) { + const char *name; + int r; + + assert(bus); + assert(m); + assert(_creds); + + r = sd_bus_message_read(m, "s", &name); + if (r < 0) + return r; + + return get_creds_by_name(bus, name, mask, _creds, error); +} + static int driver_get_security_context(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) { _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; int r; - r = get_creds(bus, m, SD_BUS_CREDS_SELINUX_CONTEXT, &creds, error); + r = get_creds_by_message(bus, m, SD_BUS_CREDS_SELINUX_CONTEXT, &creds, error); if (r < 0) return r; @@ -419,7 +429,7 @@ static int driver_get_pid(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; int r; - r = get_creds(bus, m, SD_BUS_CREDS_PID, &creds, error); + r = get_creds_by_message(bus, m, SD_BUS_CREDS_PID, &creds, error); if (r < 0) return r; @@ -430,7 +440,7 @@ static int driver_get_user(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bu _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; int r; - r = get_creds(bus, m, SD_BUS_CREDS_UID, &creds, error); + r = get_creds_by_message(bus, m, SD_BUS_CREDS_UID, &creds, error); if (r < 0) return r; @@ -439,9 +449,20 @@ static int driver_get_user(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bu static int driver_get_name_owner(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) { _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; + const char *name; int r; - r = get_creds(bus, m, SD_BUS_CREDS_UNIQUE_NAME, &creds, error); + r = sd_bus_message_read(m, "s", &name); + if (r < 0) + return r; + + /* Here's a special exception for compatibility with dbus1: + * the bus name of the driver is owned by itself, not by a + * unique ID. */ + if (streq(name, "org.freedesktop.DBus")) + return sd_bus_reply_method_return(m, "s", "org.freedesktop.DBus"); + + r = get_creds_by_name(bus, name, SD_BUS_CREDS_UNIQUE_NAME, &creds, error); if (r < 0) return r; @@ -541,11 +562,9 @@ static int driver_list_queued_owners(sd_bus *bus, sd_bus_message *m, void *userd if (asprintf(&n, ":1.%llu", (unsigned long long) name->owner_id) < 0) return -ENOMEM; - r = strv_push(&owners, n); - if (r < 0) { - free(n); - return -ENOMEM; - } + r = strv_consume(&owners, n); + if (r < 0) + return r; } r = ioctl(bus->input_fd, KDBUS_CMD_FREE, &cmd.offset); @@ -566,7 +585,7 @@ static int driver_name_has_owner(sd_bus *bus, sd_bus_message *m, void *userdata, assert_return(service_name_is_valid(name), -EINVAL); r = sd_bus_get_owner(bus, name, 0, NULL); - if (r < 0 && r != -ENOENT && r != -ENXIO) + if (r < 0 && r != -ESRCH && r != -ENXIO) return r; return sd_bus_reply_method_return(m, "b", r >= 0); @@ -675,7 +694,7 @@ static int driver_start_service_by_name(sd_bus *bus, sd_bus_message *m, void *us r = sd_bus_get_owner(bus, name, 0, NULL); if (r >= 0) return sd_bus_reply_method_return(m, "u", BUS_START_REPLY_ALREADY_RUNNING); - if (r != -ENOENT) + if (r != -ESRCH) return r; u = strappenda(name, ".busname"); @@ -755,11 +774,11 @@ static int driver_update_environment(sd_bus*bus, sd_bus_message *m, void *userda r = sd_bus_message_new_method_call( bus, + &msg, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", - "SetEnvironment", - &msg); + "SetEnvironment"); if (r < 0) return r; @@ -847,11 +866,7 @@ static int connect_bus(Context *c) { assert(c); - r = cg_pid_get_owner_uid(0, NULL); - if (r < 0) - r = sd_bus_default_system(&c->bus); - else - r = sd_bus_default_user(&c->bus); + r = sd_bus_default(&c->bus); if (r < 0) { log_error("Failed to create bus: %s", strerror(-r)); return r;