summaryrefslogtreecommitdiff
path: root/src/network
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2022-10-31 10:14:30 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2022-11-01 11:35:27 +0900
commit2401f920f351a4b15560f61b3008328d2f9b87fa (patch)
tree7ce151524888dc86cf4434a99eeb6300509a969a /src/network
parente53f43fee81626c473569cb753029ab9efff5328 (diff)
downloadsystemd-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.c44
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;
}