chiark / gitweb /
shell-completion: busctl
[elogind.git] / src / libsystemd-bus / bus-control.c
index d98a4ddf2594188a8deab276ff97f28f89a886e3..186724e8ad1f7723ef48cb5986028eb3bba89312 100644 (file)
@@ -110,10 +110,10 @@ static int bus_request_name_dbus1(sd_bus *bus, const char *name, unsigned flags)
                 return -EEXIST;
         else if (ret == BUS_NAME_IN_QUEUE)
                 return 0;
-        else
-                return -EIO;
+        else if (ret == BUS_NAME_PRIMARY_OWNER)
+                return 1;
 
-        return 1;
+        return -EIO;
 }
 
 _public_ int sd_bus_request_name(sd_bus *bus, const char *name, unsigned flags) {
@@ -208,7 +208,6 @@ static int kernel_get_list(sd_bus *bus, uint64_t flags, char ***x) {
 
         /* Caller will free half-constructed list on failure... */
 
-        cmd.size = sizeof(struct kdbus_cmd_name_list);
         cmd.flags = flags;
 
         r = ioctl(bus->input_fd, KDBUS_CMD_NAME_LIST, &cmd);
@@ -364,6 +363,7 @@ static int bus_get_owner_kdbus(
                 cmd = alloca0(size);
                 strcpy(cmd->name, name);
         }
+        cmd->flags = KDBUS_ATTACH_NAMES;
 
         cmd->size = size;
         r = ioctl(bus->input_fd, KDBUS_CMD_CONN_INFO, cmd);
@@ -504,14 +504,11 @@ static int bus_get_owner_kdbus(
                         }
                         break;
 
-                case KDBUS_ITEM_NAMES:
+                case KDBUS_ITEM_NAME:
                         if (mask & SD_BUS_CREDS_WELL_KNOWN_NAMES) {
-                                c->well_known_names_size = item->size - KDBUS_PART_HEADER_SIZE;
-                                c->well_known_names = memdup(item->data, c->well_known_names_size);
-                                if (!c->well_known_names) {
-                                        r = -ENOMEM;
+                                r = strv_extend(&c->well_known_names, item->name.name);
+                                if (r < 0)
                                         goto fail;
-                                }
 
                                 c->mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES;
                         }