]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/network/networkd-link-bus.c
Merge pull request #9348 from keszybz/copyright-removal
[thirdparty/systemd.git] / src / network / networkd-link-bus.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2
3 #include "alloc-util.h"
4 #include "bus-util.h"
5 #include "networkd-link.h"
6 #include "networkd-manager.h"
7 #include "parse-util.h"
8 #include "strv.h"
9
10 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_operational_state, link_operstate, LinkOperationalState);
11 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_administrative_state, link_state, LinkState);
12
13 const sd_bus_vtable link_vtable[] = {
14 SD_BUS_VTABLE_START(0),
15
16 SD_BUS_PROPERTY("OperationalState", "s", property_get_operational_state, offsetof(Link, operstate), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
17 SD_BUS_PROPERTY("AdministrativeState", "s", property_get_administrative_state, offsetof(Link, state), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
18
19 SD_BUS_VTABLE_END
20 };
21
22 static char *link_bus_path(Link *link) {
23 _cleanup_free_ char *ifindex = NULL;
24 char *p;
25 int r;
26
27 assert(link);
28 assert(link->ifindex > 0);
29
30 if (asprintf(&ifindex, "%d", link->ifindex) < 0)
31 return NULL;
32
33 r = sd_bus_path_encode("/org/freedesktop/network1/link", ifindex, &p);
34 if (r < 0)
35 return NULL;
36
37 return p;
38 }
39
40 int link_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
41 _cleanup_strv_free_ char **l = NULL;
42 Manager *m = userdata;
43 unsigned c = 0;
44 Link *link;
45 Iterator i;
46
47 assert(bus);
48 assert(path);
49 assert(m);
50 assert(nodes);
51
52 l = new0(char*, hashmap_size(m->links) + 1);
53 if (!l)
54 return -ENOMEM;
55
56 HASHMAP_FOREACH(link, m->links, i) {
57 char *p;
58
59 p = link_bus_path(link);
60 if (!p)
61 return -ENOMEM;
62
63 l[c++] = p;
64 }
65
66 l[c] = NULL;
67 *nodes = TAKE_PTR(l);
68
69 return 1;
70 }
71
72 int link_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
73 _cleanup_free_ char *identifier = NULL;
74 Manager *m = userdata;
75 Link *link;
76 int ifindex, r;
77
78 assert(bus);
79 assert(path);
80 assert(interface);
81 assert(m);
82 assert(found);
83
84 r = sd_bus_path_decode(path, "/org/freedesktop/network1/link", &identifier);
85 if (r <= 0)
86 return 0;
87
88 r = parse_ifindex(identifier, &ifindex);
89 if (r < 0)
90 return 0;
91
92 r = link_get(m, ifindex, &link);
93 if (r < 0)
94 return 0;
95
96 *found = link;
97
98 return 1;
99 }
100
101 int link_send_changed(Link *link, const char *property, ...) {
102 _cleanup_free_ char *p = NULL;
103 char **l;
104
105 assert(link);
106 assert(link->manager);
107
108 if (!link->manager->bus)
109 return 0; /* replace with assert when we have kdbus */
110
111 l = strv_from_stdarg_alloca(property);
112
113 p = link_bus_path(link);
114 if (!p)
115 return -ENOMEM;
116
117 return sd_bus_emit_properties_changed_strv(
118 link->manager->bus,
119 p,
120 "org.freedesktop.network1.Link",
121 l);
122 }