mirror of
https://github.com/systemd/systemd.git
synced 2025-09-01 13:59:26 +03:00
networkd: add network_get_by_name
This commit is contained in:
@ -481,6 +481,8 @@ void manager_free(Manager *m) {
|
|||||||
while ((network = m->networks))
|
while ((network = m->networks))
|
||||||
network_free(network);
|
network_free(network);
|
||||||
|
|
||||||
|
hashmap_free(m->networks_by_name);
|
||||||
|
|
||||||
while ((netdev = hashmap_first(m->netdevs)))
|
while ((netdev = hashmap_first(m->netdevs)))
|
||||||
netdev_unref(netdev);
|
netdev_unref(netdev);
|
||||||
hashmap_free(m->netdevs);
|
hashmap_free(m->netdevs);
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
static int network_load_one(Manager *manager, const char *filename) {
|
static int network_load_one(Manager *manager, const char *filename) {
|
||||||
_cleanup_network_free_ Network *network = NULL;
|
_cleanup_network_free_ Network *network = NULL;
|
||||||
_cleanup_fclose_ FILE *file = NULL;
|
_cleanup_fclose_ FILE *file = NULL;
|
||||||
|
char *d;
|
||||||
Route *route;
|
Route *route;
|
||||||
Address *address;
|
Address *address;
|
||||||
int r;
|
int r;
|
||||||
@ -84,6 +85,18 @@ static int network_load_one(Manager *manager, const char *filename) {
|
|||||||
if (!network->filename)
|
if (!network->filename)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
|
|
||||||
|
network->name = strdup(basename(filename));
|
||||||
|
if (!network->name)
|
||||||
|
return log_oom();
|
||||||
|
|
||||||
|
d = strrchr(network->name, '.');
|
||||||
|
if (!d)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
assert(streq(d, ".network"));
|
||||||
|
|
||||||
|
*d = '\0';
|
||||||
|
|
||||||
network->dhcp = ADDRESS_FAMILY_NO;
|
network->dhcp = ADDRESS_FAMILY_NO;
|
||||||
network->dhcp_ntp = true;
|
network->dhcp_ntp = true;
|
||||||
network->dhcp_dns = true;
|
network->dhcp_dns = true;
|
||||||
@ -115,6 +128,14 @@ static int network_load_one(Manager *manager, const char *filename) {
|
|||||||
|
|
||||||
LIST_PREPEND(networks, manager->networks, network);
|
LIST_PREPEND(networks, manager->networks, network);
|
||||||
|
|
||||||
|
r = hashmap_ensure_allocated(&manager->networks_by_name, &string_hash_ops);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
r = hashmap_put(manager->networks_by_name, network->name, network);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
LIST_FOREACH(routes, route, network->static_routes) {
|
LIST_FOREACH(routes, route, network->static_routes) {
|
||||||
if (!route->family) {
|
if (!route->family) {
|
||||||
log_warning("Route section without Gateway field configured in %s. "
|
log_warning("Route section without Gateway field configured in %s. "
|
||||||
@ -210,9 +231,16 @@ void network_free(Network *network) {
|
|||||||
hashmap_free(network->routes_by_section);
|
hashmap_free(network->routes_by_section);
|
||||||
hashmap_free(network->fdb_entries_by_section);
|
hashmap_free(network->fdb_entries_by_section);
|
||||||
|
|
||||||
if (network->manager && network->manager->networks)
|
if (network->manager) {
|
||||||
|
if (network->manager->networks)
|
||||||
LIST_REMOVE(networks, network->manager->networks, network);
|
LIST_REMOVE(networks, network->manager->networks, network);
|
||||||
|
|
||||||
|
if (network->manager->networks_by_name)
|
||||||
|
hashmap_remove(network->manager->networks_by_name, network->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(network->name);
|
||||||
|
|
||||||
condition_free_list(network->match_host);
|
condition_free_list(network->match_host);
|
||||||
condition_free_list(network->match_virt);
|
condition_free_list(network->match_virt);
|
||||||
condition_free_list(network->match_kernel);
|
condition_free_list(network->match_kernel);
|
||||||
@ -221,6 +249,22 @@ void network_free(Network *network) {
|
|||||||
free(network);
|
free(network);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int network_get_by_name(Manager *manager, const char *name, Network **ret) {
|
||||||
|
Network *network;
|
||||||
|
|
||||||
|
assert(manager);
|
||||||
|
assert(name);
|
||||||
|
assert(ret);
|
||||||
|
|
||||||
|
network = hashmap_get(manager->networks_by_name, name);
|
||||||
|
if (!network)
|
||||||
|
return -ENOENT;
|
||||||
|
|
||||||
|
*ret = network;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int network_get(Manager *manager, struct udev_device *device,
|
int network_get(Manager *manager, struct udev_device *device,
|
||||||
const char *ifname, const struct ether_addr *address,
|
const char *ifname, const struct ether_addr *address,
|
||||||
Network **ret) {
|
Network **ret) {
|
||||||
|
@ -97,6 +97,7 @@ struct Network {
|
|||||||
Manager *manager;
|
Manager *manager;
|
||||||
|
|
||||||
char *filename;
|
char *filename;
|
||||||
|
char *name;
|
||||||
|
|
||||||
struct ether_addr *match_mac;
|
struct ether_addr *match_mac;
|
||||||
char *match_path;
|
char *match_path;
|
||||||
@ -224,6 +225,7 @@ struct Manager {
|
|||||||
|
|
||||||
Hashmap *links;
|
Hashmap *links;
|
||||||
Hashmap *netdevs;
|
Hashmap *netdevs;
|
||||||
|
Hashmap *networks_by_name;
|
||||||
LIST_HEAD(Network, networks);
|
LIST_HEAD(Network, networks);
|
||||||
LIST_HEAD(AddressPool, address_pools);
|
LIST_HEAD(AddressPool, address_pools);
|
||||||
|
|
||||||
@ -265,6 +267,7 @@ void network_free(Network *network);
|
|||||||
DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
|
DEFINE_TRIVIAL_CLEANUP_FUNC(Network*, network_free);
|
||||||
#define _cleanup_network_free_ _cleanup_(network_freep)
|
#define _cleanup_network_free_ _cleanup_(network_freep)
|
||||||
|
|
||||||
|
int network_get_by_name(Manager *manager, const char *name, Network **ret);
|
||||||
int network_get(Manager *manager, struct udev_device *device,
|
int network_get(Manager *manager, struct udev_device *device,
|
||||||
const char *ifname, const struct ether_addr *mac,
|
const char *ifname, const struct ether_addr *mac,
|
||||||
Network **ret);
|
Network **ret);
|
||||||
|
Reference in New Issue
Block a user