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 "string-util.h"
9 static int property_get_ether_addrs(
12 const char *interface
,
14 sd_bus_message
*reply
,
16 sd_bus_error
*error
) {
18 char buf
[ETHER_ADDR_TO_STRING_MAX
];
19 const struct ether_addr
*p
;
28 s
= *(Set
**) userdata
;
30 r
= sd_bus_message_open_container(reply
, 'a', "s");
34 SET_FOREACH(p
, s
, i
) {
35 r
= sd_bus_message_append(reply
, "s", ether_addr_to_string(p
, buf
));
40 return sd_bus_message_close_container(reply
);
43 const sd_bus_vtable network_vtable
[] = {
44 SD_BUS_VTABLE_START(0),
46 SD_BUS_PROPERTY("Description", "s", NULL
, offsetof(Network
, description
), SD_BUS_VTABLE_PROPERTY_CONST
),
47 SD_BUS_PROPERTY("SourcePath", "s", NULL
, offsetof(Network
, filename
), SD_BUS_VTABLE_PROPERTY_CONST
),
48 SD_BUS_PROPERTY("MatchMAC", "as", property_get_ether_addrs
, offsetof(Network
, match_mac
), SD_BUS_VTABLE_PROPERTY_CONST
),
49 SD_BUS_PROPERTY("MatchPath", "as", NULL
, offsetof(Network
, match_path
), SD_BUS_VTABLE_PROPERTY_CONST
),
50 SD_BUS_PROPERTY("MatchDriver", "as", NULL
, offsetof(Network
, match_driver
), SD_BUS_VTABLE_PROPERTY_CONST
),
51 SD_BUS_PROPERTY("MatchType", "as", NULL
, offsetof(Network
, match_type
), SD_BUS_VTABLE_PROPERTY_CONST
),
52 SD_BUS_PROPERTY("MatchName", "as", NULL
, offsetof(Network
, match_name
), SD_BUS_VTABLE_PROPERTY_CONST
),
57 static char *network_bus_path(Network
*network
) {
58 _cleanup_free_
char *name
= NULL
;
59 char *networkname
, *d
, *path
;
63 assert(network
->filename
);
65 name
= strdup(network
->filename
);
69 networkname
= basename(name
);
71 d
= strrchr(networkname
, '.');
75 assert(streq(d
, ".network"));
79 r
= sd_bus_path_encode("/org/freedesktop/network1/network", networkname
, &path
);
86 int network_node_enumerator(sd_bus
*bus
, const char *path
, void *userdata
, char ***nodes
, sd_bus_error
*error
) {
87 _cleanup_strv_free_
char **l
= NULL
;
88 Manager
*m
= userdata
;
97 LIST_FOREACH(networks
, network
, m
->networks
) {
100 p
= network_bus_path(network
);
104 r
= strv_consume(&l
, p
);
109 *nodes
= TAKE_PTR(l
);
114 int network_object_find(sd_bus
*bus
, const char *path
, const char *interface
, void *userdata
, void **found
, sd_bus_error
*error
) {
115 Manager
*m
= userdata
;
117 _cleanup_free_
char *name
= NULL
;
126 r
= sd_bus_path_decode(path
, "/org/freedesktop/network1/network", &name
);
130 r
= network_get_by_name(m
, name
, &network
);