]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/network/networkd-link-bus.c
networkd: support route scopes
[thirdparty/systemd.git] / src / network / networkd-link-bus.c
CommitLineData
e331e246
TG
1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3/***
4 This file is part of systemd.
5
6 Copyright 2015 Tom Gundersen
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
22#include "bus-util.h"
23#include "strv.h"
24
25#include "networkd.h"
26#include "networkd-link.h"
27
28static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_operational_state, link_operstate, LinkOperationalState);
29static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_administrative_state, link_state, LinkState);
30
31const sd_bus_vtable link_vtable[] = {
32 SD_BUS_VTABLE_START(0),
33
34 SD_BUS_PROPERTY("OperationalState", "s", property_get_operational_state, offsetof(Link, operstate), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
35 SD_BUS_PROPERTY("AdministrativeState", "s", property_get_administrative_state, offsetof(Link, state), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
36
37 SD_BUS_VTABLE_END
38};
39
40static char *link_bus_path(Link *link) {
c8f5edea 41 _cleanup_free_ char *ifindex = NULL;
e331e246 42 char *p;
c8f5edea 43 int r;
e331e246
TG
44
45 assert(link);
46 assert(link->ifindex > 0);
47
c8f5edea
TG
48 if (asprintf(&ifindex, "%d", link->ifindex) < 0)
49 return NULL;
50
51 r = sd_bus_path_encode("/org/freedesktop/network1/link", ifindex, &p);
52 if (r < 0)
02f50053 53 return NULL;
e331e246
TG
54
55 return p;
56}
57
58int link_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
59 _cleanup_strv_free_ char **l = NULL;
60 Manager *m = userdata;
61 Link *link;
62 Iterator i;
63 int r;
64
65 assert(bus);
66 assert(path);
67 assert(m);
68 assert(nodes);
69
70 HASHMAP_FOREACH(link, m->links, i) {
71 char *p;
72
73 p = link_bus_path(link);
74 if (!p)
75 return -ENOMEM;
76
77 r = strv_consume(&l, p);
78 if (r < 0)
79 return r;
80 }
81
82 *nodes = l;
83 l = NULL;
84
85 return 1;
86}
87
88int link_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
c8f5edea 89 _cleanup_free_ char *identifier = NULL;
e331e246
TG
90 Manager *m = userdata;
91 Link *link;
92 int ifindex, r;
93
94 assert(bus);
95 assert(path);
96 assert(interface);
97 assert(m);
98 assert(found);
99
c8f5edea
TG
100 r = sd_bus_path_decode(path, "/org/freedesktop/network1/link", &identifier);
101 if (r < 0)
102 return 0;
103
104 if (sscanf(identifier, "%d", &ifindex) != 1)
e331e246
TG
105 return 0;
106
107 r = link_get(m, ifindex, &link);
108 if (r < 0)
109 return 0;
110
111 *found = link;
112
113 return 1;
114}
115
116int link_send_changed(Link *link, const char *property, ...) {
117 _cleanup_free_ char *p = NULL;
118 char **l;
119
120 assert(link);
121 assert(link->manager);
122
4852e159
TG
123 if (!link->manager->bus)
124 return 0; /* replace with assert when we have kdbus */
125
e331e246
TG
126 l = strv_from_stdarg_alloca(property);
127
128 p = link_bus_path(link);
129 if (!p)
130 return -ENOMEM;
131
132 return sd_bus_emit_properties_changed_strv(
133 link->manager->bus,
134 p,
135 "org.freedesktop.network1.Link",
136 l);
137}