]>
Commit | Line | Data |
---|---|---|
53e1b683 | 1 | /* SPDX-License-Identifier: LGPL-2.1+ */ |
e331e246 | 2 | |
071712b2 YW |
3 | #include <net/if.h> |
4 | ||
b5efdb8a | 5 | #include "alloc-util.h" |
071712b2 | 6 | #include "bus-common-errors.h" |
e331e246 | 7 | #include "bus-util.h" |
7f3c07ad | 8 | #include "networkd-link-bus.h" |
37d577c8 | 9 | #include "networkd-link.h" |
79a59fa5 | 10 | #include "networkd-manager-bus.h" |
23f53b99 | 11 | #include "networkd-manager.h" |
37d577c8 | 12 | #include "path-util.h" |
51517f9e | 13 | #include "strv.h" |
e331e246 | 14 | |
37d577c8 YW |
15 | static int method_list_links(sd_bus_message *message, void *userdata, sd_bus_error *error) { |
16 | _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL; | |
17 | Manager *manager = userdata; | |
18 | Iterator i; | |
19 | Link *link; | |
20 | int r; | |
21 | ||
22 | r = sd_bus_message_new_method_return(message, &reply); | |
23 | if (r < 0) | |
24 | return r; | |
25 | ||
26 | r = sd_bus_message_open_container(reply, 'a', "(iso)"); | |
27 | if (r < 0) | |
28 | return r; | |
29 | ||
30 | HASHMAP_FOREACH(link, manager->links, i) { | |
31 | _cleanup_free_ char *path = NULL; | |
32 | ||
33 | path = link_bus_path(link); | |
34 | if (!path) | |
35 | return -ENOMEM; | |
36 | ||
37 | r = sd_bus_message_append( | |
38 | reply, "(iso)", | |
39 | link->ifindex, | |
40 | link->ifname, | |
41 | empty_to_root(path)); | |
42 | if (r < 0) | |
43 | return r; | |
44 | } | |
45 | ||
46 | r = sd_bus_message_close_container(reply); | |
47 | if (r < 0) | |
48 | return r; | |
49 | ||
50 | return sd_bus_send(NULL, reply, NULL); | |
51 | } | |
52 | ||
071712b2 YW |
53 | static int method_get_link_by_name(sd_bus_message *message, void *userdata, sd_bus_error *error) { |
54 | _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL; | |
55 | _cleanup_free_ char *path = NULL; | |
56 | Manager *manager = userdata; | |
57 | const char *name; | |
58 | int index, r; | |
59 | Link *link; | |
60 | ||
61 | r = sd_bus_message_read(message, "s", &name); | |
62 | if (r < 0) | |
63 | return r; | |
64 | ||
65 | index = if_nametoindex(name); | |
66 | if (index <= 0) | |
67 | return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_LINK, "Link %s not known", name); | |
68 | ||
69 | link = hashmap_get(manager->links, INT_TO_PTR(index)); | |
70 | if (!link) | |
71 | return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_LINK, "Link %s not known", name); | |
72 | ||
73 | r = sd_bus_message_new_method_return(message, &reply); | |
74 | if (r < 0) | |
75 | return r; | |
76 | ||
77 | path = link_bus_path(link); | |
78 | if (!path) | |
79 | return -ENOMEM; | |
80 | ||
81 | r = sd_bus_message_append(reply, "io", link->ifindex, empty_to_root(path)); | |
82 | if (r < 0) | |
83 | return r; | |
84 | ||
85 | return sd_bus_send(NULL, reply, NULL); | |
86 | } | |
87 | ||
88 | static int method_get_link_by_index(sd_bus_message *message, void *userdata, sd_bus_error *error) { | |
89 | _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL; | |
90 | _cleanup_free_ char *path = NULL; | |
91 | Manager *manager = userdata; | |
92 | int32_t index; | |
93 | Link *link; | |
94 | int r; | |
95 | ||
96 | r = sd_bus_message_read(message, "i", &index); | |
97 | if (r < 0) | |
98 | return r; | |
99 | ||
100 | link = hashmap_get(manager->links, INT_TO_PTR((int) index)); | |
101 | if (!link) | |
102 | return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_LINK, "Link %" PRIi32 " not known", index); | |
103 | ||
104 | r = sd_bus_message_new_method_return(message, &reply); | |
105 | if (r < 0) | |
106 | return r; | |
107 | ||
108 | path = link_bus_path(link); | |
109 | if (!path) | |
110 | return -ENOMEM; | |
111 | ||
112 | r = sd_bus_message_append(reply, "so", link->ifname, empty_to_root(path)); | |
113 | if (r < 0) | |
114 | return r; | |
115 | ||
116 | return sd_bus_send(NULL, reply, NULL); | |
117 | } | |
118 | ||
15761549 YW |
119 | static int call_link_method(Manager *m, sd_bus_message *message, sd_bus_message_handler_t handler, sd_bus_error *error) { |
120 | int ifindex, r; | |
121 | Link *l; | |
122 | ||
123 | assert(m); | |
124 | assert(message); | |
125 | assert(handler); | |
126 | ||
127 | assert_cc(sizeof(int) == sizeof(int32_t)); | |
128 | r = sd_bus_message_read(message, "i", &ifindex); | |
129 | if (r < 0) | |
130 | return r; | |
131 | ||
132 | if (ifindex <= 0) | |
133 | return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid interface index"); | |
134 | ||
135 | l = hashmap_get(m->links, INT_TO_PTR(ifindex)); | |
136 | if (!l) | |
137 | return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_LINK, "Link %i not known", ifindex); | |
138 | ||
139 | return handler(message, l, error); | |
140 | } | |
141 | ||
142 | static int bus_method_set_link_ntp_servers(sd_bus_message *message, void *userdata, sd_bus_error *error) { | |
143 | return call_link_method(userdata, message, bus_link_method_set_ntp_servers, error); | |
144 | } | |
145 | ||
146 | static int bus_method_set_link_dns_servers(sd_bus_message *message, void *userdata, sd_bus_error *error) { | |
147 | return call_link_method(userdata, message, bus_link_method_set_dns_servers, error); | |
148 | } | |
149 | ||
150 | static int bus_method_set_link_domains(sd_bus_message *message, void *userdata, sd_bus_error *error) { | |
151 | return call_link_method(userdata, message, bus_link_method_set_domains, error); | |
152 | } | |
153 | ||
154 | static int bus_method_set_link_default_route(sd_bus_message *message, void *userdata, sd_bus_error *error) { | |
155 | return call_link_method(userdata, message, bus_link_method_set_default_route, error); | |
156 | } | |
157 | ||
158 | static int bus_method_set_link_llmnr(sd_bus_message *message, void *userdata, sd_bus_error *error) { | |
159 | return call_link_method(userdata, message, bus_link_method_set_llmnr, error); | |
160 | } | |
161 | ||
162 | static int bus_method_set_link_mdns(sd_bus_message *message, void *userdata, sd_bus_error *error) { | |
163 | return call_link_method(userdata, message, bus_link_method_set_mdns, error); | |
164 | } | |
165 | ||
166 | static int bus_method_set_link_dns_over_tls(sd_bus_message *message, void *userdata, sd_bus_error *error) { | |
167 | return call_link_method(userdata, message, bus_link_method_set_dns_over_tls, error); | |
168 | } | |
169 | ||
170 | static int bus_method_set_link_dnssec(sd_bus_message *message, void *userdata, sd_bus_error *error) { | |
171 | return call_link_method(userdata, message, bus_link_method_set_dnssec, error); | |
172 | } | |
173 | ||
174 | static int bus_method_set_link_dnssec_negative_trust_anchors(sd_bus_message *message, void *userdata, sd_bus_error *error) { | |
175 | return call_link_method(userdata, message, bus_link_method_set_dnssec_negative_trust_anchors, error); | |
176 | } | |
177 | ||
178 | static int bus_method_revert_link_ntp(sd_bus_message *message, void *userdata, sd_bus_error *error) { | |
179 | return call_link_method(userdata, message, bus_link_method_revert_ntp, error); | |
180 | } | |
181 | ||
182 | static int bus_method_revert_link_dns(sd_bus_message *message, void *userdata, sd_bus_error *error) { | |
183 | return call_link_method(userdata, message, bus_link_method_revert_dns, error); | |
184 | } | |
185 | ||
ae65d7db YW |
186 | static int bus_method_renew_link(sd_bus_message *message, void *userdata, sd_bus_error *error) { |
187 | return call_link_method(userdata, message, bus_link_method_renew, error); | |
188 | } | |
189 | ||
e331e246 TG |
190 | const sd_bus_vtable manager_vtable[] = { |
191 | SD_BUS_VTABLE_START(0), | |
192 | ||
193 | SD_BUS_PROPERTY("OperationalState", "s", property_get_operational_state, offsetof(Manager, operational_state), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), | |
7f3c07ad YW |
194 | SD_BUS_PROPERTY("CarrierState", "s", property_get_carrier_state, offsetof(Manager, carrier_state), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), |
195 | SD_BUS_PROPERTY("AddressState", "s", property_get_address_state, offsetof(Manager, address_state), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), | |
e331e246 | 196 | |
37d577c8 | 197 | SD_BUS_METHOD("ListLinks", NULL, "a(iso)", method_list_links, SD_BUS_VTABLE_UNPRIVILEGED), |
071712b2 YW |
198 | SD_BUS_METHOD("GetLinkByName", "s", "io", method_get_link_by_name, SD_BUS_VTABLE_UNPRIVILEGED), |
199 | SD_BUS_METHOD("GetLinkByIndex", "i", "so", method_get_link_by_index, SD_BUS_VTABLE_UNPRIVILEGED), | |
15761549 YW |
200 | SD_BUS_METHOD("SetLinkNTP", "ias", NULL, bus_method_set_link_ntp_servers, SD_BUS_VTABLE_UNPRIVILEGED), |
201 | SD_BUS_METHOD("SetLinkDNS", "ia(iay)", NULL, bus_method_set_link_dns_servers, SD_BUS_VTABLE_UNPRIVILEGED), | |
202 | SD_BUS_METHOD("SetLinkDomains", "ia(sb)", NULL, bus_method_set_link_domains, SD_BUS_VTABLE_UNPRIVILEGED), | |
203 | SD_BUS_METHOD("SetLinkDefaultRoute", "ib", NULL, bus_method_set_link_default_route, SD_BUS_VTABLE_UNPRIVILEGED), | |
204 | SD_BUS_METHOD("SetLinkLLMNR", "is", NULL, bus_method_set_link_llmnr, SD_BUS_VTABLE_UNPRIVILEGED), | |
205 | SD_BUS_METHOD("SetLinkMulticastDNS", "is", NULL, bus_method_set_link_mdns, SD_BUS_VTABLE_UNPRIVILEGED), | |
206 | SD_BUS_METHOD("SetLinkDNSOverTLS", "is", NULL, bus_method_set_link_dns_over_tls, SD_BUS_VTABLE_UNPRIVILEGED), | |
207 | SD_BUS_METHOD("SetLinkDNSSEC", "is", NULL, bus_method_set_link_dnssec, SD_BUS_VTABLE_UNPRIVILEGED), | |
208 | SD_BUS_METHOD("SetLinkDNSSECNegativeTrustAnchors", "ias", NULL, bus_method_set_link_dnssec_negative_trust_anchors, SD_BUS_VTABLE_UNPRIVILEGED), | |
209 | SD_BUS_METHOD("RevertLinkNTP", "i", NULL, bus_method_revert_link_ntp, SD_BUS_VTABLE_UNPRIVILEGED), | |
210 | SD_BUS_METHOD("RevertLinkDNS", "i", NULL, bus_method_revert_link_dns, SD_BUS_VTABLE_UNPRIVILEGED), | |
ae65d7db | 211 | SD_BUS_METHOD("RenewLink", "i", NULL, bus_method_renew_link, SD_BUS_VTABLE_UNPRIVILEGED), |
37d577c8 | 212 | |
e331e246 TG |
213 | SD_BUS_VTABLE_END |
214 | }; | |
215 | ||
46606fdd | 216 | int manager_send_changed_strv(Manager *manager, char **properties) { |
e331e246 | 217 | assert(manager); |
46606fdd | 218 | assert(properties); |
e331e246 | 219 | |
4852e159 | 220 | if (!manager->bus) |
46606fdd | 221 | return 0; |
e331e246 TG |
222 | |
223 | return sd_bus_emit_properties_changed_strv( | |
224 | manager->bus, | |
225 | "/org/freedesktop/network1", | |
226 | "org.freedesktop.network1.Manager", | |
46606fdd YW |
227 | properties); |
228 | } |