1 /* SPDX-License-Identifier: LGPL-2.1+ */
5 #include "alloc-util.h"
6 #include "bus-common-errors.h"
8 #include "networkd-link-bus.h"
9 #include "networkd-link.h"
10 #include "networkd-manager-bus.h"
11 #include "networkd-manager.h"
12 #include "path-util.h"
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
;
22 r
= sd_bus_message_new_method_return(message
, &reply
);
26 r
= sd_bus_message_open_container(reply
, 'a', "(iso)");
30 HASHMAP_FOREACH(link
, manager
->links
, i
) {
31 _cleanup_free_
char *path
= NULL
;
33 path
= link_bus_path(link
);
37 r
= sd_bus_message_append(
46 r
= sd_bus_message_close_container(reply
);
50 return sd_bus_send(NULL
, reply
, NULL
);
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
;
61 r
= sd_bus_message_read(message
, "s", &name
);
65 index
= if_nametoindex(name
);
67 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_LINK
, "Link %s not known", name
);
69 link
= hashmap_get(manager
->links
, INT_TO_PTR(index
));
71 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_LINK
, "Link %s not known", name
);
73 r
= sd_bus_message_new_method_return(message
, &reply
);
77 path
= link_bus_path(link
);
81 r
= sd_bus_message_append(reply
, "io", link
->ifindex
, empty_to_root(path
));
85 return sd_bus_send(NULL
, reply
, NULL
);
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
;
96 r
= sd_bus_message_read(message
, "i", &index
);
100 link
= hashmap_get(manager
->links
, INT_TO_PTR((int) index
));
102 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_LINK
, "Link %" PRIi32
" not known", index
);
104 r
= sd_bus_message_new_method_return(message
, &reply
);
108 path
= link_bus_path(link
);
112 r
= sd_bus_message_append(reply
, "so", link
->ifname
, empty_to_root(path
));
116 return sd_bus_send(NULL
, reply
, NULL
);
119 static int call_link_method(Manager
*m
, sd_bus_message
*message
, sd_bus_message_handler_t handler
, sd_bus_error
*error
) {
127 assert_cc(sizeof(int) == sizeof(int32_t));
128 r
= sd_bus_message_read(message
, "i", &ifindex
);
133 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid interface index");
135 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
137 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_LINK
, "Link %i not known", ifindex
);
139 return handler(message
, l
, error
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
186 const sd_bus_vtable manager_vtable
[] = {
187 SD_BUS_VTABLE_START(0),
189 SD_BUS_PROPERTY("OperationalState", "s", property_get_operational_state
, offsetof(Manager
, operational_state
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
190 SD_BUS_PROPERTY("CarrierState", "s", property_get_carrier_state
, offsetof(Manager
, carrier_state
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
191 SD_BUS_PROPERTY("AddressState", "s", property_get_address_state
, offsetof(Manager
, address_state
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
193 SD_BUS_METHOD("ListLinks", NULL
, "a(iso)", method_list_links
, SD_BUS_VTABLE_UNPRIVILEGED
),
194 SD_BUS_METHOD("GetLinkByName", "s", "io", method_get_link_by_name
, SD_BUS_VTABLE_UNPRIVILEGED
),
195 SD_BUS_METHOD("GetLinkByIndex", "i", "so", method_get_link_by_index
, SD_BUS_VTABLE_UNPRIVILEGED
),
196 SD_BUS_METHOD("SetLinkNTP", "ias", NULL
, bus_method_set_link_ntp_servers
, SD_BUS_VTABLE_UNPRIVILEGED
),
197 SD_BUS_METHOD("SetLinkDNS", "ia(iay)", NULL
, bus_method_set_link_dns_servers
, SD_BUS_VTABLE_UNPRIVILEGED
),
198 SD_BUS_METHOD("SetLinkDomains", "ia(sb)", NULL
, bus_method_set_link_domains
, SD_BUS_VTABLE_UNPRIVILEGED
),
199 SD_BUS_METHOD("SetLinkDefaultRoute", "ib", NULL
, bus_method_set_link_default_route
, SD_BUS_VTABLE_UNPRIVILEGED
),
200 SD_BUS_METHOD("SetLinkLLMNR", "is", NULL
, bus_method_set_link_llmnr
, SD_BUS_VTABLE_UNPRIVILEGED
),
201 SD_BUS_METHOD("SetLinkMulticastDNS", "is", NULL
, bus_method_set_link_mdns
, SD_BUS_VTABLE_UNPRIVILEGED
),
202 SD_BUS_METHOD("SetLinkDNSOverTLS", "is", NULL
, bus_method_set_link_dns_over_tls
, SD_BUS_VTABLE_UNPRIVILEGED
),
203 SD_BUS_METHOD("SetLinkDNSSEC", "is", NULL
, bus_method_set_link_dnssec
, SD_BUS_VTABLE_UNPRIVILEGED
),
204 SD_BUS_METHOD("SetLinkDNSSECNegativeTrustAnchors", "ias", NULL
, bus_method_set_link_dnssec_negative_trust_anchors
, SD_BUS_VTABLE_UNPRIVILEGED
),
205 SD_BUS_METHOD("RevertLinkNTP", "i", NULL
, bus_method_revert_link_ntp
, SD_BUS_VTABLE_UNPRIVILEGED
),
206 SD_BUS_METHOD("RevertLinkDNS", "i", NULL
, bus_method_revert_link_dns
, SD_BUS_VTABLE_UNPRIVILEGED
),
211 int manager_send_changed_strv(Manager
*manager
, char **properties
) {
218 return sd_bus_emit_properties_changed_strv(
220 "/org/freedesktop/network1",
221 "org.freedesktop.network1.Manager",