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:
parent
3841288e5f
commit
0e44a7c085
@ -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");
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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)));
|
||||
|
Loading…
x
Reference in New Issue
Block a user