1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Tom Gundersen <teg@jklm.no>
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
24 #include "path-util.h"
25 #include "conf-files.h"
26 #include "conf-parser.h"
29 static int network_load_one(Manager *manager, const char *filename) {
30 _cleanup_network_free_ Network *network = NULL;
31 _cleanup_fclose_ FILE *file = NULL;
37 file = fopen(filename, "re");
45 network = new0(Network, 1);
49 network->manager = manager;
51 LIST_HEAD_INIT(network->static_addresses);
52 LIST_HEAD_INIT(network->static_routes);
54 network->addresses_by_section = hashmap_new(uint64_hash_func, uint64_compare_func);
55 if (!network->addresses_by_section)
58 network->routes_by_section = hashmap_new(uint64_hash_func, uint64_compare_func);
59 if (!network->routes_by_section)
62 network->filename = strdup(filename);
63 if (!network->filename)
66 r = config_parse(NULL, filename, file, "Match\0Network\0Address\0Route\0", config_item_perf_lookup,
67 (void*) network_gperf_lookup, false, false, network);
69 log_warning("Could not parse config file %s: %s", filename, strerror(-r));
73 LIST_PREPEND(networks, manager->networks, network);
79 int network_load(Manager *manager) {
81 _cleanup_strv_free_ char **files = NULL;
87 while ((network = manager->networks))
88 network_free(network);
90 r = conf_files_list_strv(&files, ".network", NULL, (const char **)manager->network_dirs);
92 log_error("Failed to enumerate network files: %s", strerror(-r));
96 STRV_FOREACH_BACKWARDS(f, files) {
97 r = network_load_one(manager, *f);
105 void network_free(Network *network) {
112 assert(network->manager);
114 free(network->filename);
116 free(network->match_mac);
117 free(network->match_path);
118 free(network->match_driver);
119 free(network->match_type);
120 free(network->match_name);
122 free(network->description);
124 while ((route = network->static_routes))
127 while ((address = network->static_addresses))
128 address_free(address);
130 hashmap_free(network->addresses_by_section);
131 hashmap_free(network->routes_by_section);
133 if (network->manager->networks)
134 LIST_REMOVE(networks, network->manager->networks, network);
139 int network_get(Manager *manager, struct udev_device *device, Network **ret) {
146 if (manager_should_reload(manager))
147 manager_load_config(manager);
149 LIST_FOREACH(networks, network, manager->networks) {
150 if (net_match_config(network->match_mac, network->match_path,
151 network->match_driver, network->match_type,
153 udev_device_get_sysattr_value(device, "address"),
154 udev_device_get_property_value(device, "ID_PATH"),
155 udev_device_get_driver(device),
156 udev_device_get_devtype(device),
157 udev_device_get_sysname(device))) {
158 log_debug("%s: found matching network '%s'",
159 udev_device_get_sysname(device),
171 int network_apply(Manager *manager, Network *network, Link *link) {
174 link->network = network;
176 r = link_configure(link);
183 int config_parse_bridge(const char *unit,
184 const char *filename,
187 unsigned section_line,
193 Network *network = userdata;
202 r = bridge_get(network->manager, rvalue, &bridge);
204 log_syntax(unit, LOG_ERR, filename, line, EINVAL,
205 "Bridge is invalid, ignoring assignment: %s", rvalue);
209 network->bridge = bridge;