]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/network/networkd-network-bus.c
tree-wide: beautify remaining copyright statements
[thirdparty/systemd.git] / src / network / networkd-network-bus.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 /***
3 Copyright © 2015 Tom Gundersen
4 ***/
5
6 #include "alloc-util.h"
7 #include "ether-addr-util.h"
8 #include "networkd-manager.h"
9 #include "string-util.h"
10 #include "strv.h"
11
12 static int property_get_ether_addrs(
13 sd_bus *bus,
14 const char *path,
15 const char *interface,
16 const char *property,
17 sd_bus_message *reply,
18 void *userdata,
19 sd_bus_error *error) {
20
21 char buf[ETHER_ADDR_TO_STRING_MAX];
22 const struct ether_addr *p;
23 Iterator i;
24 Set *s;
25 int r;
26
27 assert(bus);
28 assert(reply);
29 assert(userdata);
30
31 s = *(Set **) userdata;
32
33 r = sd_bus_message_open_container(reply, 'a', "s");
34 if (r < 0)
35 return r;
36
37 SET_FOREACH(p, s, i) {
38 r = sd_bus_message_append(reply, "s", ether_addr_to_string(p, buf));
39 if (r < 0)
40 return r;
41 }
42
43 return sd_bus_message_close_container(reply);
44 }
45
46 const sd_bus_vtable network_vtable[] = {
47 SD_BUS_VTABLE_START(0),
48
49 SD_BUS_PROPERTY("Description", "s", NULL, offsetof(Network, description), SD_BUS_VTABLE_PROPERTY_CONST),
50 SD_BUS_PROPERTY("SourcePath", "s", NULL, offsetof(Network, filename), SD_BUS_VTABLE_PROPERTY_CONST),
51 SD_BUS_PROPERTY("MatchMAC", "as", property_get_ether_addrs, offsetof(Network, match_mac), SD_BUS_VTABLE_PROPERTY_CONST),
52 SD_BUS_PROPERTY("MatchPath", "as", NULL, offsetof(Network, match_path), SD_BUS_VTABLE_PROPERTY_CONST),
53 SD_BUS_PROPERTY("MatchDriver", "as", NULL, offsetof(Network, match_driver), SD_BUS_VTABLE_PROPERTY_CONST),
54 SD_BUS_PROPERTY("MatchType", "as", NULL, offsetof(Network, match_type), SD_BUS_VTABLE_PROPERTY_CONST),
55 SD_BUS_PROPERTY("MatchName", "as", NULL, offsetof(Network, match_name), SD_BUS_VTABLE_PROPERTY_CONST),
56
57 SD_BUS_VTABLE_END
58 };
59
60 static char *network_bus_path(Network *network) {
61 _cleanup_free_ char *name = NULL;
62 char *networkname, *d, *path;
63 int r;
64
65 assert(network);
66 assert(network->filename);
67
68 name = strdup(network->filename);
69 if (!name)
70 return NULL;
71
72 networkname = basename(name);
73
74 d = strrchr(networkname, '.');
75 if (!d)
76 return NULL;
77
78 assert(streq(d, ".network"));
79
80 *d = '\0';
81
82 r = sd_bus_path_encode("/org/freedesktop/network1/network", networkname, &path);
83 if (r < 0)
84 return NULL;
85
86 return path;
87 }
88
89 int network_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
90 _cleanup_strv_free_ char **l = NULL;
91 Manager *m = userdata;
92 Network *network;
93 int r;
94
95 assert(bus);
96 assert(path);
97 assert(m);
98 assert(nodes);
99
100 LIST_FOREACH(networks, network, m->networks) {
101 char *p;
102
103 p = network_bus_path(network);
104 if (!p)
105 return -ENOMEM;
106
107 r = strv_consume(&l, p);
108 if (r < 0)
109 return r;
110 }
111
112 *nodes = TAKE_PTR(l);
113
114 return 1;
115 }
116
117 int network_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
118 Manager *m = userdata;
119 Network *network;
120 _cleanup_free_ char *name = NULL;
121 int r;
122
123 assert(bus);
124 assert(path);
125 assert(interface);
126 assert(m);
127 assert(found);
128
129 r = sd_bus_path_decode(path, "/org/freedesktop/network1/network", &name);
130 if (r < 0)
131 return 0;
132
133 r = network_get_by_name(m, name, &network);
134 if (r < 0)
135 return 0;
136
137 *found = network;
138
139 return 1;
140 }