# #
#############################################################################*/
+#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;
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,
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;
+}
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);
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 */