]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: introduce link_deserialize_addresses()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 2 Oct 2020 02:52:21 +0000 (11:52 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 6 Oct 2020 17:50:50 +0000 (02:50 +0900)
src/network/networkd-address.c
src/network/networkd-address.h
src/network/networkd-link.c

index 4100e92ae0a6ae3983a898faf71b77bfa72290af..4dc967b435391a1b6d1b74fba5fa1b8aca89fa78 100644 (file)
@@ -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;
index 0eb8f298dc9803b24cf64ffc0122b76fc8086b69..52774d48aa6c841af2a1efe70582c6c48ceb3e19 100644 (file)
@@ -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);
 
index cfc6d188e9b02eba2b4ed1c5a091f934b1e75604..f21be252094a5ec7c341cc5b8c73a9f2fe62101e 100644 (file)
@@ -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)