X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-bus%2Fbus-kernel.c;h=fb852bd730a41b44016f623a84f265cee57cec79;hb=f9638db8de2f915a5c5f6e4b7292494168eb4141;hp=51e882c73d04aaa849348d6e4075ab65d12fadd7;hpb=49b832c5b810f4d8bb59249ff25472fd670503dc;p=elogind.git diff --git a/src/libsystemd-bus/bus-kernel.c b/src/libsystemd-bus/bus-kernel.c index 51e882c73..fb852bd73 100644 --- a/src/libsystemd-bus/bus-kernel.c +++ b/src/libsystemd-bus/bus-kernel.c @@ -1042,7 +1042,7 @@ int kdbus_translate_attach_flags(uint64_t mask, uint64_t *kdbus_mask) { 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; @@ -1074,6 +1074,13 @@ int bus_kernel_create(const char *name, char **s) { return -errno; } + /* The higher 32bit of the flags field are considered + * 'incompatible flags'. Refuse them all for now. */ + if (make->flags > 0xFFFFFFFFULL) { + close_nointr_nofail(fd); + return -ENOTSUP; + } + if (s) { char *p; @@ -1088,3 +1095,54 @@ 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 | KDBUS_MAKE_ACCESS_WORLD; + + if (ioctl(fd, KDBUS_CMD_NS_MAKE, make) < 0) { + close_nointr_nofail(fd); + return -errno; + } + + /* The higher 32bit of the flags field are considered + * 'incompatible flags'. Refuse them all for now. */ + if (make->flags > 0xFFFFFFFFULL) { + close_nointr_nofail(fd); + return -ENOTSUP; + } + + if (s) { + char *p; + + p = strappend("/dev/kdbus/ns/", name); + if (!p) { + close_nointr_nofail(fd); + return -ENOMEM; + } + + *s = p; + } + + return fd; +}