sd-netlink: introduce rtnl_rename_link()

This commit is contained in:
Yu Watanabe
2024-01-19 15:06:08 +09:00
parent 3e98379ec0
commit 6e931bc578
3 changed files with 52 additions and 0 deletions
+38
View File
@@ -20,6 +20,13 @@ static int set_link_name(sd_netlink **rtnl, int ifindex, const char *name) {
assert(name);
/* Assign the requested name. */
if (!*rtnl) {
r = sd_netlink_open(rtnl);
if (r < 0)
return r;
}
r = sd_rtnl_message_new_link(*rtnl, &message, RTM_SETLINK, ifindex);
if (r < 0)
return r;
@@ -31,6 +38,37 @@ static int set_link_name(sd_netlink **rtnl, int ifindex, const char *name) {
return sd_netlink_call(*rtnl, message, 0, NULL);
}
int rtnl_rename_link(sd_netlink **rtnl, const char *orig_name, const char *new_name) {
_cleanup_(sd_netlink_unrefp) sd_netlink *our_rtnl = NULL;
int r, ifindex;
assert(orig_name);
assert(new_name);
/* This does not check alternative names. Callers must check the requested name is not used as an
* alternative name. */
if (streq(orig_name, new_name))
return 0;
if (!ifname_valid(new_name))
return -EINVAL;
if (!rtnl)
rtnl = &our_rtnl;
if (!*rtnl) {
r = sd_netlink_open(rtnl);
if (r < 0)
return r;
}
ifindex = rtnl_resolve_ifname(rtnl, orig_name);
if (ifindex < 0)
return ifindex;
return set_link_name(rtnl, ifindex, new_name);
}
int rtnl_set_link_name(sd_netlink **rtnl, int ifindex, const char *name, char* const *alternative_names) {
_cleanup_strv_free_ char **original_altnames = NULL, **new_altnames = NULL;
bool altname_deleted = false;
+1
View File
@@ -31,6 +31,7 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(MultipathRoute*, multipath_route_free);
int multipath_route_dup(const MultipathRoute *m, MultipathRoute **ret);
int rtnl_rename_link(sd_netlink **rtnl, const char *orig_name, const char *new_name);
int rtnl_set_link_name(sd_netlink **rtnl, int ifindex, const char *name, char* const* alternative_names);
static inline int rtnl_append_link_alternative_names(sd_netlink **rtnl, int ifindex, char* const *alternative_names) {
return rtnl_set_link_name(rtnl, ifindex, NULL, alternative_names);
+13
View File
@@ -681,6 +681,19 @@ TEST(rtnl_set_link_name) {
_cleanup_free_ char *resolved = NULL;
assert_se(rtnl_resolve_link_alternative_name(&rtnl, "test-additional-name", &resolved) == ifindex);
assert_se(streq_ptr(resolved, "test-shortname"));
resolved = mfree(resolved);
assert_se(rtnl_rename_link(&rtnl, "test-shortname", "test-shortname") >= 0);
assert_se(rtnl_rename_link(&rtnl, "test-shortname", "test-shortname2") >= 0);
assert_se(rtnl_rename_link(NULL, "test-shortname2", "test-shortname3") >= 0);
assert_se(rtnl_resolve_link_alternative_name(&rtnl, "test-additional-name", &resolved) == ifindex);
assert_se(streq_ptr(resolved, "test-shortname3"));
resolved = mfree(resolved);
assert_se(rtnl_resolve_link_alternative_name(&rtnl, "test-shortname3", &resolved) == ifindex);
assert_se(streq_ptr(resolved, "test-shortname3"));
resolved = mfree(resolved);
}
DEFINE_TEST_MAIN(LOG_DEBUG);