X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-bus%2Fbus-control.c;h=bb33b14ff8105f95eeb91d556fecc62a746fa3bd;hp=b66606763d63e2a7546073e3d0cd6aa4907c8af0;hb=455971c1493fc6dc3125d235cf4ea6102cac626d;hpb=370d7a9c0fe558c5846a2abd919e397639b69506 diff --git a/src/libsystemd/sd-bus/bus-control.c b/src/libsystemd/sd-bus/bus-control.c index b66606763..bb33b14ff 100644 --- a/src/libsystemd/sd-bus/bus-control.c +++ b/src/libsystemd/sd-bus/bus-control.c @@ -278,8 +278,8 @@ static int kernel_get_list(sd_bus *bus, uint64_t flags, char ***x) { } KDBUS_ITEM_FOREACH(item, name, items) - if (item->type == KDBUS_ITEM_NAME) - entry_name = item->str; + if (item->type == KDBUS_ITEM_OWNED_NAME) + entry_name = item->name.name; if (entry_name && service_name_is_valid(entry_name)) { r = strv_extend(x, entry_name); @@ -495,8 +495,8 @@ static int bus_populate_creds_from_items(sd_bus *bus, SD_BUS_CREDS_INHERITABLE_CAPS | SD_BUS_CREDS_BOUNDING_CAPS) & mask; if (m) { - c->capability_size = item->size - KDBUS_ITEM_HEADER_SIZE; - c->capability = memdup(item->data, c->capability_size); + c->capability_size = item->size - offsetof(struct kdbus_item, caps.caps); + c->capability = memdup(item->caps.caps, c->capability_size); if (!c->capability) return -ENOMEM; @@ -524,7 +524,7 @@ static int bus_populate_creds_from_items(sd_bus *bus, } break; - case KDBUS_ITEM_NAME: + case KDBUS_ITEM_OWNED_NAME: if ((mask & SD_BUS_CREDS_WELL_KNOWN_NAMES) && service_name_is_valid(item->name.name)) { r = strv_extend(&c->well_known_names, item->name.name); if (r < 0) @@ -534,13 +534,13 @@ static int bus_populate_creds_from_items(sd_bus *bus, } break; - case KDBUS_ITEM_CONN_NAME: - if ((mask & SD_BUS_CREDS_CONNECTION_NAME)) { - c->conn_name = strdup(item->str); - if (!c->conn_name) + case KDBUS_ITEM_CONN_DESCRIPTION: + if ((mask & SD_BUS_CREDS_DESCRIPTION)) { + c->description = strdup(item->str); + if (!c->description) return -ENOMEM; - c->mask |= SD_BUS_CREDS_CONNECTION_NAME; + c->mask |= SD_BUS_CREDS_DESCRIPTION; } break; } @@ -549,7 +549,7 @@ static int bus_populate_creds_from_items(sd_bus *bus, return 0; } -static int bus_get_owner_kdbus( +static int bus_get_name_creds_kdbus( sd_bus *bus, const char *name, uint64_t mask, @@ -627,7 +627,7 @@ fail: return r; } -static int bus_get_owner_dbus1( +static int bus_get_name_creds_dbus1( sd_bus *bus, const char *name, uint64_t mask, @@ -773,7 +773,7 @@ static int bus_get_owner_dbus1( return 0; } -_public_ int sd_bus_get_owner( +_public_ int sd_bus_get_name_creds( sd_bus *bus, const char *name, uint64_t mask, @@ -791,9 +791,72 @@ _public_ int sd_bus_get_owner( return -ENOTCONN; if (bus->is_kernel) - return bus_get_owner_kdbus(bus, name, mask, creds); + return bus_get_name_creds_kdbus(bus, name, mask, creds); else - return bus_get_owner_dbus1(bus, name, mask, creds); + return bus_get_name_creds_dbus1(bus, name, mask, creds); +} + +_public_ int sd_bus_get_owner_creds(sd_bus *bus, uint64_t mask, sd_bus_creds **ret) { + _cleanup_bus_creds_unref_ sd_bus_creds *c = NULL; + pid_t pid = 0; + int r; + + assert_return(bus, -EINVAL); + assert_return(mask <= _SD_BUS_CREDS_ALL, -ENOTSUP); + assert_return(ret, -EINVAL); + assert_return(!bus_pid_changed(bus), -ECHILD); + + if (!BUS_IS_OPEN(bus->state)) + return -ENOTCONN; + + if (!bus->ucred_valid && !isempty(bus->label)) + return -ENODATA; + + c = bus_creds_new(); + if (!c) + return -ENOMEM; + + if (bus->ucred_valid) { + pid = c->pid = bus->ucred.pid; + c->uid = bus->ucred.uid; + c->gid = bus->ucred.gid; + + c->mask |= (SD_BUS_CREDS_UID | SD_BUS_CREDS_PID | SD_BUS_CREDS_GID) & mask; + } + + if (!isempty(bus->label) && (mask & SD_BUS_CREDS_SELINUX_CONTEXT)) { + c->label = strdup(bus->label); + if (!c->label) + return -ENOMEM; + + c->mask |= SD_BUS_CREDS_SELINUX_CONTEXT; + } + + if (bus->is_kernel) { + struct kdbus_cmd_info cmd = {}; + struct kdbus_info *creator_info; + + cmd.size = sizeof(cmd); + r = ioctl(bus->input_fd, KDBUS_CMD_BUS_CREATOR_INFO, &cmd); + if (r < 0) + return -errno; + + creator_info = (struct kdbus_info *) ((uint8_t *) bus->kdbus_buffer + cmd.offset); + + r = bus_populate_creds_from_items(bus, creator_info, mask, c); + kernel_cmd_free(bus, cmd.offset); + + if (r < 0) + return r; + } else { + r = bus_creds_add_more(c, mask, pid, 0); + if (r < 0) + return r; + } + + *ret = c; + c = NULL; + return 0; } static int add_name_change_match(sd_bus *bus, @@ -1245,7 +1308,7 @@ int bus_remove_match_internal( return bus_remove_match_internal_dbus1(bus, match); } -_public_ int sd_bus_get_owner_machine_id(sd_bus *bus, const char *name, sd_id128_t *machine) { +_public_ int sd_bus_get_name_machine_id(sd_bus *bus, const char *name, sd_id128_t *machine) { _cleanup_bus_message_unref_ sd_bus_message *reply = NULL, *m = NULL; const char *mid; int r;