1 /* SPDX-License-Identifier: LGPL-2.1+ */
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 char buf
[ETHER_ADDR_TO_STRING_MAX
];
20 const struct ether_addr
*p
;
29 s
= *(Set
**) userdata
;
31 r
= sd_bus_message_open_container(reply
, 'a', "s");
35 SET_FOREACH(p
, s
, i
) {
36 r
= sd_bus_message_append(reply
, "s", ether_addr_to_string(p
, buf
));
41 return sd_bus_message_close_container(reply
);
44 const sd_bus_vtable network_vtable
[] = {
45 SD_BUS_VTABLE_START(0),
47 SD_BUS_PROPERTY("Description", "s", NULL
, offsetof(Network
, description
), SD_BUS_VTABLE_PROPERTY_CONST
),
48 SD_BUS_PROPERTY("SourcePath", "s", NULL
, offsetof(Network
, filename
), SD_BUS_VTABLE_PROPERTY_CONST
),
49 SD_BUS_PROPERTY("MatchMAC", "as", property_get_ether_addrs
, offsetof(Network
, match_mac
), SD_BUS_VTABLE_PROPERTY_CONST
),
50 SD_BUS_PROPERTY("MatchPath", "as", NULL
, offsetof(Network
, match_path
), SD_BUS_VTABLE_PROPERTY_CONST
),
51 SD_BUS_PROPERTY("MatchDriver", "as", NULL
, offsetof(Network
, match_driver
), SD_BUS_VTABLE_PROPERTY_CONST
),
52 SD_BUS_PROPERTY("MatchType", "as", NULL
, offsetof(Network
, match_type
), SD_BUS_VTABLE_PROPERTY_CONST
),
53 SD_BUS_PROPERTY("MatchName", "as", NULL
, offsetof(Network
, match_name
), SD_BUS_VTABLE_PROPERTY_CONST
),
58 static char *network_bus_path(Network
*network
) {
59 _cleanup_free_
char *name
= NULL
;
60 char *networkname
, *d
, *path
;
64 assert(network
->filename
);
66 name
= strdup(network
->filename
);
70 networkname
= basename(name
);
72 d
= strrchr(networkname
, '.');
76 assert(streq(d
, ".network"));
80 r
= sd_bus_path_encode("/org/freedesktop/network1/network", networkname
, &path
);
87 int network_node_enumerator(sd_bus
*bus
, const char *path
, void *userdata
, char ***nodes
, sd_bus_error
*error
) {
88 _cleanup_strv_free_
char **l
= NULL
;
89 Manager
*m
= userdata
;
99 ORDERED_HASHMAP_FOREACH(network
, m
->networks
, i
) {
102 p
= network_bus_path(network
);
106 r
= strv_consume(&l
, p
);
111 *nodes
= TAKE_PTR(l
);
116 int network_object_find(sd_bus
*bus
, const char *path
, const char *interface
, void *userdata
, void **found
, sd_bus_error
*error
) {
117 Manager
*m
= userdata
;
119 _cleanup_free_
char *name
= NULL
;
128 r
= sd_bus_path_decode(path
, "/org/freedesktop/network1/network", &name
);
132 r
= network_get_by_name(m
, name
, &network
);