1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 Copyright © 2015 Tom Gundersen
6 #include "alloc-util.h"
7 #include "ether-addr-util.h"
8 #include "networkd-manager.h"
9 #include "string-util.h"
12 static int property_get_ether_addrs(
15 const char *interface
,
17 sd_bus_message
*reply
,
19 sd_bus_error
*error
) {
21 char buf
[ETHER_ADDR_TO_STRING_MAX
];
22 const struct ether_addr
*p
;
31 s
= *(Set
**) userdata
;
33 r
= sd_bus_message_open_container(reply
, 'a', "s");
37 SET_FOREACH(p
, s
, i
) {
38 r
= sd_bus_message_append(reply
, "s", ether_addr_to_string(p
, buf
));
43 return sd_bus_message_close_container(reply
);
46 const sd_bus_vtable network_vtable
[] = {
47 SD_BUS_VTABLE_START(0),
49 SD_BUS_PROPERTY("Description", "s", NULL
, offsetof(Network
, description
), SD_BUS_VTABLE_PROPERTY_CONST
),
50 SD_BUS_PROPERTY("SourcePath", "s", NULL
, offsetof(Network
, filename
), SD_BUS_VTABLE_PROPERTY_CONST
),
51 SD_BUS_PROPERTY("MatchMAC", "as", property_get_ether_addrs
, offsetof(Network
, match_mac
), SD_BUS_VTABLE_PROPERTY_CONST
),
52 SD_BUS_PROPERTY("MatchPath", "as", NULL
, offsetof(Network
, match_path
), SD_BUS_VTABLE_PROPERTY_CONST
),
53 SD_BUS_PROPERTY("MatchDriver", "as", NULL
, offsetof(Network
, match_driver
), SD_BUS_VTABLE_PROPERTY_CONST
),
54 SD_BUS_PROPERTY("MatchType", "as", NULL
, offsetof(Network
, match_type
), SD_BUS_VTABLE_PROPERTY_CONST
),
55 SD_BUS_PROPERTY("MatchName", "as", NULL
, offsetof(Network
, match_name
), SD_BUS_VTABLE_PROPERTY_CONST
),
60 static char *network_bus_path(Network
*network
) {
61 _cleanup_free_
char *name
= NULL
;
62 char *networkname
, *d
, *path
;
66 assert(network
->filename
);
68 name
= strdup(network
->filename
);
72 networkname
= basename(name
);
74 d
= strrchr(networkname
, '.');
78 assert(streq(d
, ".network"));
82 r
= sd_bus_path_encode("/org/freedesktop/network1/network", networkname
, &path
);
89 int network_node_enumerator(sd_bus
*bus
, const char *path
, void *userdata
, char ***nodes
, sd_bus_error
*error
) {
90 _cleanup_strv_free_
char **l
= NULL
;
91 Manager
*m
= userdata
;
100 LIST_FOREACH(networks
, network
, m
->networks
) {
103 p
= network_bus_path(network
);
107 r
= strv_consume(&l
, p
);
112 *nodes
= TAKE_PTR(l
);
117 int network_object_find(sd_bus
*bus
, const char *path
, const char *interface
, void *userdata
, void **found
, sd_bus_error
*error
) {
118 Manager
*m
= userdata
;
120 _cleanup_free_
char *name
= NULL
;
129 r
= sd_bus_path_decode(path
, "/org/freedesktop/network1/network", &name
);
133 r
= network_get_by_name(m
, name
, &network
);