From: Michael Tremer Date: Wed, 1 Feb 2023 23:04:27 +0000 (+0000) Subject: networkd: bus: Create a unified function to register an interface X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9806a600f4cdf68aa2c0e509e40be6ed9ad08b44;p=network.git networkd: bus: Create a unified function to register an interface Signed-off-by: Michael Tremer --- diff --git a/src/networkd/bus.c b/src/networkd/bus.c index 5224aaa6..eab123ce 100644 --- a/src/networkd/bus.c +++ b/src/networkd/bus.c @@ -38,6 +38,19 @@ static int nw_bus_daemon_reload(sd_bus_message* m, void* data, sd_bus_error* err return sd_bus_reply_method_return(m, NULL); } +static const sd_bus_vtable daemon_vtable[] = { + SD_BUS_VTABLE_START(0), + SD_BUS_METHOD("Reload", SD_BUS_NO_ARGS, SD_BUS_NO_RESULT, + nw_bus_daemon_reload, SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_VTABLE_END, +}; + +const struct nw_bus_implementation daemon_implementation = { + .path = "/org/ipfire/network1", + .interface = "org.ipfire.network1", + .vtables = BUS_VTABLES(daemon_vtable), +}; + static int nw_bus_on_connect(sd_bus_message* m, void* data, sd_bus_error* error) { struct nw_daemon* daemon = (struct nw_daemon*)data; @@ -46,13 +59,6 @@ static int nw_bus_on_connect(sd_bus_message* m, void* data, sd_bus_error* error) return 0; } -static const sd_bus_vtable daemon_vtable[] = { - SD_BUS_VTABLE_START(0), - SD_BUS_METHOD("Reload", SD_BUS_NO_ARGS, SD_BUS_NO_RESULT, - nw_bus_daemon_reload, SD_BUS_VTABLE_UNPRIVILEGED), - SD_BUS_VTABLE_END, -}; - int nw_bus_connect(sd_bus* bus, sd_event* loop) { int r; @@ -117,16 +123,13 @@ int nw_bus_connect(sd_bus* bus, sd_event* loop) { return 1; } - // Register any functions - r = sd_bus_add_object_vtable(bus, NULL, - NETWORKD_BUS_OBJECT_PATH, NETWORKD_BUS_INTERFACE_NAME, daemon_vtable, NULL); - if (r < 0) { - ERROR("Could not add object vtable: %s\n", strerror(-r)); - return 1; - } + // Register the implementation + r = nw_bus_register_implementation(bus, &daemon_implementation, NULL); + if (r) + return r; // Request interface name - r = sd_bus_request_name_async(bus, NULL, NETWORKD_BUS_INTERFACE_NAME, 0, NULL, NULL); + r = sd_bus_request_name_async(bus, NULL, "org.ipfire.network1", 0, NULL, NULL); if (r < 0) { ERROR("Could not request bus name: %s\n", strerror(-r)); return 1; @@ -149,3 +152,22 @@ int nw_bus_connect(sd_bus* bus, sd_event* loop) { return 0; } + +int nw_bus_register_implementation(sd_bus* bus, + const struct nw_bus_implementation* impl, void* data) { + int r; + + DEBUG("Registering bus object implementation for path=%s iface=%s\n", + impl->path, impl->interface); + + for (const sd_bus_vtable** vtable = impl->vtables; vtable && *vtable; vtable++) { + r = sd_bus_add_object_vtable(bus, NULL, impl->path, impl->interface, *vtable, data); + if (r < 0) { + ERROR("Could not register bus path %s with interface %s: %m\n", + impl->path, impl->interface); + return 1; + } + } + + return 0; +} diff --git a/src/networkd/bus.h b/src/networkd/bus.h index 90c1556c..05846e51 100644 --- a/src/networkd/bus.h +++ b/src/networkd/bus.h @@ -22,8 +22,6 @@ #define NETWORKD_BUS_H #define NETWORKD_BUS_DESCRIPTION "networkd" -#define NETWORKD_BUS_OBJECT_PATH "/org/ipfire/network1" -#define NETWORKD_BUS_INTERFACE_NAME "org.ipfire.network1" #define DEFAULT_SYSTEM_BUS_ADDRESS "unix:path=/run/dbus/system_bus_socket" @@ -32,4 +30,16 @@ int nw_bus_connect(sd_bus* bus, sd_event* loop); +struct nw_bus_implementation { + const char* path; + const char* interface; + + const sd_bus_vtable** vtables; +}; + +#define BUS_VTABLES(...) ((const sd_bus_vtable* []){ __VA_ARGS__, NULL }) + +int nw_bus_register_implementation(sd_bus* bus, + const struct nw_bus_implementation* impl, void* data); + #endif /* NETWORKD_BUS_H */