diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2022-10-31 10:14:30 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2022-11-01 11:35:27 +0900 |
commit | 2401f920f351a4b15560f61b3008328d2f9b87fa (patch) | |
tree | 7ce151524888dc86cf4434a99eeb6300509a969a /src/network | |
parent | e53f43fee81626c473569cb753029ab9efff5328 (diff) | |
download | systemd-2401f920f351a4b15560f61b3008328d2f9b87fa.tar.gz |
wait-online: split out link_update_name()
No functional changes, just refactoring and preparation for later
commits.
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/wait-online/link.c | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/src/network/wait-online/link.c b/src/network/wait-online/link.c index e197e62e26..f379578355 100644 --- a/src/network/wait-online/link.c +++ b/src/network/wait-online/link.c @@ -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; } |