assert(on);
assert(off);
- if (streq_ptr(state, "routable")) {
+ if (STRPTR_IN_SET(state, "routable", "enslaved")) {
*on = ansi_highlight_green();
*off = ansi_normal();
} else if (streq_ptr(state, "degraded")) {
return CMP(a->ifindex, b->ifindex);
}
-static int decode_link(sd_netlink_message *m, LinkInfo *info) {
+static int decode_link(sd_netlink_message *m, LinkInfo *info, char **patterns) {
const char *name;
uint16_t type;
- int r;
+ int ifindex, r;
assert(m);
assert(info);
if (type != RTM_NEWLINK)
return 0;
- r = sd_rtnl_message_link_get_ifindex(m, &info->ifindex);
+ r = sd_rtnl_message_link_get_ifindex(m, &ifindex);
if (r < 0)
return r;
if (r < 0)
return r;
+ if (patterns) {
+ char str[DECIMAL_STR_MAX(int)];
+
+ xsprintf(str, "%i", ifindex);
+
+ if (!strv_fnmatch(patterns, str, 0) && !strv_fnmatch(patterns, name, 0))
+ return 0;
+ }
+
r = sd_rtnl_message_link_get_type(m, &info->iftype);
if (r < 0)
return r;
strscpy(info->name, sizeof info->name, name);
+ info->ifindex = ifindex;
info->has_mac_address =
sd_netlink_message_read_ether_addr(m, IFLA_ADDRESS, &info->mac_address) >= 0 &&
return 1;
}
-static int acquire_link_info_strv(sd_netlink *rtnl, char **l, LinkInfo **ret) {
- _cleanup_free_ LinkInfo *links = NULL;
- char **i;
- size_t c = 0;
- int r;
-
- assert(rtnl);
- assert(ret);
-
- links = new(LinkInfo, strv_length(l));
- if (!links)
- return log_oom();
-
- STRV_FOREACH(i, l) {
- _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL, *reply = NULL;
- int ifindex;
-
- if (parse_ifindex(*i, &ifindex) >= 0)
- r = sd_rtnl_message_new_link(rtnl, &req, RTM_GETLINK, ifindex);
- else {
- r = sd_rtnl_message_new_link(rtnl, &req, RTM_GETLINK, 0);
- if (r < 0)
- return rtnl_log_create_error(r);
-
- r = sd_netlink_message_append_string(req, IFLA_IFNAME, *i);
- }
- if (r < 0)
- return rtnl_log_create_error(r);
-
- r = sd_netlink_call(rtnl, req, 0, &reply);
- if (r < 0)
- return log_error_errno(r, "Failed to request link: %m");
-
- r = decode_link(reply, links + c);
- if (r < 0)
- return r;
- if (r > 0)
- c++;
- }
-
- typesafe_qsort(links, c, link_info_compare);
-
- *ret = TAKE_PTR(links);
-
- return (int) c;
-}
-
-static int acquire_link_info_all(sd_netlink *rtnl, LinkInfo **ret) {
+static int acquire_link_info(sd_netlink *rtnl, char **patterns, LinkInfo **ret) {
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL, *reply = NULL;
_cleanup_free_ LinkInfo *links = NULL;
size_t allocated = 0, c = 0;
if (!GREEDY_REALLOC(links, allocated, c+1))
return -ENOMEM;
- r = decode_link(i, links + c);
+ r = decode_link(i, links + c, patterns);
if (r < 0)
return r;
if (r > 0)
if (r < 0)
return log_error_errno(r, "Failed to connect to netlink: %m");
- if (argc > 1)
- c = acquire_link_info_strv(rtnl, argv + 1, &links);
- else
- c = acquire_link_info_all(rtnl, &links);
+ c = acquire_link_info(rtnl, argc > 1 ? argv + 1 : NULL, &links);
if (c < 0)
return c;
log_debug_errno(r, "Failed to open hardware database: %m");
if (arg_all)
- c = acquire_link_info_all(rtnl, &links);
+ c = acquire_link_info(rtnl, NULL, &links);
else if (argc <= 1)
return system_status(rtnl, hwdb);
else
- c = acquire_link_info_strv(rtnl, argv + 1, &links);
+ c = acquire_link_info(rtnl, argv + 1, &links);
if (c < 0)
return c;
if (r < 0)
return log_error_errno(r, "Failed to connect to netlink: %m");
- if (argc > 1)
- c = acquire_link_info_strv(rtnl, argv + 1, &links);
- else
- c = acquire_link_info_all(rtnl, &links);
+ c = acquire_link_info(rtnl, argc > 1 ? argv + 1 : NULL, &links);
if (c < 0)
return c;
" --no-legend Do not show the headers and footers\n"
" -a --all Show status for all links\n\n"
"Commands:\n"
- " list [LINK...] List links\n"
- " status [LINK...] Show link status\n"
- " lldp [LINK...] Show LLDP neighbors\n"
+ " list [PATTERN...] List links\n"
+ " status [PATTERN...] Show link status\n"
+ " lldp [PATTERN...] Show LLDP neighbors\n"
" label Show current address label entries in the kernel\n"
"\nSee the %s for details.\n"
, program_invocation_short_name