1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 Copyright © 2015 Tom Gundersen
6 #include "alloc-util.h"
8 #include "networkd-link.h"
9 #include "networkd-manager.h"
10 #include "parse-util.h"
13 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_operational_state
, link_operstate
, LinkOperationalState
);
14 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_administrative_state
, link_state
, LinkState
);
16 const sd_bus_vtable link_vtable
[] = {
17 SD_BUS_VTABLE_START(0),
19 SD_BUS_PROPERTY("OperationalState", "s", property_get_operational_state
, offsetof(Link
, operstate
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
20 SD_BUS_PROPERTY("AdministrativeState", "s", property_get_administrative_state
, offsetof(Link
, state
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
25 static char *link_bus_path(Link
*link
) {
26 _cleanup_free_
char *ifindex
= NULL
;
31 assert(link
->ifindex
> 0);
33 if (asprintf(&ifindex
, "%d", link
->ifindex
) < 0)
36 r
= sd_bus_path_encode("/org/freedesktop/network1/link", ifindex
, &p
);
43 int link_node_enumerator(sd_bus
*bus
, const char *path
, void *userdata
, char ***nodes
, sd_bus_error
*error
) {
44 _cleanup_strv_free_
char **l
= NULL
;
45 Manager
*m
= userdata
;
55 l
= new0(char*, hashmap_size(m
->links
) + 1);
59 HASHMAP_FOREACH(link
, m
->links
, i
) {
62 p
= link_bus_path(link
);
75 int link_object_find(sd_bus
*bus
, const char *path
, const char *interface
, void *userdata
, void **found
, sd_bus_error
*error
) {
76 _cleanup_free_
char *identifier
= NULL
;
77 Manager
*m
= userdata
;
87 r
= sd_bus_path_decode(path
, "/org/freedesktop/network1/link", &identifier
);
91 r
= parse_ifindex(identifier
, &ifindex
);
95 r
= link_get(m
, ifindex
, &link
);
104 int link_send_changed(Link
*link
, const char *property
, ...) {
105 _cleanup_free_
char *p
= NULL
;
109 assert(link
->manager
);
111 if (!link
->manager
->bus
)
112 return 0; /* replace with assert when we have kdbus */
114 l
= strv_from_stdarg_alloca(property
);
116 p
= link_bus_path(link
);
120 return sd_bus_emit_properties_changed_strv(
123 "org.freedesktop.network1.Link",