sd-netlink: introduce rtnl_rename_link()
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user