1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 #include "alloc-util.h"
5 #include "networkd-link.h"
6 #include "networkd-manager.h"
7 #include "parse-util.h"
10 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_operational_state
, link_operstate
, LinkOperationalState
);
11 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_administrative_state
, link_state
, LinkState
);
13 const sd_bus_vtable link_vtable
[] = {
14 SD_BUS_VTABLE_START(0),
16 SD_BUS_PROPERTY("OperationalState", "s", property_get_operational_state
, offsetof(Link
, operstate
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
17 SD_BUS_PROPERTY("AdministrativeState", "s", property_get_administrative_state
, offsetof(Link
, state
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
22 static char *link_bus_path(Link
*link
) {
23 _cleanup_free_
char *ifindex
= NULL
;
28 assert(link
->ifindex
> 0);
30 if (asprintf(&ifindex
, "%d", link
->ifindex
) < 0)
33 r
= sd_bus_path_encode("/org/freedesktop/network1/link", ifindex
, &p
);
40 int link_node_enumerator(sd_bus
*bus
, const char *path
, void *userdata
, char ***nodes
, sd_bus_error
*error
) {
41 _cleanup_strv_free_
char **l
= NULL
;
42 Manager
*m
= userdata
;
52 l
= new0(char*, hashmap_size(m
->links
) + 1);
56 HASHMAP_FOREACH(link
, m
->links
, i
) {
59 p
= link_bus_path(link
);
72 int link_object_find(sd_bus
*bus
, const char *path
, const char *interface
, void *userdata
, void **found
, sd_bus_error
*error
) {
73 _cleanup_free_
char *identifier
= NULL
;
74 Manager
*m
= userdata
;
84 r
= sd_bus_path_decode(path
, "/org/freedesktop/network1/link", &identifier
);
88 r
= parse_ifindex(identifier
, &ifindex
);
92 r
= link_get(m
, ifindex
, &link
);
101 int link_send_changed(Link
*link
, const char *property
, ...) {
102 _cleanup_free_
char *p
= NULL
;
106 assert(link
->manager
);
108 if (!link
->manager
->bus
)
109 return 0; /* replace with assert when we have kdbus */
111 l
= strv_from_stdarg_alloca(property
);
113 p
= link_bus_path(link
);
117 return sd_bus_emit_properties_changed_strv(
120 "org.freedesktop.network1.Link",