chiark / gitweb /
nspawn: set up a kdbus namespace when starting a container
[elogind.git] / src / libsystemd-bus / bus-kernel.c
index b63fe56c41a2a80fbdec17138ec2812846bf84ad..09e084a02f17f31dd652082ca39a96319f4184d1 100644 (file)
@@ -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;
+}