1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
3 #include "alloc-util.h"
4 #include "ether-addr-util.h"
5 #include "networkd-manager.h"
6 #include "networkd-network-bus.h"
7 #include "string-util.h"
10 static int property_get_ether_addrs(
13 const char *interface
,
15 sd_bus_message
*reply
,
17 sd_bus_error
*error
) {
19 const struct ether_addr
*p
;
27 s
= *(Set
**) userdata
;
29 r
= sd_bus_message_open_container(reply
, 'a', "s");
34 r
= sd_bus_message_append(reply
, "s", ETHER_ADDR_TO_STR(p
));
39 return sd_bus_message_close_container(reply
);
42 static const sd_bus_vtable network_vtable
[] = {
43 SD_BUS_VTABLE_START(0),
45 SD_BUS_PROPERTY("Description", "s", NULL
, offsetof(Network
, description
), SD_BUS_VTABLE_PROPERTY_CONST
),
46 SD_BUS_PROPERTY("SourcePath", "s", NULL
, offsetof(Network
, filename
), SD_BUS_VTABLE_PROPERTY_CONST
),
47 SD_BUS_PROPERTY("MatchMAC", "as", property_get_ether_addrs
, offsetof(Network
, match
.mac
), SD_BUS_VTABLE_PROPERTY_CONST
),
48 SD_BUS_PROPERTY("MatchPath", "as", NULL
, offsetof(Network
, match
.path
), SD_BUS_VTABLE_PROPERTY_CONST
),
49 SD_BUS_PROPERTY("MatchDriver", "as", NULL
, offsetof(Network
, match
.driver
), SD_BUS_VTABLE_PROPERTY_CONST
),
50 SD_BUS_PROPERTY("MatchType", "as", NULL
, offsetof(Network
, match
.iftype
), SD_BUS_VTABLE_PROPERTY_CONST
),
51 SD_BUS_PROPERTY("MatchName", "as", NULL
, offsetof(Network
, match
.ifname
), SD_BUS_VTABLE_PROPERTY_CONST
),
56 static char *network_bus_path(Network
*network
) {
57 _cleanup_free_
char *name
= NULL
;
58 char *networkname
, *d
, *path
;
62 assert(network
->filename
);
64 name
= strdup(network
->filename
);
68 networkname
= basename(name
);
70 d
= strrchr(networkname
, '.');
74 assert(streq(d
, ".network"));
78 r
= sd_bus_path_encode("/org/freedesktop/network1/network", networkname
, &path
);
85 int network_node_enumerator(sd_bus
*bus
, const char *path
, void *userdata
, char ***nodes
, sd_bus_error
*error
) {
86 _cleanup_strv_free_
char **l
= NULL
;
87 Manager
*m
= userdata
;
96 ORDERED_HASHMAP_FOREACH(network
, m
->networks
) {
99 p
= network_bus_path(network
);
103 r
= strv_consume(&l
, p
);
108 *nodes
= TAKE_PTR(l
);
113 int network_object_find(sd_bus
*bus
, const char *path
, const char *interface
, void *userdata
, void **found
, sd_bus_error
*error
) {
114 Manager
*m
= userdata
;
116 _cleanup_free_
char *name
= NULL
;
125 r
= sd_bus_path_decode(path
, "/org/freedesktop/network1/network", &name
);
129 r
= network_get_by_name(m
, name
, &network
);
138 const BusObjectImplementation network_object
= {
139 "/org/freedesktop/network1/network",
140 "org.freedesktop.network1.Network",
141 .fallback_vtables
= BUS_FALLBACK_VTABLES({network_vtable
, network_object_find
}),
142 .node_enumerator
= network_node_enumerator
,