X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd-bus%2Fbus-kernel.c;h=09e084a02f17f31dd652082ca39a96319f4184d1;hp=b63fe56c41a2a80fbdec17138ec2812846bf84ad;hb=9bd37b40fac198fee2ff4eabc8793f1a7f2770fe;hpb=1d0e3c98840d89ec0a4dc521663320632a8516e7 diff --git a/src/libsystemd-bus/bus-kernel.c b/src/libsystemd-bus/bus-kernel.c index b63fe56c4..09e084a02 100644 --- a/src/libsystemd-bus/bus-kernel.c +++ b/src/libsystemd-bus/bus-kernel.c @@ -775,7 +775,7 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) { case KDBUS_ITEM_CMDLINE: m->creds.cmdline = d->str; - m->creds.cmdline_length = l; + m->creds.cmdline_size = l; m->creds.mask |= SD_BUS_CREDS_CMDLINE & bus->creds_mask; break; @@ -800,9 +800,14 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) { destination = d->str; break; + case KDBUS_ITEM_NAMES: + m->creds.well_known_names = d->str; + m->creds.well_known_names_size = l; + m->creds.mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES & bus->creds_mask; + break; + case KDBUS_ITEM_FDS: case KDBUS_ITEM_SECLABEL: - case KDBUS_ITEM_NAMES: break; default: @@ -818,7 +823,8 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) { m->sender = "org.freedesktop.DBus"; else { snprintf(m->sender_buffer, sizeof(m->sender_buffer), ":1.%llu", (unsigned long long) k->src_id); - m->sender = m->sender_buffer; + m->sender = m->creds.unique_name = m->sender_buffer; + m->creds.mask |= SD_BUS_CREDS_UNIQUE_NAME & bus->creds_mask; } if (!m->destination) { @@ -1029,11 +1035,14 @@ int kdbus_translate_attach_flags(uint64_t mask, uint64_t *kdbus_mask) { if (mask & (SD_BUS_CREDS_AUDIT_SESSION_ID|SD_BUS_CREDS_AUDIT_LOGIN_UID)) m |= KDBUS_ATTACH_AUDIT; + if (mask & SD_BUS_CREDS_WELL_KNOWN_NAMES) + m |= KDBUS_ATTACH_NAMES; + *kdbus_mask = m; return 0; } -int bus_kernel_create(const char *name, char **s) { +int bus_kernel_create_bus(const char *name, char **s) { struct kdbus_cmd_bus_make *make; struct kdbus_item *n; int fd; @@ -1079,3 +1088,47 @@ int bus_kernel_create(const char *name, char **s) { return fd; } + +int bus_kernel_create_namespace(const char *name, char **s) { + struct kdbus_cmd_ns_make *make; + struct kdbus_item *n; + int fd; + + assert(name); + assert(s); + + fd = open("/dev/kdbus/control", O_RDWR|O_NOCTTY|O_CLOEXEC); + if (fd < 0) + return -errno; + + make = alloca0(ALIGN8(offsetof(struct kdbus_cmd_ns_make, items) + + offsetof(struct kdbus_item, str) + + strlen(name) + 1)); + + n = make->items; + strcpy(n->str, name); + n->size = offsetof(struct kdbus_item, str) + strlen(n->str) + 1; + n->type = KDBUS_MAKE_NAME; + + make->size = ALIGN8(offsetof(struct kdbus_cmd_ns_make, items) + n->size); + make->flags = KDBUS_MAKE_POLICY_OPEN; + + if (ioctl(fd, KDBUS_CMD_NS_MAKE, make) < 0) { + close_nointr_nofail(fd); + return -errno; + } + + if (s) { + char *p; + + p = strappend("/dev/kdbus/", name); + if (!p) { + close_nointr_nofail(fd); + return -ENOMEM; + } + + *s = p; + } + + return fd; +}