This updated patch adds support for RFC2732 IPv6 address format with brackets for the tool ss.
Following the advice by David Laight I used strchr(). Also, IN6ADDR_ANY and INADDR_ANY will return "*". Signed-off-by: Lehner Florian <d...@der-flo.net> --- misc/ss.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/misc/ss.c b/misc/ss.c index 12763c9..d40ad00 100644 --- a/misc/ss.c +++ b/misc/ss.c @@ -1046,25 +1046,31 @@ do_numeric: static void inet_addr_print(const inet_prefix *a, int port, unsigned int ifindex) { - char buf[1024]; + char buf[1024], buf2[1024]; const char *ap = buf; + char *c = NULL; int est_len = addr_width; const char *ifname = NULL; - if (a->family == AF_INET) { - if (a->data[0] == 0) { + if (a->data[0] == 0) { buf[0] = '*'; buf[1] = 0; - } else { + } else { + if (a->family == AF_INET) { ap = format_host(AF_INET, 4, a->data); + } else { + ap = format_host(a->family, 16, a->data); + c = strchr(ap, ':'); + if (c != NULL && a->family == AF_INET6) { + sprintf(buf2, "[%s]", ap); + ap = buf2; + } + est_len = strlen(ap); + if (est_len <= addr_width) + est_len = addr_width; + else + est_len = addr_width + ((est_len-addr_width+3)/4)*4; } - } else { - ap = format_host(a->family, 16, a->data); - est_len = strlen(ap); - if (est_len <= addr_width) - est_len = addr_width; - else - est_len = addr_width + ((est_len-addr_width+3)/4)*4; } if (ifindex) { -- 2.9.4