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