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");
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;
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,
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,
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)
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)
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)
*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) {
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 */
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);
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);
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)));
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)));