]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/network/networkd-link-bus.c
tree-wide: beautify remaining copyright statements
[thirdparty/systemd.git] / src / network / networkd-link-bus.c
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
e331e246 2/***
96b2fb93 3 Copyright © 2015 Tom Gundersen
e331e246
TG
4***/
5
b5efdb8a 6#include "alloc-util.h"
cf0fbc49 7#include "bus-util.h"
e331e246 8#include "networkd-link.h"
23f53b99 9#include "networkd-manager.h"
6bedfcbb 10#include "parse-util.h"
cf0fbc49 11#include "strv.h"
e331e246
TG
12
13static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_operational_state, link_operstate, LinkOperationalState);
14static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_administrative_state, link_state, LinkState);
15
16const 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
25static char *link_bus_path(Link *link) {
c8f5edea 26 _cleanup_free_ char *ifindex = NULL;
e331e246 27 char *p;
c8f5edea 28 int r;
e331e246
TG
29
30 assert(link);
31 assert(link->ifindex > 0);
32
c8f5edea
TG
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)
02f50053 38 return NULL;
e331e246
TG
39
40 return p;
41}
42
43int 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;
fdb90ac6 46 unsigned c = 0;
e331e246
TG
47 Link *link;
48 Iterator i;
e331e246
TG
49
50 assert(bus);
51 assert(path);
52 assert(m);
53 assert(nodes);
54
fdb90ac6
LP
55 l = new0(char*, hashmap_size(m->links) + 1);
56 if (!l)
57 return -ENOMEM;
58
e331e246
TG
59 HASHMAP_FOREACH(link, m->links, i) {
60 char *p;
61
62 p = link_bus_path(link);
63 if (!p)
64 return -ENOMEM;
65
fdb90ac6 66 l[c++] = p;
e331e246
TG
67 }
68
fdb90ac6 69 l[c] = NULL;
ae2a15bc 70 *nodes = TAKE_PTR(l);
e331e246
TG
71
72 return 1;
73}
74
75int link_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
c8f5edea 76 _cleanup_free_ char *identifier = NULL;
e331e246
TG
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
c8f5edea 87 r = sd_bus_path_decode(path, "/org/freedesktop/network1/link", &identifier);
a7f6e7e8 88 if (r <= 0)
c8f5edea
TG
89 return 0;
90
6ad623a3 91 r = parse_ifindex(identifier, &ifindex);
1c111814 92 if (r < 0)
e331e246
TG
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
104int 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
4852e159
TG
111 if (!link->manager->bus)
112 return 0; /* replace with assert when we have kdbus */
113
e331e246
TG
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}