]> git.ipfire.org Git - network.git/commitdiff
networkd: Implement ListZones bus command
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 14 Apr 2023 11:25:56 +0000 (11:25 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 14 Apr 2023 11:25:56 +0000 (11:25 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/networkd/daemon-bus.c
src/networkd/daemon.c
src/networkd/daemon.h
src/networkd/zones.c
src/networkd/zones.h

index 93a041105ce848e484a5e23754d9cac7f7a62cf6..7620eed8f152fbd3f6d86af515a367be7b11376b 100644 (file)
 #                                                                             #
 #############################################################################*/
 
+#include <stdlib.h>
+
 #include <systemd/sd-bus.h>
 
 #include "bus.h"
 #include "daemon.h"
+#include "logging.h"
 #include "port-bus.h"
 #include "zone-bus.h"
+#include "zones.h"
 
 static int nw_daemon_bus_reload(sd_bus_message* m, void* data, sd_bus_error* error) {
        nw_daemon* daemon = (nw_daemon*)data;
@@ -35,8 +39,59 @@ static int nw_daemon_bus_reload(sd_bus_message* m, void* data, sd_bus_error* err
        return sd_bus_reply_method_return(m, NULL);
 }
 
+static int __nw_daemon_bus_list_zones(nw_daemon* daemon, nw_zone* zone, void* data) {
+       sd_bus_message* reply = (sd_bus_message*)data;
+       int r;
+
+       // Fetch zone name
+       const char* name = nw_zone_name(zone);
+
+       // Fetch bus path
+       char* path = nw_zone_bus_path(zone);
+
+       r = sd_bus_message_append(reply, "(so)", name, path);
+
+       free(path);
+
+       return r;
+}
+
+static int nw_daemon_bus_list_zones(sd_bus_message* m, void* data, sd_bus_error* error) {
+       nw_daemon* daemon = (nw_daemon*)data;
+       sd_bus_message* reply = NULL;
+       int r;
+
+       // Form a reply message
+       r = sd_bus_message_new_method_return(m, &reply);
+       if (r < 0)
+               goto ERROR;
+
+       r = sd_bus_message_open_container(reply, 'a', "(so)");
+       if (r < 0)
+               goto ERROR;
+
+       r = nw_daemon_zones_walk(daemon, __nw_daemon_bus_list_zones, reply);
+       if (r < 0)
+               goto ERROR;
+
+       r = sd_bus_message_close_container(reply);
+       if (r < 0)
+               goto ERROR;
+
+       // Send the reply
+       r = sd_bus_send(NULL, reply, NULL);
+
+ERROR:
+       if (reply)
+               sd_bus_message_unref(reply);
+
+       return r;
+}
+
 static const sd_bus_vtable daemon_vtable[] = {
        SD_BUS_VTABLE_START(0),
+       SD_BUS_METHOD_WITH_ARGS("ListZones", SD_BUS_NO_ARGS, SD_BUS_RESULT("a(so)", links),
+               nw_daemon_bus_list_zones, SD_BUS_VTABLE_UNPRIVILEGED),
        SD_BUS_METHOD("Reload", SD_BUS_NO_ARGS, SD_BUS_NO_RESULT,
                nw_daemon_bus_reload, SD_BUS_VTABLE_UNPRIVILEGED),
        SD_BUS_VTABLE_END,
index c67c7598134ccbb9b776ce9ddeb2ce63dd5494b0..925b2070c2f3a74cdaf5e004ca0f1c19709f3e9a 100644 (file)
@@ -519,6 +519,13 @@ nw_zones* nw_daemon_zones(nw_daemon* daemon) {
        return nw_zones_ref(daemon->zones);
 }
 
+int nw_daemon_zones_walk(nw_daemon* daemon, nw_zones_walk_callback callback, void* data) {
+       if (!daemon->zones)
+               return 0;
+
+       return nw_zones_walk(daemon->zones, callback, data);
+}
+
 nw_zone* nw_daemon_get_zone_by_name(nw_daemon* daemon, const char* name) {
        if (!daemon->zones)
                return NULL;
index 6f4c21747732219af2b7846bf1e14959ece7f5c3..ce9a66023d1e0c802855bee28cbe8d1f9f40a72c 100644 (file)
@@ -66,6 +66,7 @@ nw_port* nw_daemon_get_port_by_name(nw_daemon* daemon, const char* name);
        Zones
 */
 nw_zones* nw_daemon_zones(nw_daemon* daemon);
+int nw_daemon_zones_walk(nw_daemon* daemon, nw_zones_walk_callback callback, void* data);
 nw_zone* nw_daemon_get_zone_by_name(nw_daemon* daemon, const char* name);
 
 #endif /* NETWORKD_DAEMON_H */
index ea0d8dec74ed335aeb858fae971604ebefe80b71..521da51d6b8c0c96544b620b38d93b09a82499ca 100644 (file)
@@ -239,3 +239,16 @@ ERROR:
 
        return 1;
 }
+
+int nw_zones_walk(nw_zones* zones, nw_zones_walk_callback callback, void* data) {
+       struct nw_zones_entry* entry = NULL;
+       int r;
+
+       STAILQ_FOREACH(entry, &zones->entries, nodes) {
+               r = callback(zones->daemon, entry->zone, data);
+               if (r)
+                       return r;
+       }
+
+       return 0;
+}
index c887bd02d32c64f432d8b617d576395275161d2c..019955e7d3d7d626a1290b2426afc15c270f3e39 100644 (file)
@@ -23,6 +23,8 @@
 
 typedef struct nw_zones nw_zones;
 
+typedef int (*nw_zones_walk_callback)(nw_daemon* daemon, nw_zone* zone, void* data);
+
 #include "daemon.h"
 
 int nw_zones_create(nw_zones** zones, nw_daemon* daemon);
@@ -40,4 +42,6 @@ nw_zone* nw_zones_get_by_name(nw_zones* zones, const char* name);
 
 int nw_zones_bus_paths(nw_zones* zones, char*** paths);
 
+int nw_zones_walk(nw_zones* zones, nw_zones_walk_callback callback, void* data);
+
 #endif /* NETWORKD_ZONES_H */