]> git.ipfire.org Git - people/ms/network.git/blobdiff - src/networkd/daemon-bus.c
ports: Implement listing ports over DBus
[people/ms/network.git] / src / networkd / daemon-bus.c
index 7620eed8f152fbd3f6d86af515a367be7b11376b..4de8c0fb35a6c2455f9262bf50bccdaf76257561 100644 (file)
@@ -39,6 +39,55 @@ 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_ports(nw_daemon* daemon, nw_port* port, void* data) {
+       sd_bus_message* reply = (sd_bus_message*)data;
+       int r;
+
+       // Fetch port name
+       const char* name = nw_port_name(port);
+
+       // Fetch bus path
+       char* path = nw_port_bus_path(port);
+
+       r = sd_bus_message_append(reply, "(so)", name, path);
+
+       free(path);
+
+       return r;
+}
+
+static int nw_daemon_bus_list_ports(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_ports_walk(daemon, __nw_daemon_bus_list_ports, 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 int __nw_daemon_bus_list_zones(nw_daemon* daemon, nw_zone* zone, void* data) {
        sd_bus_message* reply = (sd_bus_message*)data;
        int r;
@@ -90,6 +139,8 @@ ERROR:
 
 static const sd_bus_vtable daemon_vtable[] = {
        SD_BUS_VTABLE_START(0),
+       SD_BUS_METHOD_WITH_ARGS("ListPorts", SD_BUS_NO_ARGS, SD_BUS_RESULT("a(so)", links),
+               nw_daemon_bus_list_ports, SD_BUS_VTABLE_UNPRIVILEGED),
        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,