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 const sd_bus_vtable manager_vtable
[] = {
120 SD_BUS_VTABLE_START(0),
122 SD_BUS_PROPERTY("OperationalState", "s", property_get_operational_state
, offsetof(Manager
, operational_state
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
123 SD_BUS_PROPERTY("CarrierState", "s", property_get_carrier_state
, offsetof(Manager
, carrier_state
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
124 SD_BUS_PROPERTY("AddressState", "s", property_get_address_state
, offsetof(Manager
, address_state
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
126 SD_BUS_METHOD("ListLinks", NULL
, "a(iso)", method_list_links
, SD_BUS_VTABLE_UNPRIVILEGED
),
127 SD_BUS_METHOD("GetLinkByName", "s", "io", method_get_link_by_name
, SD_BUS_VTABLE_UNPRIVILEGED
),
128 SD_BUS_METHOD("GetLinkByIndex", "i", "so", method_get_link_by_index
, SD_BUS_VTABLE_UNPRIVILEGED
),
133 int manager_send_changed_strv(Manager
*manager
, char **properties
) {
140 return sd_bus_emit_properties_changed_strv(
142 "/org/freedesktop/network1",
143 "org.freedesktop.network1.Manager",