From 3175fcdec5d748e8db85a3e7fe1cb67f5f6a865d Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Sun, 8 Feb 2015 13:27:56 +0100 Subject: [PATCH] networkd: add basic org.freedesktop.network1.Network interface --- Makefile.am | 1 + src/network/networkd-manager.c | 8 ++ src/network/networkd-network-bus.c | 128 +++++++++++++++++++++++++++++ src/network/networkd.h | 7 +- 4 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 src/network/networkd-network-bus.c diff --git a/Makefile.am b/Makefile.am index 3dc5fa024..1ab2e796b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -5589,6 +5589,7 @@ libsystemd_networkd_core_la_SOURCES = \ src/network/networkd-dhcp4.c \ src/network/networkd-dhcp6.c \ src/network/networkd-network.c \ + src/network/networkd-network-bus.c \ src/network/networkd-address.c \ src/network/networkd-route.c \ src/network/networkd-manager.c \ diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index e2c8a23e0..4617f1186 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -174,6 +174,14 @@ int manager_connect_bus(Manager *m) { if (r < 0) return log_error_errno(r, "Failed to add link enumerator: %m"); + r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/network1/network", "org.freedesktop.network1.Network", network_vtable, network_object_find, m); + if (r < 0) + return log_error_errno(r, "Failed to add network object vtable: %m"); + + r = sd_bus_add_node_enumerator(m->bus, NULL, "/org/freedesktop/network1/network", network_node_enumerator, m); + if (r < 0) + return log_error_errno(r, "Failed to add network enumerator: %m"); + r = sd_bus_request_name(m->bus, "org.freedesktop.network1", 0); if (r < 0) return log_error_errno(r, "Failed to register name: %m"); diff --git a/src/network/networkd-network-bus.c b/src/network/networkd-network-bus.c new file mode 100644 index 000000000..a167857e7 --- /dev/null +++ b/src/network/networkd-network-bus.c @@ -0,0 +1,128 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +/*** + This file is part of systemd. + + Copyright 2015 Tom Gundersen + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see . +***/ + +#include "bus-util.h" +#include "bus-label.h" +#include "strv.h" + +#include "networkd.h" + +const sd_bus_vtable network_vtable[] = { + SD_BUS_VTABLE_START(0), + + SD_BUS_PROPERTY("Description", "s", NULL, offsetof(Network, description), SD_BUS_VTABLE_PROPERTY_CONST), + SD_BUS_PROPERTY("SourcePath", "s", NULL, offsetof(Network, filename), SD_BUS_VTABLE_PROPERTY_CONST), +/* SD_BUS_PROPERTY("MatchMAC", "s", NULL TODO, offsetof(Network, match_mac), SD_BUS_VTABLE_PROPERTY_CONST), */ + SD_BUS_PROPERTY("MatchPath", "s", NULL, offsetof(Network, match_path), SD_BUS_VTABLE_PROPERTY_CONST), + SD_BUS_PROPERTY("MatchDriver", "s", NULL, offsetof(Network, match_driver), SD_BUS_VTABLE_PROPERTY_CONST), + SD_BUS_PROPERTY("MatchType", "s", NULL, offsetof(Network, match_type), SD_BUS_VTABLE_PROPERTY_CONST), + SD_BUS_PROPERTY("MatchName", "s", NULL, offsetof(Network, match_name), SD_BUS_VTABLE_PROPERTY_CONST), + + SD_BUS_VTABLE_END +}; + +static char *network_bus_path(Network *network) { + _cleanup_free_ char *e = NULL; + _cleanup_free_ char *name = NULL; + char *networkname; + char *d; + + assert(network); + assert(network->filename); + + name = strdup(network->filename); + if (!name) + return NULL; + + networkname = basename(name); + + d = strrchr(networkname, '.'); + if (!d) + return NULL; + + assert(streq(d, ".network")); + + *d = '\0'; + + e = bus_label_escape(networkname); + if (!e) + return NULL; + + return strappend("/org/freedesktop/network1/network/", e); +} + +int network_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) { + _cleanup_strv_free_ char **l = NULL; + Manager *m = userdata; + Network *network; + int r; + + assert(bus); + assert(path); + assert(m); + assert(nodes); + + LIST_FOREACH(networks, network, m->networks) { + char *p; + + p = network_bus_path(network); + if (!p) + return -ENOMEM; + + r = strv_consume(&l, p); + if (r < 0) + return r; + } + + *nodes = l; + l = NULL; + + return 1; +} + +int network_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) { + Manager *m = userdata; + Network *network; + _cleanup_free_ char *name = NULL; + _cleanup_free_ char *e = NULL; + int r; + + assert(bus); + assert(path); + assert(interface); + assert(m); + assert(found); + + if (sscanf(path, "/org/freedesktop/network1/network/%ms", &name) != 1) + return 0; + + e = bus_label_unescape(name); + if (!e) + return -ENOMEM; + + r = network_get_by_name(m, e, &network); + if (r < 0) + return 0; + + *found = network; + + return 1; +} diff --git a/src/network/networkd.h b/src/network/networkd.h index d144c11ed..147b21acd 100644 --- a/src/network/networkd.h +++ b/src/network/networkd.h @@ -104,7 +104,6 @@ struct Network { char *match_driver; char *match_type; char *match_name; - char *dhcp_vendor_class_identifier; Condition *match_host; Condition *match_virt; @@ -116,6 +115,7 @@ struct Network { NetDev *bond; Hashmap *stacked_netdevs; AddressFamilyBoolean dhcp; + char *dhcp_vendor_class_identifier; bool dhcp_dns; bool dhcp_ntp; bool dhcp_mtu; @@ -321,6 +321,11 @@ int config_parse_vxlan_group_address(const char *unit, void *data, void *userdata); +extern const sd_bus_vtable network_vtable[]; + +int network_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error); +int network_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error); + /* gperf */ const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length); -- 2.30.2