From: Yu Watanabe Date: Fri, 2 Oct 2020 02:52:21 +0000 (+0900) Subject: network: introduce link_deserialize_addresses() X-Git-Tag: v247-rc1~117^2~49 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=da4d3a612d8c39628dd46fc42bc47b7315f8f0c5;p=thirdparty%2Fsystemd.git network: introduce link_deserialize_addresses() --- diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 4100e92ae0a..4dc967b4353 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -1238,6 +1238,51 @@ int link_serialize_addresses(Link *link, FILE *f) { return 0; } +int link_deserialize_addresses(Link *link, const char *addresses) { + int r; + + assert(link); + + for (const char *p = addresses;; ) { + _cleanup_free_ char *address_str = NULL; + union in_addr_union address; + unsigned char prefixlen; + char *prefixlen_str; + int family; + + r = extract_first_word(&p, &address_str, NULL, 0); + if (r < 0) + return log_link_debug_errno(link, r, "Failed to parse ADDRESSES=: %m"); + if (r == 0) + return 0; + + prefixlen_str = strchr(address_str, '/'); + if (!prefixlen_str) { + log_link_debug(link, "Failed to parse address and prefix length, ignoring: %s", address_str); + continue; + } + *prefixlen_str++ = '\0'; + + r = sscanf(prefixlen_str, "%hhu", &prefixlen); + if (r != 1) { + log_link_debug(link, "Failed to parse prefixlen: %s", prefixlen_str); + continue; + } + + r = in_addr_from_string_auto(address_str, &family, &address); + if (r < 0) { + log_link_debug_errno(link, r, "Failed to parse address: %s", address_str); + continue; + } + + r = address_add(link, family, &address, prefixlen, NULL); + if (r < 0) + log_link_debug_errno(link, r, "Failed to add address: %m"); + } + + return 0; +} + static void static_address_on_acd(sd_ipv4acd *acd, int event, void *userdata) { _cleanup_free_ char *pretty = NULL; Address *address; diff --git a/src/network/networkd-address.h b/src/network/networkd-address.h index 0eb8f298dc9..52774d48aa6 100644 --- a/src/network/networkd-address.h +++ b/src/network/networkd-address.h @@ -78,6 +78,7 @@ int link_set_addresses(Link *link); int link_drop_addresses(Link *link); int link_drop_foreign_addresses(Link *link); int link_serialize_addresses(Link *link, FILE *f); +int link_deserialize_addresses(Link *link, const char *addresses); int manager_rtnl_process_address(sd_netlink *nl, sd_netlink_message *message, Manager *m); diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index cfc6d188e9b..f21be252094 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -3087,41 +3087,9 @@ static int link_load(Link *link) { network_file_fail: - for (const char *p = addresses; p; ) { - _cleanup_free_ char *address_str = NULL; - char *prefixlen_str; - int family; - unsigned char prefixlen; - - r = extract_first_word(&p, &address_str, NULL, 0); - if (r < 0) - log_link_warning_errno(link, r, "failed to parse ADDRESSES: %m"); - if (r <= 0) - break; - - prefixlen_str = strchr(address_str, '/'); - if (!prefixlen_str) { - log_link_debug(link, "Failed to parse address and prefix length %s", address_str); - continue; - } - *prefixlen_str++ = '\0'; - - r = sscanf(prefixlen_str, "%hhu", &prefixlen); - if (r != 1) { - log_link_error(link, "Failed to parse prefixlen %s", prefixlen_str); - continue; - } - - r = in_addr_from_string_auto(address_str, &family, &address); - if (r < 0) { - log_link_debug_errno(link, r, "Failed to parse address %s: %m", address_str); - continue; - } - - r = address_add(link, family, &address, prefixlen, NULL); - if (r < 0) - return log_link_error_errno(link, r, "Failed to add address: %m"); - } + r = link_deserialize_addresses(link, addresses); + if (r < 0) + log_link_warning_errno(link, r, "Failed to load addresses from %s, ignoring: %m", link->state_file); r = link_deserialize_routes(link, routes); if (r < 0)