]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
netlink-util: merge rtnl_get_link_info() and rtnl_get_ifname_full() into rtnl_get_lin...
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 5 Mar 2025 21:30:15 +0000 (06:30 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 12 Mar 2025 16:48:50 +0000 (01:48 +0900)
Then, this makes rtnl_get_ifname_full() and friends as inline wrappers of
rtnl_get_link_info_full().

src/libsystemd-network/test-ndisc-send.c
src/libsystemd/sd-device/sd-device.c
src/libsystemd/sd-netlink/netlink-util.c
src/libsystemd/sd-netlink/netlink-util.h
src/libsystemd/sd-netlink/test-netlink.c

index 1b1b27d63478acf2c132eac03ac1838ac62e1376..85897e3797fc20a79b5c1d130f26794634f95ccc 100644 (file)
@@ -297,12 +297,7 @@ static int parse_argv(int argc, char *argv[]) {
         if (arg_set_source_mac) {
                 struct hw_addr_data hw_addr;
 
-                r = rtnl_get_link_info(&rtnl, arg_ifindex,
-                                       /* ret_iftype = */ NULL,
-                                       /* ret_flags = */ NULL,
-                                       /* ret_kind = */ NULL,
-                                       &hw_addr,
-                                       /* ret_permanent_hw_addr = */ NULL);
+                r = rtnl_get_link_hw_addr(&rtnl, arg_ifindex, &hw_addr);
                 if (r < 0)
                         return log_error_errno(r, "Failed to get the source link-layer address: %m");
 
index b7b308b390880f3416b675c99f854719c22c60c1..75bf545aff207415770832c095673b21cb243b60 100644 (file)
@@ -366,7 +366,7 @@ _public_ int sd_device_new_from_ifindex(sd_device **ret, int ifindex) {
         assert_return(ret, -EINVAL);
         assert_return(ifindex > 0, -EINVAL);
 
-        r = rtnl_get_ifname_full(NULL, ifindex, &ifname, NULL);
+        r = rtnl_get_ifname(NULL, ifindex, &ifname);
         if (r < 0)
                 return r;
 
index 5aa6da7b83e58e4750983aea05a214f3cc5b0f67..56104a5b6495de7a5fa2142d2c21ffd60e0540ab 100644 (file)
@@ -52,34 +52,6 @@ static int parse_newlink_message(
         return ifindex;
 }
 
-int rtnl_get_ifname_full(sd_netlink **rtnl, int ifindex, char **ret_name, char ***ret_altnames) {
-        _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *message = NULL, *reply = NULL;
-        _cleanup_(sd_netlink_unrefp) sd_netlink *our_rtnl = NULL;
-        int r;
-
-        assert(ifindex > 0);
-
-        /* This is similar to if_indextoname(), but also optionally provides alternative names. */
-
-        if (!rtnl)
-                rtnl = &our_rtnl;
-        if (!*rtnl) {
-                r = sd_netlink_open(rtnl);
-                if (r < 0)
-                        return r;
-        }
-
-        r = sd_rtnl_message_new_link(*rtnl, &message, RTM_GETLINK, ifindex);
-        if (r < 0)
-                return r;
-
-        r = sd_netlink_call(*rtnl, message, 0, &reply);
-        if (r < 0)
-                return r;
-
-        return parse_newlink_message(reply, ret_name, ret_altnames);
-}
-
 int rtnl_resolve_ifname_full(
                   sd_netlink **rtnl,
                   ResolveInterfaceNameFlag flags,
@@ -490,9 +462,11 @@ int rtnl_set_link_alternative_names_by_ifname(
         return 0;
 }
 
-int rtnl_get_link_info(
+int rtnl_get_link_info_full(
                 sd_netlink **rtnl,
                 int ifindex,
+                char **ret_name,
+                char ***ret_altnames,
                 unsigned short *ret_iftype,
                 unsigned *ret_flags,
                 char **ret_kind,
@@ -500,18 +474,18 @@ int rtnl_get_link_info(
                 struct hw_addr_data *ret_permanent_hw_addr) {
 
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *message = NULL, *reply = NULL;
+        _cleanup_(sd_netlink_unrefp) sd_netlink *our_rtnl = NULL;
         struct hw_addr_data addr = HW_ADDR_NULL, perm_addr = HW_ADDR_NULL;
-        _cleanup_free_ char *kind = NULL;
+        _cleanup_free_ char *name = NULL, *kind = NULL;
+        _cleanup_strv_free_ char **altnames = NULL;
         unsigned short iftype;
         unsigned flags;
         int r;
 
-        assert(rtnl);
         assert(ifindex > 0);
 
-        if (!ret_iftype && !ret_flags && !ret_kind && !ret_hw_addr && !ret_permanent_hw_addr)
-                return 0;
-
+        if (!rtnl)
+                rtnl = &our_rtnl;
         if (!*rtnl) {
                 r = sd_netlink_open(rtnl);
                 if (r < 0)
@@ -528,6 +502,12 @@ int rtnl_get_link_info(
         if (r < 0)
                 return r;
 
+        r = parse_newlink_message(reply, ret_name ? &name : NULL, ret_altnames ? &altnames : NULL);
+        if (r < 0)
+                return r;
+        if (r != ifindex)
+                return -EIO;
+
         if (ret_iftype) {
                 r = sd_rtnl_message_link_get_type(reply, &iftype);
                 if (r < 0)
@@ -565,6 +545,10 @@ int rtnl_get_link_info(
                         return r;
         }
 
+        if (ret_name)
+                *ret_name = TAKE_PTR(name);
+        if (ret_altnames)
+                *ret_altnames = TAKE_PTR(altnames);
         if (ret_iftype)
                 *ret_iftype = iftype;
         if (ret_flags)
@@ -575,7 +559,7 @@ int rtnl_get_link_info(
                 *ret_hw_addr = addr;
         if (ret_permanent_hw_addr)
                 *ret_permanent_hw_addr = perm_addr;
-        return 0;
+        return ifindex;
 }
 
 int rtnl_log_parse_error(int r) {
index 4ba64f0f93390efac369f1da9592e6c913c910e3..a31c0208ae2fc7961bd0844df6605afcb1992de5 100644 (file)
@@ -19,7 +19,65 @@ typedef struct RouteVia {
         union in_addr_union address;
 } _packed_ RouteVia;
 
-int rtnl_get_ifname_full(sd_netlink **rtnl, int ifindex, char **ret_name, char ***ret_altnames);
+int rtnl_get_link_info_full(
+                sd_netlink **rtnl,
+                int ifindex,
+                char **ret_name,
+                char ***ret_altnames,
+                unsigned short *ret_iftype,
+                unsigned *ret_flags,
+                char **ret_kind,
+                struct hw_addr_data *ret_hw_addr,
+                struct hw_addr_data *ret_permanent_hw_addr);
+
+static inline int rtnl_get_ifname_full(sd_netlink **rtnl, int ifindex, char **ret_name, char ***ret_altnames) {
+        return rtnl_get_link_info_full(
+                        rtnl,
+                        ifindex,
+                        ret_name,
+                        ret_altnames,
+                        /* ret_iftype = */ NULL,
+                        /* ret_flags = */ NULL,
+                        /* ret_kind = */ NULL,
+                        /* ret_hw_addr = */ NULL,
+                        /* ret_permanent_hw_addr = */ NULL);
+}
+static inline int rtnl_get_ifname(sd_netlink **rtnl, int ifindex, char **ret) {
+        return rtnl_get_ifname_full(rtnl, ifindex, ret, NULL);
+}
+static inline int rtnl_get_link_alternative_names(sd_netlink **rtnl, int ifindex, char ***ret) {
+        return rtnl_get_ifname_full(rtnl, ifindex, NULL, ret);
+}
+static inline int rtnl_get_link_info(
+                sd_netlink **rtnl,
+                int ifindex,
+                unsigned short *ret_iftype,
+                unsigned *ret_flags,
+                char **ret_kind,
+                struct hw_addr_data *ret_hw_addr,
+                struct hw_addr_data *ret_permanent_hw_addr) {
+
+        return rtnl_get_link_info_full(
+                        rtnl,
+                        ifindex,
+                        /* ret_name = */ NULL,
+                        /* ret_altnames = */ NULL,
+                        ret_iftype,
+                        ret_flags,
+                        ret_kind,
+                        ret_hw_addr,
+                        ret_permanent_hw_addr);
+}
+static inline int rtnl_get_link_hw_addr(sd_netlink **rtnl, int ifindex, struct hw_addr_data *ret) {
+        return rtnl_get_link_info(
+                        rtnl,
+                        ifindex,
+                        /* ret_iftype = */ NULL,
+                        /* ret_flags = */ NULL,
+                        /* ret_kind = */ NULL,
+                        ret,
+                        /* ret_permanent_hw_addr = */ NULL);
+}
 
 typedef enum ResolveInterfaceNameFlag {
         RESOLVE_IFNAME_MAIN        = 1 << 0, /* resolve main interface name */
@@ -51,9 +109,6 @@ int rtnl_set_link_properties(
                 uint32_t mtu,
                 uint32_t gso_max_size,
                 size_t gso_max_segments);
-static inline int rtnl_get_link_alternative_names(sd_netlink **rtnl, int ifindex, char ***ret) {
-        return rtnl_get_ifname_full(rtnl, ifindex, NULL, 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);
@@ -77,15 +132,6 @@ static inline int rtnl_resolve_interface_or_warn(sd_netlink **rtnl, const char *
         return r;
 }
 
-int rtnl_get_link_info(
-                sd_netlink **rtnl,
-                int ifindex,
-                unsigned short *ret_iftype,
-                unsigned *ret_flags,
-                char **ret_kind,
-                struct hw_addr_data *ret_hw_addr,
-                struct hw_addr_data *ret_permanent_hw_addr);
-
 int rtnl_log_parse_error(int r);
 int rtnl_log_create_error(int r);
 
index 2aeb5eefee303d6c7aba7c45305903becb322de5..7c1bd0d9df456c23f92353ff5e3f7947a6d87561 100644 (file)
@@ -673,12 +673,13 @@ TEST(rtnl_set_link_name) {
         ASSERT_OK(rtnl_delete_link_alternative_names(&rtnl, ifindex, STRV_MAKE("testlongalternativename")));
 
         ASSERT_NULL((alternative_names = strv_free(alternative_names)));
-        ASSERT_OK(rtnl_get_link_alternative_names(&rtnl, ifindex, &alternative_names));
+        ASSERT_OK_EQ(rtnl_get_link_alternative_names(&rtnl, ifindex, &alternative_names), ifindex);
         ASSERT_FALSE(strv_contains(alternative_names, "testlongalternativename"));
         ASSERT_TRUE(strv_contains(alternative_names, "test-additional-name"));
         ASSERT_FALSE(strv_contains(alternative_names, "test-shortname"));
 
         _cleanup_free_ char *resolved = NULL;
+        ASSERT_OK_EQ(rtnl_resolve_link_alternative_name(&rtnl, "test-additional-name", NULL), ifindex);
         ASSERT_OK_EQ(rtnl_resolve_link_alternative_name(&rtnl, "test-additional-name", &resolved), ifindex);
         ASSERT_STREQ(resolved, "test-shortname");
         ASSERT_NULL((resolved = mfree(resolved)));
@@ -687,10 +688,12 @@ TEST(rtnl_set_link_name) {
         ASSERT_OK(rtnl_rename_link(&rtnl, "test-shortname", "test-shortname2"));
         ASSERT_OK(rtnl_rename_link(NULL, "test-shortname2", "test-shortname3"));
 
+        ASSERT_OK_EQ(rtnl_resolve_link_alternative_name(&rtnl, "test-additional-name", NULL), ifindex);
         ASSERT_OK_EQ(rtnl_resolve_link_alternative_name(&rtnl, "test-additional-name", &resolved), ifindex);
         ASSERT_STREQ(resolved, "test-shortname3");
         ASSERT_NULL((resolved = mfree(resolved)));
 
+        ASSERT_OK_EQ(rtnl_resolve_link_alternative_name(&rtnl, "test-shortname3", NULL), ifindex);
         ASSERT_OK_EQ(rtnl_resolve_link_alternative_name(&rtnl, "test-shortname3", &resolved), ifindex);
         ASSERT_STREQ(resolved, "test-shortname3");
         ASSERT_NULL((resolved = mfree(resolved)));