[systemd-devel] [PATCH 3/7] libsystemd-bus: add kdbus support for sd_bus_list_names()
Lukasz Skalski
l.skalski at partner.samsung.com
Wed Nov 27 07:59:31 PST 2013
My 2 cents inline.
On 11/15/2013 07:32 PM, Daniel Mack wrote:
> kdbus will tell us the minimum buffer size it needs in case the default
> 8kb buffer doesn't suffice.
> ---
> src/libsystemd-bus/bus-control.c | 100 ++++++++++++++++++++++++++-------------
> 1 file changed, 68 insertions(+), 32 deletions(-)
>
> diff --git a/src/libsystemd-bus/bus-control.c b/src/libsystemd-bus/bus-control.c
> index 5c9e746..562513b 100644
> --- a/src/libsystemd-bus/bus-control.c
> +++ b/src/libsystemd-bus/bus-control.c
> @@ -180,43 +180,79 @@ _public_ int sd_bus_list_names(sd_bus *bus, char ***l) {
> if (bus_pid_changed(bus))
> return -ECHILD;
>
> - r = sd_bus_call_method(
> - bus,
> - "org.freedesktop.DBus",
> - "/",
> - "org.freedesktop.DBus",
> - "ListNames",
> - NULL,
> - &reply1,
> - NULL);
> - if (r < 0)
> - return r;
> + if (bus->is_kernel) {
> + _cleanup_free_ struct kdbus_cmd_names *names = NULL;
> + struct kdbus_cmd_name *name;
> + size_t size;
> +
> + /* assume 8k size first. If that doesn't suffice, kdbus will tell us
> + * how big the buffer needs to be. */
> + size = 8192;
> +
> +retry:
> + names = realloc(names, size);
> + if (!names)
> + return log_oom();
> +
> + names->size = size;
+ names->flags=KDBUS_NAME_LIST_UNIQUE_NAMES;
"ListNames" should returns a list of all (both well-known and unique
names) currently-owned names on the bus.
> +
> + r = ioctl(sd_bus_get_fd(bus), KDBUS_CMD_NAME_LIST, names);
> + if (r < 0) {
> + if (errno == ENOBUFS && size != names->size) {
> + size = names->size;
> + goto retry;
> + }
>
> - r = sd_bus_call_method(
> - bus,
> - "org.freedesktop.DBus",
> - "/",
> - "org.freedesktop.DBus",
> - "ListActivatableNames",
> - NULL,
> - &reply2,
> - NULL);
> - if (r < 0)
> - return r;
> + return -errno;
> + }
>
> - r = bus_message_read_strv_extend(reply1, &x);
> - if (r < 0) {
> - strv_free(x);
> - return r;
> - }
> + KDBUS_PART_FOREACH(name, names, names) {
> + r = strv_extend(&x, name->name);
> + if (r < 0)
> + return log_oom();
> + }
>
> - r = bus_message_read_strv_extend(reply2, &x);
> - if (r < 0) {
> - strv_free(x);
> - return r;
> + *l = x;
> + } else {
> + r = sd_bus_call_method(
> + bus,
> + "org.freedesktop.DBus",
> + "/",
> + "org.freedesktop.DBus",
> + "ListNames",
> + NULL,
> + &reply1,
> + NULL);
> + if (r < 0)
> + return r;
> +
> + r = sd_bus_call_method(
> + bus,
> + "org.freedesktop.DBus",
> + "/",
> + "org.freedesktop.DBus",
> + "ListActivatableNames",
> + NULL,
> + &reply2,
> + NULL);
> + if (r < 0)
> + return r;
> +
> + r = bus_message_read_strv_extend(reply1, &x);
> + if (r < 0) {
> + strv_free(x);
> + return r;
> + }
> +
> + r = bus_message_read_strv_extend(reply2, &x);
> + if (r < 0) {
> + strv_free(x);
> + return r;
> + }
> +
> + *l = strv_uniq(x);
> }
>
> - *l = strv_uniq(x);
> return 0;
> }
>
>
--
Lukasz Skalski
Samsung R&D Institute Poland
Samsung Electronics
l.skalski at partner.samsung.com
More information about the systemd-devel
mailing list