]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
netlink: make rtnl_resolve_link_alternative_name() optionally return the main interfa...
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 10 Jun 2021 09:17:47 +0000 (18:17 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 11 Jun 2021 18:19:08 +0000 (03:19 +0900)
src/libsystemd/sd-netlink/netlink-util.c
src/libsystemd/sd-netlink/netlink-util.h

index 4012725f4cd3e62a06e931d7afb08b47d6805356..1211145fbf84a7c8820a92399b7a699d2a2fd603 100644 (file)
@@ -267,13 +267,15 @@ int rtnl_set_link_alternative_names_by_ifname(sd_netlink **rtnl, const char *ifn
         return 0;
 }
 
-int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name) {
+int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name, char **ret) {
         _cleanup_(sd_netlink_unrefp) sd_netlink *our_rtnl = NULL;
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *message = NULL, *reply = NULL;
-        int r, ret;
+        int r, ifindex;
 
         assert(name);
 
+        /* This returns ifindex and the main interface name. */
+
         if (!ifname_valid_full(name, IFNAME_VALID_ALTERNATIVE))
                 return -EINVAL;
 
@@ -299,11 +301,18 @@ int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name) {
         if (r < 0)
                 return r;
 
-        r = sd_rtnl_message_link_get_ifindex(reply, &ret);
+        r = sd_rtnl_message_link_get_ifindex(reply, &ifindex);
         if (r < 0)
                 return r;
-        assert(ret > 0);
-        return ret;
+        assert(ifindex > 0);
+
+        if (ret) {
+                r = sd_netlink_message_read_string_strdup(message, IFLA_IFNAME, ret);
+                if (r < 0)
+                        return r;
+        }
+
+        return ifindex;
 }
 
 int rtnl_resolve_ifname(sd_netlink **rtnl, const char *name) {
@@ -317,7 +326,7 @@ int rtnl_resolve_ifname(sd_netlink **rtnl, const char *name) {
         if (r > 0)
                 return r;
 
-        return rtnl_resolve_link_alternative_name(rtnl, name);
+        return rtnl_resolve_link_alternative_name(rtnl, name, NULL);
 }
 
 int rtnl_resolve_interface(sd_netlink **rtnl, const char *name) {
index a4cdaaf8bd4c2c45a9cbc970137cc0c6ed2b4f5f..a5d725655dd4cce280bb7b175b854be7b0ab3062 100644 (file)
@@ -91,7 +91,7 @@ int rtnl_get_link_alternative_names(sd_netlink **rtnl, int ifindex, char ***ret)
 int rtnl_set_link_alternative_names(sd_netlink **rtnl, int ifindex, char * const *alternative_names);
 int rtnl_set_link_alternative_names_by_ifname(sd_netlink **rtnl, const char *ifname, char * const *alternative_names);
 int rtnl_delete_link_alternative_names(sd_netlink **rtnl, int ifindex, char * const *alternative_names);
-int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name);
+int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name, char **ret);
 int rtnl_resolve_ifname(sd_netlink **rtnl, const char *name);
 int rtnl_resolve_interface(sd_netlink **rtnl, const char *name);
 int rtnl_resolve_interface_or_warn(sd_netlink **rtnl, const char *name);