]> git.ipfire.org Git - network.git/commitdiff
networkd: bus: Create a unified function to register an interface
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 1 Feb 2023 23:04:27 +0000 (23:04 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 1 Feb 2023 23:04:27 +0000 (23:04 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/networkd/bus.c
src/networkd/bus.h

index 5224aaa64a47d5a386817a2d8dd3e26515a18a1e..eab123ce38e3ace39805ba56ac99d88bdd88b463 100644 (file)
@@ -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;
+}
index 90c1556c4e24cf5262554759afe57cfcac46761e..05846e51e4323efff58fc11f94f56fb8c63a4b7f 100644 (file)
@@ -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"
 
 
 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 */