diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2020-10-11 11:54:18 +0200 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2020-10-20 19:58:37 +0200 |
commit | 7c5023037815228280dcf461bf9b9f2b3575f600 (patch) | |
tree | 479835d38569553538356bca176222181d9671f5 | |
parent | d2ec13fa8ae25fa11340c6bba8832db082af2cc5 (diff) | |
download | systemd-7c5023037815228280dcf461bf9b9f2b3575f600.tar.gz |
resolvectl: break nta/domain/dns listings with newlines
We would print the whole string as a single super-long line. Let's nicely
break the text into lines that fit on the screen.
$ COLUMNS=70 build/resolvectl --no-pager nta
Global: home local intranet 23.172.in-addr.arpa lan
18.172.in-addr.arpa 16.172.in-addr.arpa 19.172.in-addr.arpa
25.172.in-addr.arpa 21.172.in-addr.arpa d.f.ip6.arpa
20.172.in-addr.arpa 30.172.in-addr.arpa 17.172.in-addr.arpa
internal 168.192.in-addr.arpa 28.172.in-addr.arpa
22.172.in-addr.arpa 24.172.in-addr.arpa 26.172.in-addr.arpa
corp 10.in-addr.arpa private 29.172.in-addr.arpa test
27.172.in-addr.arpa 31.172.in-addr.arpa
Link 2 (hub0):
Link 4 (enp0s31f6):
Link 5 (wlp4s0):
Link 7 (virbr0): adsfasdfasdfasd.com 21.172.in-addr.arpa lan j b
a.com home d.f.ip6.arpa b.com local 16.172.in-addr.arpa
19.172.in-addr.arpa 18.172.in-addr.arpa 25.172.in-addr.arpa
20.172.in-addr.arpa k i h 23.172.in-addr.arpa
168.192.in-addr.arpa d g intranet 17.172.in-addr.arpa c e.com
30.172.in-addr.arpa a f d.com e internal
Link 8 (virbr0-nic):
Link 9 (vnet0):
Link 10 (vb-rawhide):
Link 15 (wwp0s20f0u2i12):
-rw-r--r-- | src/basic/macro.h | 2 | ||||
-rw-r--r-- | src/resolve/resolvectl.c | 42 |
2 files changed, 27 insertions, 17 deletions
diff --git a/src/basic/macro.h b/src/basic/macro.h index 41c2c3289e..954bb2de2a 100644 --- a/src/basic/macro.h +++ b/src/basic/macro.h @@ -634,4 +634,6 @@ static inline int __coverity_check_and_return__(int condition) { _copy; \ }) +#define SIZE_ADD(x, y) ((x) >= SIZE_MAX - (y) ? SIZE_MAX : (x) + (y)) + #include "log.h" diff --git a/src/resolve/resolvectl.c b/src/resolve/resolvectl.c index 4581c2e3c8..f199df655d 100644 --- a/src/resolve/resolvectl.c +++ b/src/resolve/resolvectl.c @@ -35,6 +35,7 @@ #include "string-table.h" #include "strv.h" #include "terminal-util.h" +#include "utf8.h" #include "verbs.h" static int arg_family = AF_UNSPEC; @@ -1302,19 +1303,39 @@ static int map_link_domains(sd_bus *bus, const char *member, sd_bus_message *m, } static int status_print_strv_ifindex(int ifindex, const char *ifname, char **p) { + const unsigned indent = strlen("Global: "); /* Use the same indentation everywhere to make things nice */ + int pos1, pos2; + + if (ifname) + printf("%s%nLink %i (%s)%n%s:", ansi_highlight(), &pos1, ifindex, ifname, &pos2, ansi_normal()); + else + printf("%s%nGlobal%n%s:", ansi_highlight(), &pos1, &pos2, ansi_normal()); + + size_t cols = columns(), position = pos2 - pos1 + 2; char **i; - printf("%sLink %i (%s)%s:", - ansi_highlight(), ifindex, ifname, ansi_normal()); + STRV_FOREACH(i, p) { + size_t our_len = utf8_console_width(*i); /* This returns -1 on invalid utf-8 (which shouldn't happen). + * If that happens, we'll just print one item per line. */ - STRV_FOREACH(i, p) - printf(" %s", *i); + if (position <= indent || SIZE_ADD(SIZE_ADD(position, 1), our_len) < cols) { + printf(" %s", *i); + position = SIZE_ADD(SIZE_ADD(position, 1), our_len); + } else { + printf("\n%*s%s", indent, "", *i); + position = SIZE_ADD(our_len, indent); + } + } printf("\n"); return 0; } +static int status_print_strv_global(char **p) { + return status_print_strv_ifindex(0, NULL, p); +} + struct link_info { uint64_t scopes_mask; const char *llmnr; @@ -1636,19 +1657,6 @@ static int map_global_domains(sd_bus *bus, const char *member, sd_bus_message *m return 0; } -static int status_print_strv_global(char **p) { - char **i; - - printf("%sGlobal%s:", ansi_highlight(), ansi_normal()); - - STRV_FOREACH(i, p) - printf(" %s", *i); - - printf("\n"); - - return 0; -} - struct global_info { char *current_dns; char *current_dns_ex; |