diff --git a/src/libsystemd-network/test-ndisc-send.c b/src/libsystemd-network/test-ndisc-send.c index 1b1b27d6347..85897e3797f 100644 --- a/src/libsystemd-network/test-ndisc-send.c +++ b/src/libsystemd-network/test-ndisc-send.c @@ -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"); diff --git a/src/libsystemd/sd-device/sd-device.c b/src/libsystemd/sd-device/sd-device.c index b7b308b3908..75bf545aff2 100644 --- a/src/libsystemd/sd-device/sd-device.c +++ b/src/libsystemd/sd-device/sd-device.c @@ -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; diff --git a/src/libsystemd/sd-netlink/netlink-util.c b/src/libsystemd/sd-netlink/netlink-util.c index 5aa6da7b83e..56104a5b649 100644 --- a/src/libsystemd/sd-netlink/netlink-util.c +++ b/src/libsystemd/sd-netlink/netlink-util.c @@ -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) { diff --git a/src/libsystemd/sd-netlink/netlink-util.h b/src/libsystemd/sd-netlink/netlink-util.h index 4ba64f0f933..a31c0208ae2 100644 --- a/src/libsystemd/sd-netlink/netlink-util.h +++ b/src/libsystemd/sd-netlink/netlink-util.h @@ -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); diff --git a/src/libsystemd/sd-netlink/test-netlink.c b/src/libsystemd/sd-netlink/test-netlink.c index 2aeb5eefee3..7c1bd0d9df4 100644 --- a/src/libsystemd/sd-netlink/test-netlink.c +++ b/src/libsystemd/sd-netlink/test-netlink.c @@ -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)));