3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen/***
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen This file is part of systemd.
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen Copyright 2015 Tom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen systemd is free software; you can redistribute it and/or modify it
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen under the terms of the GNU Lesser General Public License as published by
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen the Free Software Foundation; either version 2.1 of the License, or
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen (at your option) any later version.
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen systemd is distributed in the hope that it will be useful, but
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen WITHOUT ANY WARRANTY; without even the implied warranty of
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen Lesser General Public License for more details.
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen You should have received a copy of the GNU Lesser General Public License
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen along with systemd; If not, see <http://www.gnu.org/licenses/>.
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen***/
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
b5efdb8af40ea759a1ea584c1bc44ecc81dd00ceLennart Poettering#include "alloc-util.h"
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen#include "networkd.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "string-util.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "strv.h"
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersenstatic int property_get_ether_addrs(
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen sd_bus *bus,
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen const char *path,
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen const char *interface,
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen const char *property,
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen sd_bus_message *reply,
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen void *userdata,
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen sd_bus_error *error) {
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen Network *n = userdata;
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen const char *ether = NULL;
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen int r;
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen assert(bus);
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen assert(reply);
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen assert(n);
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen if (n->match_mac)
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen ether = ether_ntoa(n->match_mac);
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen r = sd_bus_message_open_container(reply, 'a', "s");
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen if (r < 0)
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen return r;
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen if (ether) {
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen r = sd_bus_message_append(reply, "s", strempty(ether));
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen if (r < 0)
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen return r;
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen }
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen
0f8261015380be71f8a63c8aa37926c2a32d1870Umut Tezduyar Lindskog return sd_bus_message_close_container(reply);
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen}
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersenconst sd_bus_vtable network_vtable[] = {
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen SD_BUS_VTABLE_START(0),
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen SD_BUS_PROPERTY("Description", "s", NULL, offsetof(Network, description), SD_BUS_VTABLE_PROPERTY_CONST),
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen SD_BUS_PROPERTY("SourcePath", "s", NULL, offsetof(Network, filename), SD_BUS_VTABLE_PROPERTY_CONST),
9198e12ca32db7812b2a79b5922233ec80890306Tom Gundersen SD_BUS_PROPERTY("MatchMAC", "as", property_get_ether_addrs, offsetof(Network, match_mac), SD_BUS_VTABLE_PROPERTY_CONST),
5256e00e8b9015dd1a976d647fc71dc7efbd8cf8Tom Gundersen SD_BUS_PROPERTY("MatchPath", "as", NULL, offsetof(Network, match_path), SD_BUS_VTABLE_PROPERTY_CONST),
5256e00e8b9015dd1a976d647fc71dc7efbd8cf8Tom Gundersen SD_BUS_PROPERTY("MatchDriver", "as", NULL, offsetof(Network, match_driver), SD_BUS_VTABLE_PROPERTY_CONST),
5256e00e8b9015dd1a976d647fc71dc7efbd8cf8Tom Gundersen SD_BUS_PROPERTY("MatchType", "as", NULL, offsetof(Network, match_type), SD_BUS_VTABLE_PROPERTY_CONST),
5256e00e8b9015dd1a976d647fc71dc7efbd8cf8Tom Gundersen SD_BUS_PROPERTY("MatchName", "as", NULL, offsetof(Network, match_name), SD_BUS_VTABLE_PROPERTY_CONST),
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen SD_BUS_VTABLE_END
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen};
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersenstatic char *network_bus_path(Network *network) {
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen _cleanup_free_ char *name = NULL;
f6f8d466bd6ce5f737d66a076c1f9e40d8ec9d7fTom Gundersen char *networkname, *d, *path;
f6f8d466bd6ce5f737d66a076c1f9e40d8ec9d7fTom Gundersen int r;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen assert(network);
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen assert(network->filename);
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen name = strdup(network->filename);
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen if (!name)
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen return NULL;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen networkname = basename(name);
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen d = strrchr(networkname, '.');
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen if (!d)
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen return NULL;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen assert(streq(d, ".network"));
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen *d = '\0';
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
f6f8d466bd6ce5f737d66a076c1f9e40d8ec9d7fTom Gundersen r = sd_bus_path_encode("/org/freedesktop/network1/network", networkname, &path);
f6f8d466bd6ce5f737d66a076c1f9e40d8ec9d7fTom Gundersen if (r < 0)
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen return NULL;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
f6f8d466bd6ce5f737d66a076c1f9e40d8ec9d7fTom Gundersen return path;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen}
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersenint network_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen _cleanup_strv_free_ char **l = NULL;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen Manager *m = userdata;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen Network *network;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen int r;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen assert(bus);
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen assert(path);
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen assert(m);
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen assert(nodes);
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen LIST_FOREACH(networks, network, m->networks) {
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen char *p;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen p = network_bus_path(network);
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen if (!p)
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen return -ENOMEM;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen r = strv_consume(&l, p);
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen if (r < 0)
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen return r;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen }
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen *nodes = l;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen l = NULL;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen return 1;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen}
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersenint network_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen Manager *m = userdata;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen Network *network;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen _cleanup_free_ char *name = NULL;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen int r;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen assert(bus);
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen assert(path);
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen assert(interface);
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen assert(m);
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen assert(found);
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
f6f8d466bd6ce5f737d66a076c1f9e40d8ec9d7fTom Gundersen r = sd_bus_path_decode(path, "/org/freedesktop/network1/network", &name);
f6f8d466bd6ce5f737d66a076c1f9e40d8ec9d7fTom Gundersen if (r < 0)
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen return 0;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
f6f8d466bd6ce5f737d66a076c1f9e40d8ec9d7fTom Gundersen r = network_get_by_name(m, name, &network);
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen if (r < 0)
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen return 0;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen *found = network;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen return 1;
3175fcdec5d748e8db85a3e7fe1cb67f5f6a865dTom Gundersen}