diff options
author | Tom Gundersen <teg@jklm.no> | 2013-11-02 02:13:48 +0100 |
---|---|---|
committer | Tom Gundersen <teg@jklm.no> | 2013-11-04 23:00:12 +0100 |
commit | be32eb9b7fbcb22e4b648086d644135e38279633 (patch) | |
tree | 55e03fbd88788417614bd6f670c20e70a2be2460 /src/shared/net-util.c | |
parent | fc7689bc9ccf9b94f9a9f666f84c79b8f5b84791 (diff) |
net-config: start split out matching and parsing logic
Move this to src/share/net-util.c, so it can be used elsewhere.
Diffstat (limited to 'src/shared/net-util.c')
-rw-r--r-- | src/shared/net-util.c | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/src/shared/net-util.c b/src/shared/net-util.c new file mode 100644 index 0000000000..c4cb3337ae --- /dev/null +++ b/src/shared/net-util.c @@ -0,0 +1,169 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +/*** + This file is part of systemd. + + Copyright (C) 2013 Tom Gundersen <teg@jklm.no> + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see <http://www.gnu.org/licenses/>. +***/ + +#include <netinet/ether.h> +#include <net/if.h> + +#include "net-util.h" +#include "log.h" +#include "utf8.h" +#include "util.h" +#include "conf-parser.h" + +bool net_match_config(const struct ether_addr *match_mac, + const char *match_path, + const char *match_driver, + const char *match_type, + const char *match_name, + struct udev_device *device) { + const char *property; + + assert(device); + + if (match_mac) { + property = udev_device_get_sysattr_value(device, "address"); + if (!property || memcmp(match_mac, ether_aton(property), ETH_ALEN)) { + log_debug("Interface MAC address (%s) did not match MACAddress=%s", + property, ether_ntoa(match_mac)); + return 0; + } + } + + if (match_path) { + property = udev_device_get_property_value(device, "ID_PATH"); + if (!streq_ptr(match_path, property)) { + log_debug("Interface persistent path (%s) did not match Path=%s", + property, match_path); + return 0; + } + } + + if (match_driver) { + property = udev_device_get_driver(device); + if (!streq_ptr(match_driver, property)) { + log_debug("Interface device driver (%s) did not match Driver=%s", + property, match_driver); + return 0; + } + } + + if (match_type) { + property = udev_device_get_devtype(device); + if (!streq_ptr(match_type, property)) { + log_debug("Interface type (%s) did not match Type=%s", + property, match_type); + return 0; + } + } + + if (match_name) { + property = udev_device_get_sysname(device); + if (!streq_ptr(match_name, property)) { + log_debug("Interface name (%s) did not match Name=%s", + property, match_name); + return 0; + } + } + + return 1; +} + +int config_parse_ifname(const char *unit, + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + char **s = data; + char *n; + + assert(filename); + assert(lvalue); + assert(rvalue); + assert(data); + + n = strdup(rvalue); + if (!n) + return log_oom(); + + if (!ascii_is_valid(n) || strlen(n) >= IFNAMSIZ) { + log_syntax(unit, LOG_ERR, filename, line, EINVAL, + "Interface name is not ASCII clean or is too long, ignoring assignment: %s", rvalue); + free(n); + return 0; + } + + free(*s); + if (*n) + *s = n; + else { + free(n); + *s = NULL; + } + + return 0; +} + +int config_parse_hwaddr(const char *unit, + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + struct ether_addr **hwaddr = data; + struct ether_addr *n; + int r; + + assert(filename); + assert(lvalue); + assert(rvalue); + assert(data); + + n = new0(struct ether_addr, 1); + if (!n) + return log_oom(); + + r = sscanf(rvalue, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx", + &n->ether_addr_octet[0], + &n->ether_addr_octet[1], + &n->ether_addr_octet[2], + &n->ether_addr_octet[3], + &n->ether_addr_octet[4], + &n->ether_addr_octet[5]); + if (r != 6) { + log_syntax(unit, LOG_ERR, filename, line, EINVAL, + "Not a valid MAC address, ignoring assignment: %s", rvalue); + free(n); + return 0; + } + + free(*hwaddr); + *hwaddr = n; + + return 0; +} |