From b1851ada931ef2b7a56a4557fef47721adb17e51 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Sat, 26 Sep 2015 18:02:00 +0200 Subject: [PATCH] ratbagd: split dbus handling from object handling Make sure our dbus callbacks to not contain any logic themselves. They should be simple wrappers around our internal object handling. This also makes use of the new sd-bus pat helpers, to-be-released with systemd-v227 next week. Signed-off-by: David Herrmann --- configure.ac | 2 +- src/ratbagd-device.c | 96 ++++++++++++++++++++++++-------------------- src/ratbagd.c | 2 +- src/ratbagd.h | 6 ++- 4 files changed, 58 insertions(+), 48 deletions(-) diff --git a/configure.ac b/configure.ac index 01362d9f..cb647f0d 100644 --- a/configure.ac +++ b/configure.ac @@ -128,7 +128,7 @@ m4_pattern_forbid([^_?PKG_[A-Z_]+$],[*** pkg.m4 missing, please install pkg-conf # dependencies PKG_CHECK_MODULES([LIBUDEV], [libudev]) -PKG_CHECK_MODULES([LIBSYSTEMD], [libsystemd >= 225]) +PKG_CHECK_MODULES([LIBSYSTEMD], [libsystemd >= 227]) PKG_CHECK_MODULES([LIBRATBAG], [libratbag]) # ------------------------------------------------------------------------------ diff --git a/src/ratbagd-device.c b/src/ratbagd-device.c index 952cad19..30d4fb71 100644 --- a/src/ratbagd-device.c +++ b/src/ratbagd-device.c @@ -45,7 +45,7 @@ struct ratbagd_device { #define ratbagd_device_from_node(_ptr) \ rbnode_of((_ptr), struct ratbagd_device, node) -static int ratbagd_device_find(sd_bus *bus, +static int ratbagd_find_device(sd_bus *bus, const char *path, const char *interface, void *userdata, @@ -57,12 +57,13 @@ static int ratbagd_device_find(sd_bus *bus, struct ratbagd_device *device; int r; - /* decodes the suffix into @name, returns 1 if valid */ - r = sd_bus_path_decode(path, "/org/freedesktop/ratbag1/device", &name); + r = sd_bus_path_decode_many(path, + "/org/freedesktop/ratbag1/device/%", + &name); if (r <= 0) return r; - device = ratbagd_find_device(ctx, name); + device = ratbagd_device_lookup(ctx, name); if (!device) return 0; @@ -70,46 +71,17 @@ static int ratbagd_device_find(sd_bus *bus, return 1; } -static int ratbagd_device_list(sd_bus *bus, - const char *path, - void *userdata, - char ***nodes, - sd_bus_error *error) +static int ratbagd_list_devices(sd_bus *bus, + const char *path, + void *userdata, + char ***paths, + sd_bus_error *error) { struct ratbagd *ctx = userdata; - struct ratbagd_device *device; - char **devices, **pos; - RBNode *node; int r; - devices = calloc(ctx->n_devices + 1, sizeof(char *)); - if (!devices) - return -ENOMEM; - - pos = devices; - - for (node = rbtree_first(&ctx->device_map); - node; - node = rbnode_next(node)) { - device = ratbagd_device_from_node(node); - - r = sd_bus_path_encode("/org/freedesktop/ratbag1/device", - device->name, - pos++); - if (r < 0) - goto error; - } - - *pos = NULL; - - *nodes = devices; - return 1; - -error: - for (pos = devices; *pos; ++pos) - free(*pos); - free(devices); - return r; + r = ratbagd_device_list(ctx, paths); + return r < 0 ? r : 1; } static int ratbagd_device_get_description(sd_bus *bus, @@ -274,7 +246,7 @@ int ratbagd_init_device(struct ratbagd *ctx) "/org/freedesktop/ratbag1/device", "org.freedesktop.ratbag1.Device", ratbagd_device_vtable, - ratbagd_device_find, + ratbagd_find_device, ctx); if (r < 0) return r; @@ -282,7 +254,7 @@ int ratbagd_init_device(struct ratbagd *ctx) r = sd_bus_add_node_enumerator(ctx->bus, NULL, "/org/freedesktop/ratbag1/device", - ratbagd_device_list, + ratbagd_list_devices, ctx); if (r < 0) return r; @@ -290,8 +262,8 @@ int ratbagd_init_device(struct ratbagd *ctx) return 0; } -struct ratbagd_device *ratbagd_find_device(struct ratbagd *ctx, - const char *name) +struct ratbagd_device *ratbagd_device_lookup(struct ratbagd *ctx, + const char *name) { struct ratbagd_device *device; RBNode *node; @@ -314,3 +286,39 @@ struct ratbagd_device *ratbagd_find_device(struct ratbagd *ctx, return NULL; } + +int ratbagd_device_list(struct ratbagd *ctx, char ***paths) +{ + struct ratbagd_device *device; + char **devices, **pos; + RBNode *node; + int r; + + devices = calloc(ctx->n_devices + 1, sizeof(char *)); + if (!devices) + return -ENOMEM; + + pos = devices; + + for (node = rbtree_first(&ctx->device_map); + node; + node = rbnode_next(node)) { + device = ratbagd_device_from_node(node); + + r = sd_bus_path_encode_many(pos++, + "/org/freedesktop/ratbag1/device/%", + device->name); + if (r < 0) + goto error; + } + + *pos = NULL; + *paths = devices; + return 1; + +error: + for (pos = devices; *pos; ++pos) + free(*pos); + free(devices); + return r; +} diff --git a/src/ratbagd.c b/src/ratbagd.c index 437d98ce..584ad2ab 100644 --- a/src/ratbagd.c +++ b/src/ratbagd.c @@ -55,7 +55,7 @@ static void ratbagd_process_device(struct ratbagd *ctx, if (!name || !startswith(name, "event")) return; - device = ratbagd_find_device(ctx, name); + device = ratbagd_device_lookup(ctx, name); if (streq_ptr("remove", udev_device_get_action(udevice))) { /* device was removed, unlink it and destroy our context */ diff --git a/src/ratbagd.h b/src/ratbagd.h index 687e1aad..83bcacb9 100644 --- a/src/ratbagd.h +++ b/src/ratbagd.h @@ -54,6 +54,10 @@ void ratbagd_device_unlink(struct ratbagd_device *device); DEFINE_TRIVIAL_CLEANUP_FUNC(struct ratbagd_device *, ratbagd_device_free); +struct ratbagd_device *ratbagd_device_lookup(struct ratbagd *ctx, + const char *name); +int ratbagd_device_list(struct ratbagd *ctx, char ***paths); + /* * Context */ @@ -70,5 +74,3 @@ struct ratbagd { }; int ratbagd_init_device(struct ratbagd *ctx); -struct ratbagd_device *ratbagd_find_device(struct ratbagd *ctx, - const char *name);