]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
wait-online: split out link_update_name()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 31 Oct 2022 01:14:30 +0000 (10:14 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 1 Nov 2022 02:35:27 +0000 (11:35 +0900)
No functional changes, just refactoring and preparation for later
commits.

src/network/wait-online/link.c

index e197e62e26e6af65c023946b255cd33c195aa9b5..f379578355ca35c9975b03deafefef4b9dc509f4 100644 (file)
@@ -3,6 +3,7 @@
 #include "sd-network.h"
 
 #include "alloc-util.h"
+#include "format-util.h"
 #include "hashmap.h"
 #include "link.h"
 #include "manager.h"
@@ -62,7 +63,7 @@ Link *link_free(Link *l) {
         return mfree(l);
  }
 
-int link_update_rtnl(Link *l, sd_netlink_message *m) {
+static int link_update_name(Link *l, sd_netlink_message *m) {
         const char *ifname;
         int r;
 
@@ -70,28 +71,43 @@ int link_update_rtnl(Link *l, sd_netlink_message *m) {
         assert(l->manager);
         assert(m);
 
-        r = sd_rtnl_message_link_get_flags(m, &l->flags);
+        r = sd_netlink_message_read_string(m, IFLA_IFNAME, &ifname);
+        if (r == -ENODATA)
+                /* Hmm? But ok. */
+                return 0;
         if (r < 0)
                 return r;
 
-        r = sd_netlink_message_read_string(m, IFLA_IFNAME, &ifname);
+        if (streq(ifname, l->ifname))
+                return 0;
+
+        hashmap_remove(l->manager->links_by_name, l->ifname);
+
+        r = free_and_strdup(&l->ifname, ifname);
         if (r < 0)
                 return r;
 
-        if (!streq(l->ifname, ifname)) {
-                char *new_ifname;
+        r = hashmap_ensure_put(&l->manager->links_by_name, &string_hash_ops, l->ifname, l);
+        if (r < 0)
+                return r;
+
+        return 0;
+}
+
+int link_update_rtnl(Link *l, sd_netlink_message *m) {
+        int r;
 
-                new_ifname = strdup(ifname);
-                if (!new_ifname)
-                        return -ENOMEM;
+        assert(l);
+        assert(l->manager);
+        assert(m);
 
-                assert_se(hashmap_remove(l->manager->links_by_name, l->ifname) == l);
-                free_and_replace(l->ifname, new_ifname);
+        r = sd_rtnl_message_link_get_flags(m, &l->flags);
+        if (r < 0)
+                return r;
 
-                r = hashmap_put(l->manager->links_by_name, l->ifname, l);
-                if (r < 0)
-                        return r;
-        }
+        r = link_update_name(l, m);
+        if (r < 0)
+                return r;
 
         return 0;
 }