1
0
mirror of https://github.com/systemd/systemd.git synced 2025-03-19 22:50:17 +03:00

netlink-util: merge rtnl_get_link_info() and rtnl_get_ifname_full() into rtnl_get_link_info_full()

Then, this makes rtnl_get_ifname_full() and friends as inline wrappers of
rtnl_get_link_info_full().
This commit is contained in:
Yu Watanabe 2025-03-06 06:30:15 +09:00
parent 3841288e5f
commit 0e44a7c085
5 changed files with 84 additions and 56 deletions

View 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");

View 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;

View 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) {

View 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);

View 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)));