src/networkctl/command.c \
src/networkctl/command.h \
src/networkctl/main.c \
+ src/networkctl/port.c \
+ src/networkctl/port.h \
src/networkctl/zone.c \
src/networkctl/zone.h
#include <systemd/sd-bus.h>
#include "command.h"
+#include "port.h"
#include "zone.h"
static int networkctl_status(sd_bus* bus, int argc, char* argv[]) {
static int networkctl_main(sd_bus* bus, int argc, char* argv[]) {
static const struct command commands[] = {
+ { "port", 0, networkctl_port },
{ "status", 0, networkctl_status },
{ "zone", 0, networkctl_zone },
{ NULL },
--- /dev/null
+/*#############################################################################
+# #
+# IPFire.org - A linux based firewall #
+# Copyright (C) 2023 IPFire Network Development Team #
+# #
+# This program is free software: you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation, either version 3 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program. If not, see <http://www.gnu.org/licenses/>. #
+# #
+#############################################################################*/
+
+#include <systemd/sd-bus.h>
+
+#include "command.h"
+#include "port.h"
+
+typedef int (*networkctl_port_walk_callback)
+ (sd_bus* bus, const char* path, const char* name, void* data);
+
+static int networkctl_port_walk(sd_bus* bus,
+ networkctl_port_walk_callback callback, void* data) {
+ sd_bus_message* reply = NULL;
+ sd_bus_error error = SD_BUS_ERROR_NULL;
+ int r;
+
+ // Call Listports
+ r = sd_bus_call_method(bus, "org.ipfire.network1", "/org/ipfire/network1",
+ "org.ipfire.network1", "ListPorts", &error, &reply, "");
+ if (r < 0) {
+ fprintf(stderr, "Listports call failed: %m\n");
+ goto ERROR;
+ }
+
+ const char* name = NULL;
+ const char* path = NULL;
+
+ // Open the container
+ r = sd_bus_message_enter_container(reply, 'a', "(so)");
+ if (r < 0) {
+ fprintf(stderr, "Could not open container: %m\n");
+ goto ERROR;
+ }
+
+ // Iterate over all ports
+ for (;;) {
+ r = sd_bus_message_read(reply, "(so)", &name, &path);
+ if (r < 0)
+ goto ERROR;
+
+ // Break if we reached the end of the container
+ if (r == 0)
+ break;
+
+ // Call the callback
+ r = callback(bus, path, name, data);
+ if (r)
+ goto ERROR;
+ }
+
+ // Close the container
+ sd_bus_message_exit_container(reply);
+
+ERROR:
+ if (reply)
+ sd_bus_message_unref(reply);
+ sd_bus_error_free(&error);
+
+ return r;
+}
+
+static int __networkctl_port_list(sd_bus* bus, const char* path, const char* name, void* data) {
+ printf("%s\n", name);
+
+ return 0;
+}
+
+static int networkctl_port_list(sd_bus* bus, int argc, char* argv[]) {
+ return networkctl_port_walk(bus, __networkctl_port_list, NULL);
+}
+
+int networkctl_port(sd_bus* bus, int argc, char* argv[]) {
+ static const struct command commands[] = {
+ { "list", 0, networkctl_port_list },
+ { NULL },
+ };
+
+ return command_dispatch(bus, commands, argc, argv);
+}
--- /dev/null
+/*#############################################################################
+# #
+# IPFire.org - A linux based firewall #
+# Copyright (C) 2023 IPFire Network Development Team #
+# #
+# This program is free software: you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation, either version 3 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program. If not, see <http://www.gnu.org/licenses/>. #
+# #
+#############################################################################*/
+
+#ifndef NETWORKCTL_PORT_H
+#define NETWORKCTL_PORT_H
+
+int networkctl_port(sd_bus* bus, int argc, char* argv[]);
+
+#endif /* NETWORKCTL_PORT_H */
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;
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,