]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/network/networkd-link-bus.c
Merge pull request #1693 from ssahani/word
[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
1c111814
TG
104 r = safe_atoi(identifier, &ifindex);
105 if (r < 0)
e331e246
TG
106 return 0;
107
108 r = link_get(m, ifindex, &link);
109 if (r < 0)
110 return 0;
111
112 *found = link;
113
114 return 1;
115}
116
117int link_send_changed(Link *link, const char *property, ...) {
118 _cleanup_free_ char *p = NULL;
119 char **l;
120
121 assert(link);
122 assert(link->manager);
123
4852e159
TG
124 if (!link->manager->bus)
125 return 0; /* replace with assert when we have kdbus */
126
e331e246
TG
127 l = strv_from_stdarg_alloca(property);
128
129 p = link_bus_path(link);
130 if (!p)
131 return -ENOMEM;
132
133 return sd_bus_emit_properties_changed_strv(
134 link->manager->bus,
135 p,
136 "org.freedesktop.network1.Link",
137 l);
138}