diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2016-02-22 23:23:56 -0500 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2016-02-23 08:50:52 -0500 |
commit | 4c3160f1502e5ebad8cb73ae70cdeead2e534997 (patch) | |
tree | b6481fd633c7521d5ea0d4c0969a165356a26740 | |
parent | 6b0132e4e785de7b339da071eb1506adf2362edd (diff) |
networkctl: only print lldp legend for capabilities that were actually seen
-rw-r--r-- | src/network/networkctl.c | 47 |
1 files changed, 40 insertions, 7 deletions
diff --git a/src/network/networkctl.c b/src/network/networkctl.c index d1aec9a7dc..07ac15f478 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -901,10 +901,43 @@ static char *lldp_capabilities_to_string(uint16_t x) { return ret; } +static void lldp_capabilities_legend(uint16_t x) { + unsigned w, i, cols = columns(); + static const char const* table[] = { + "o - Other", + "p - Repeater", + "b - Bridge", + "w - WLAN Access Point", + "r - Router", + "t - Telephone", + "d - DOCSIS cable device", + "a - Station", + "c - Customer VLAN", + "s - Service VLAN", + "m - Two-port MAC Relay (TPMR)", + }; + + if (x == 0) + return; + + printf("\nCapability Flags:\n"); + for (w = 0, i = 0; i < ELEMENTSOF(table); i++) + if (x & (1U << i) || arg_all) { + bool newline; + + newline = w + strlen(table[i]) + (w == 0 ? 0 : 2) > cols; + if (newline) + w = 0; + w += printf("%s%s%s", newline ? "\n" : "", w == 0 ? "" : "; ", table[i]); + } + puts(""); +} + static int link_lldp_status(int argc, char *argv[], void *userdata) { _cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL; _cleanup_free_ LinkInfo *links = NULL; int i, r, c, m = 0; + uint16_t all = 0; r = sd_netlink_open(&rtnl); if (r < 0) @@ -982,8 +1015,10 @@ static int link_lldp_status(int argc, char *argv[], void *userdata) { port_description = pdesc; } - if (sd_lldp_neighbor_get_enabled_capabilities(n, &cc) >= 0) + if (sd_lldp_neighbor_get_enabled_capabilities(n, &cc) >= 0) { capabilities = lldp_capabilities_to_string(cc); + all |= cc; + } printf("%-16s %-17s %-16s %-11s %-17s %-16s\n", links[i].name, @@ -997,12 +1032,10 @@ static int link_lldp_status(int argc, char *argv[], void *userdata) { } } - if (arg_legend) - printf("\nCapability Flags:\n" - "o - Other; p - Repeater; b - Bridge; w - WLAN Access Point; r - Router;\n" - "t - Telephone; d - DOCSIS cable device; a - Station; c - Customer VLAN;\n" - "s - Service VLAN, m - Two-port MAC Relay (TPMR)\n\n" - "%i neighbors listed.\n", m); + if (arg_legend) { + lldp_capabilities_legend(all); + printf("\n%i neighbors listed.\n", m); + } return 0; } |