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