X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd-bus%2Fbus-control.c;h=a8983168abeee595d3b6b5f146f4c86b8392929c;hp=bbee1b5b130a1e361bb182ae3d07e24406d63370;hb=98531b5762778ed5740e8e7edc4e3790e57e9f37;hpb=85a0aa17dd870703677118726ac448ef08e8defb diff --git a/src/libsystemd-bus/bus-control.c b/src/libsystemd-bus/bus-control.c index bbee1b5b1..a8983168a 100644 --- a/src/libsystemd-bus/bus-control.c +++ b/src/libsystemd-bus/bus-control.c @@ -96,7 +96,7 @@ static int bus_request_name_dbus1(sd_bus *bus, const char *name, uint64_t flags) r = sd_bus_call_method( bus, "org.freedesktop.DBus", - "/", + "/org/freedesktop/DBus", "org.freedesktop.DBus", "RequestName", NULL, @@ -173,7 +173,7 @@ static int bus_release_name_dbus1(sd_bus *bus, const char *name) { r = sd_bus_call_method( bus, "org.freedesktop.DBus", - "/", + "/org/freedesktop/DBus", "org.freedesktop.DBus", "ReleaseName", NULL, @@ -230,10 +230,10 @@ static int kernel_get_list(sd_bus *bus, uint64_t flags, char ***x) { KDBUS_ITEM_FOREACH(name, name_list, names) { - if ((flags & KDBUS_NAME_LIST_UNIQUE) && name->id != previous_id) { + if ((flags & KDBUS_NAME_LIST_UNIQUE) && name->owner_id != previous_id) { char *n; - if (asprintf(&n, ":1.%llu", (unsigned long long) name->id) < 0) + if (asprintf(&n, ":1.%llu", (unsigned long long) name->owner_id) < 0) return -ENOMEM; r = strv_push(x, n); @@ -242,7 +242,7 @@ static int kernel_get_list(sd_bus *bus, uint64_t flags, char ***x) { return -ENOMEM; } - previous_id = name->id; + previous_id = name->owner_id; } if (name->size > sizeof(*name) && service_name_is_valid(name->name)) { @@ -295,7 +295,7 @@ static int bus_list_names_dbus1(sd_bus *bus, char ***acquired, char ***activatab r = sd_bus_call_method( bus, "org.freedesktop.DBus", - "/", + "/org/freedesktop/DBus", "org.freedesktop.DBus", "ListNames", NULL, @@ -315,7 +315,7 @@ static int bus_list_names_dbus1(sd_bus *bus, char ***acquired, char ***activatab r = sd_bus_call_method( bus, "org.freedesktop.DBus", - "/", + "/org/freedesktop/DBus", "org.freedesktop.DBus", "ListActivatableNames", NULL, @@ -387,6 +387,10 @@ static int bus_get_owner_kdbus( conn_info = (struct kdbus_conn_info *) ((uint8_t *) bus->kdbus_buffer + cmd->offset); + /* Non-activated names are considered not available */ + if (conn_info->flags & KDBUS_HELLO_ACTIVATOR) + return name[0] == ':' ? -ENXIO : -ENOENT; + c = bus_creds_new(); if (!c) return -ENOMEM; @@ -561,7 +565,7 @@ static int bus_get_owner_dbus1( r = sd_bus_call_method( bus, "org.freedesktop.DBus", - "/", + "/org/freedesktop/DBus", "org.freedesktop.DBus", "GetNameOwner", NULL, @@ -599,7 +603,7 @@ static int bus_get_owner_dbus1( r = sd_bus_call_method( bus, "org.freedesktop.DBus", - "/", + "/org/freedesktop/DBus", "org.freedesktop.DBus", "GetConnectionUnixProcessID", NULL, @@ -628,7 +632,7 @@ static int bus_get_owner_dbus1( r = sd_bus_call_method( bus, "org.freedesktop.DBus", - "/", + "/org/freedesktop/DBus", "org.freedesktop.DBus", "GetConnectionUnixUser", NULL, @@ -655,7 +659,7 @@ static int bus_get_owner_dbus1( r = sd_bus_call_method( bus, "org.freedesktop.DBus", - "/", + "/org/freedesktop/DBus", "org.freedesktop.DBus", "GetConnectionSELinuxSecurityContext", NULL, @@ -702,6 +706,7 @@ _public_ int sd_bus_get_owner( assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN); assert_return(!bus_pid_changed(bus), -ECHILD); assert_return(service_name_is_valid(name), -EINVAL); + assert_return(bus->bus_client, -ENODATA); if (bus->is_kernel) return bus_get_owner_kdbus(bus, name, mask, creds); @@ -798,7 +803,7 @@ static int add_name_change_match(sd_bus *bus, item->name_change.new.id = new_owner_id; if (name) - strcpy(item->name_change.name, name); + memcpy(item->name_change.name, name, l); /* If the old name is unset or empty, then * this can match against added names */ @@ -849,7 +854,9 @@ static int add_name_change_match(sd_bus *bus, m->cookie = cookie; item = m->items; - item->size = offsetof(struct kdbus_item, id_change) + sizeof(struct kdbus_notify_id_change); + item->size = + offsetof(struct kdbus_item, id_change) + + sizeof(struct kdbus_notify_id_change); item->id_change.id = name_id; /* If the old name is unset or empty, then this can @@ -1016,7 +1023,7 @@ int bus_add_match_internal_kernel( m = alloca0(sz); m->size = sz; m->cookie = cookie; - m->id = id; + m->owner_id = id; item = m->items; item->size = offsetof(struct kdbus_item, id) + sizeof(uint64_t); @@ -1066,7 +1073,7 @@ static int bus_add_match_internal_dbus1( return sd_bus_call_method( bus, "org.freedesktop.DBus", - "/", + "/org/freedesktop/DBus", "org.freedesktop.DBus", "AddMatch", NULL, @@ -1104,7 +1111,7 @@ int bus_remove_match_internal_kernel( zero(m); m.size = offsetof(struct kdbus_cmd_match, items); m.cookie = cookie; - m.id = id; + m.owner_id = id; r = ioctl(bus->input_fd, KDBUS_CMD_MATCH_REMOVE, &m); if (r < 0) @@ -1123,7 +1130,7 @@ static int bus_remove_match_internal_dbus1( return sd_bus_call_method( bus, "org.freedesktop.DBus", - "/", + "/org/freedesktop/DBus", "org.freedesktop.DBus", "RemoveMatch", NULL,