From: Michael Tremer Date: Fri, 14 Apr 2023 11:25:56 +0000 (+0000) Subject: networkd: Implement ListZones bus command X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b4faae0abf9bd02b4aa02660a85d58497ad8b07b;p=network.git networkd: Implement ListZones bus command Signed-off-by: Michael Tremer --- diff --git a/src/networkd/daemon-bus.c b/src/networkd/daemon-bus.c index 93a04110..7620eed8 100644 --- a/src/networkd/daemon-bus.c +++ b/src/networkd/daemon-bus.c @@ -18,12 +18,16 @@ # # #############################################################################*/ +#include + #include #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, diff --git a/src/networkd/daemon.c b/src/networkd/daemon.c index c67c7598..925b2070 100644 --- a/src/networkd/daemon.c +++ b/src/networkd/daemon.c @@ -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; diff --git a/src/networkd/daemon.h b/src/networkd/daemon.h index 6f4c2174..ce9a6602 100644 --- a/src/networkd/daemon.h +++ b/src/networkd/daemon.h @@ -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 */ diff --git a/src/networkd/zones.c b/src/networkd/zones.c index ea0d8dec..521da51d 100644 --- a/src/networkd/zones.c +++ b/src/networkd/zones.c @@ -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; +} diff --git a/src/networkd/zones.h b/src/networkd/zones.h index c887bd02..019955e7 100644 --- a/src/networkd/zones.h +++ b/src/networkd/zones.h @@ -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 */