sd_bus_creds **creds) {
_cleanup_bus_creds_unref_ sd_bus_creds *c = NULL;
- struct kdbus_cmd_name_info *cmd;
- struct kdbus_name_info *name_info;
+ struct kdbus_cmd_conn_info *cmd;
+ struct kdbus_conn_info *conn_info;
struct kdbus_item *item;
size_t size;
uint64_t m, id;
if (r < 0)
return r;
if (r > 0) {
- size = offsetof(struct kdbus_cmd_name_info, name);
+ size = offsetof(struct kdbus_cmd_conn_info, name);
cmd = alloca0(size);
cmd->id = id;
} else {
- size = offsetof(struct kdbus_cmd_name_info, name) + strlen(name) + 1;
+ size = offsetof(struct kdbus_cmd_conn_info, name) + strlen(name) + 1;
cmd = alloca0(size);
strcpy(cmd->name, name);
}
cmd->size = size;
- r = ioctl(bus->input_fd, KDBUS_CMD_NAME_INFO, cmd);
+ r = ioctl(bus->input_fd, KDBUS_CMD_CONN_INFO, cmd);
if (r < 0)
return -errno;
- name_info = (struct kdbus_name_info *) ((uint8_t *) bus->kdbus_buffer + cmd->offset);
+ conn_info = (struct kdbus_conn_info *) ((uint8_t *) bus->kdbus_buffer + cmd->offset);
c = bus_creds_new();
if (!c)
return -ENOMEM;
if (mask & SD_BUS_CREDS_UNIQUE_NAME) {
- if (asprintf(&c->unique_name, ":1.%llu", (unsigned long long) name_info->id) < 0)
+ if (asprintf(&c->unique_name, ":1.%llu", (unsigned long long) conn_info->id) < 0)
return -ENOMEM;
c->mask |= SD_BUS_CREDS_UNIQUE_NAME;
}
- KDBUS_PART_FOREACH(item, name_info, items) {
+ KDBUS_PART_FOREACH(item, conn_info, items) {
switch (item->type) {
assert_return(bus, -EINVAL);
assert_return(name, -EINVAL);
- assert_return(mask <= _SD_BUS_CREDS_MAX, -ENOTSUP);
+ assert_return(mask <= _SD_BUS_CREDS_ALL, -ENOTSUP);
assert_return(mask == 0 || creds, -EINVAL);
assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
assert_return(!bus_pid_changed(bus), -ECHILD);
}
if (is_name_id <= 0) {
+ struct kdbus_cmd_match *m;
size_t sz, l;
/* If the name argument is missing or is a well-known
offsetof(struct kdbus_notify_name_change, name) +
l+1);
- {
- union {
- uint8_t buffer[sz];
- struct kdbus_cmd_match match;
- } m;
-
- memzero(&m, sz);
-
- m.match.size = sz;
- m.match.cookie = cookie;
- m.match.src_id = KDBUS_SRC_ID_KERNEL;
+ m = alloca0(sz);
+ m->size = sz;
+ m->cookie = cookie;
+ m->src_id = KDBUS_SRC_ID_KERNEL;
- item = m.match.items;
- item->size =
- offsetof(struct kdbus_item, name_change) +
- offsetof(struct kdbus_notify_name_change, name) +
- l+1;
+ item = m->items;
+ item->size =
+ offsetof(struct kdbus_item, name_change) +
+ offsetof(struct kdbus_notify_name_change, name) +
+ l+1;
- item->name_change.old_id = old_owner_id;
- item->name_change.new_id = new_owner_id;
+ item->name_change.old_id = old_owner_id;
+ item->name_change.new_id = new_owner_id;
- if (name)
- strcpy(item->name_change.name, name);
+ if (name)
+ strcpy(item->name_change.name, name);
- /* If the old name is unset or empty, then
- * this can match against added names */
- if (!old_owner || old_owner[0] == 0) {
- item->type = KDBUS_MATCH_NAME_ADD;
+ /* If the old name is unset or empty, then
+ * this can match against added names */
+ if (!old_owner || old_owner[0] == 0) {
+ item->type = KDBUS_MATCH_NAME_ADD;
- r = ioctl(bus->input_fd, KDBUS_CMD_MATCH_ADD, m);
- if (r < 0)
- return -errno;
- }
+ r = ioctl(bus->input_fd, KDBUS_CMD_MATCH_ADD, m);
+ if (r < 0)
+ return -errno;
+ }
- /* If the new name is unset or empty, then
- * this can match against removed names */
- if (!new_owner || new_owner[0] == 0) {
- item->type = KDBUS_MATCH_NAME_REMOVE;
+ /* If the new name is unset or empty, then
+ * this can match against removed names */
+ if (!new_owner || new_owner[0] == 0) {
+ item->type = KDBUS_MATCH_NAME_REMOVE;
- r = ioctl(bus->input_fd, KDBUS_CMD_MATCH_ADD, m);
- if (r < 0)
- return -errno;
- }
+ r = ioctl(bus->input_fd, KDBUS_CMD_MATCH_ADD, m);
+ if (r < 0)
+ return -errno;
+ }
- /* If the neither name is explicitly set to
- * the empty string, then this can match
- * agains changed names */
- if (!(old_owner && old_owner[0] == 0) &&
- !(new_owner && new_owner[0] == 0)) {
- item->type = KDBUS_MATCH_NAME_CHANGE;
+ /* If the neither name is explicitly set to
+ * the empty string, then this can match
+ * agains changed names */
+ if (!(old_owner && old_owner[0] == 0) &&
+ !(new_owner && new_owner[0] == 0)) {
+ item->type = KDBUS_MATCH_NAME_CHANGE;
- r = ioctl(bus->input_fd, KDBUS_CMD_MATCH_ADD, m);
- if (r < 0)
- return -errno;
- }
+ r = ioctl(bus->input_fd, KDBUS_CMD_MATCH_ADD, m);
+ if (r < 0)
+ return -errno;
}
}
if (is_name_id != 0) {
- uint64_t sz =
- ALIGN8(offsetof(struct kdbus_cmd_match, items) +
- offsetof(struct kdbus_item, id_change) +
- sizeof(struct kdbus_notify_id_change));
- union {
- uint8_t buffer[sz];
- struct kdbus_cmd_match match;
- } m;
+ struct kdbus_cmd_match *m;
+ uint64_t sz;
/* If the name argument is missing or is a unique
* name, then add KDBUS_MATCH_ID_{ADD,REMOVE} matches
* for it */
- memzero(&m, sz);
+ sz = ALIGN8(offsetof(struct kdbus_cmd_match, items) +
+ offsetof(struct kdbus_item, id_change) +
+ sizeof(struct kdbus_notify_id_change));
- m.match.size = sz;
- m.match.cookie = cookie;
- m.match.src_id = KDBUS_SRC_ID_KERNEL;
+ m = alloca0(sz);
+ m->size = sz;
+ m->cookie = cookie;
+ m->src_id = KDBUS_SRC_ID_KERNEL;
- item = m.match.items;
+ item = m->items;
item->size = offsetof(struct kdbus_item, id_change) + sizeof(struct kdbus_notify_id_change);
item->id_change.id = name_id;