]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/network/networkd-network-bus.c
tree-wide: drop license boilerplate
[thirdparty/systemd.git] / src / network / networkd-network-bus.c
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
3175fcde
TG
2/***
3 This file is part of systemd.
4
5 Copyright 2015 Tom Gundersen
3175fcde
TG
6***/
7
b5efdb8a 8#include "alloc-util.h"
23f53b99 9#include "networkd-manager.h"
07630cea
LP
10#include "string-util.h"
11#include "strv.h"
3175fcde 12
9198e12c
TG
13static int property_get_ether_addrs(
14 sd_bus *bus,
15 const char *path,
16 const char *interface,
17 const char *property,
18 sd_bus_message *reply,
19 void *userdata,
20 sd_bus_error *error) {
21
22 Network *n = userdata;
23 const char *ether = NULL;
24 int r;
25
26 assert(bus);
27 assert(reply);
28 assert(n);
29
30 if (n->match_mac)
31 ether = ether_ntoa(n->match_mac);
32
33 r = sd_bus_message_open_container(reply, 'a', "s");
34 if (r < 0)
35 return r;
36
37 if (ether) {
38 r = sd_bus_message_append(reply, "s", strempty(ether));
39 if (r < 0)
40 return r;
41 }
42
0f826101 43 return sd_bus_message_close_container(reply);
9198e12c
TG
44}
45
3175fcde
TG
46const 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),
174306cf 51 SD_BUS_PROPERTY("MatchMAC", "as", property_get_ether_addrs, 0, SD_BUS_VTABLE_PROPERTY_CONST),
5256e00e
TG
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),
3175fcde
TG
56
57 SD_BUS_VTABLE_END
58};
59
60static char *network_bus_path(Network *network) {
3175fcde 61 _cleanup_free_ char *name = NULL;
f6f8d466
TG
62 char *networkname, *d, *path;
63 int r;
3175fcde
TG
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
f6f8d466
TG
82 r = sd_bus_path_encode("/org/freedesktop/network1/network", networkname, &path);
83 if (r < 0)
3175fcde
TG
84 return NULL;
85
f6f8d466 86 return path;
3175fcde
TG
87}
88
89int 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
ae2a15bc 112 *nodes = TAKE_PTR(l);
3175fcde
TG
113
114 return 1;
115}
116
117int 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;
3175fcde
TG
121 int r;
122
123 assert(bus);
124 assert(path);
125 assert(interface);
126 assert(m);
127 assert(found);
128
f6f8d466
TG
129 r = sd_bus_path_decode(path, "/org/freedesktop/network1/network", &name);
130 if (r < 0)
3175fcde
TG
131 return 0;
132
f6f8d466 133 r = network_get_by_name(m, name, &network);
3175fcde
TG
134 if (r < 0)
135 return 0;
136
137 *found = network;
138
139 return 1;
140}