X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd-bus%2Fbus-control.c;h=b9700068b6acaf20847c94e90e606c00556d8db5;hp=47e91118a43905db6c36a869dbbc4dde35190e49;hb=f8e11cda5316055c381f45bd30843c1b54cd323b;hpb=80514f9c9bb86dbba761e4b026e5d62156ea112c diff --git a/src/libsystemd-bus/bus-control.c b/src/libsystemd-bus/bus-control.c index 47e91118a..b9700068b 100644 --- a/src/libsystemd-bus/bus-control.c +++ b/src/libsystemd-bus/bus-control.c @@ -203,6 +203,7 @@ static int kernel_get_list(sd_bus *bus, uint64_t flags, char ***x) { struct kdbus_cmd_name_list cmd = {}; struct kdbus_name_list *name_list; struct kdbus_cmd_name *name; + uint64_t previous_id = 0; int r; /* Caller will free half-constructed list on failure... */ @@ -217,11 +218,7 @@ static int kernel_get_list(sd_bus *bus, uint64_t flags, char ***x) { KDBUS_ITEM_FOREACH(name, name_list, names) { - if (name->size > sizeof(*name)) { - r = strv_extend(x, name->name); - if (r < 0) - return -ENOMEM; - } else { + if ((flags & KDBUS_NAME_LIST_UNIQUE) && name->id != previous_id) { char *n; if (asprintf(&n, ":1.%llu", (unsigned long long) name->id) < 0) @@ -232,8 +229,15 @@ static int kernel_get_list(sd_bus *bus, uint64_t flags, char ***x) { free(n); return -ENOMEM; } + + previous_id = name->id; } + if (name->size > sizeof(*name)) { + r = strv_extend(x, name->name); + if (r < 0) + return -ENOMEM; + } } r = ioctl(sd_bus_get_fd(bus), KDBUS_CMD_FREE, &cmd.offset);