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):
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2020-10-11 11:54:18 +02:00
parent d2ec13fa8a
commit 7c50230378
2 changed files with 27 additions and 17 deletions

View file

@ -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"

View file

@ -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;