summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@diac24.net>2021-03-26 14:16:01 +0100
committerDavid Lamparter <equinox@diac24.net>2021-03-30 22:34:56 +0200
commit94f78404952795538b72b752ef08d865122ecd09 (patch)
treec369c678b187287bb967e1e38249e279e15a61cb
parentlib: add `%pSQ` and `%pSE` string escape formats (diff)
downloadfrr-94f78404952795538b72b752ef08d865122ecd09.tar.xz
frr-94f78404952795538b72b752ef08d865122ecd09.zip
lib: fix & improve `%pSU` format
This wasn't quite formatting IPv6+port in a useful way (no brackets), and printing the scope ID (interface index) and unix addrs is useful too. Signed-off-by: David Lamparter <equinox@diac24.net>
Diffstat (limited to '')
-rw-r--r--lib/sockunion.c31
-rw-r--r--lib/sockunion.h7
2 files changed, 35 insertions, 3 deletions
diff --git a/lib/sockunion.c b/lib/sockunion.c
index 2175ac336..37bd3b841 100644
--- a/lib/sockunion.c
+++ b/lib/sockunion.c
@@ -668,7 +668,7 @@ static ssize_t printfrr_psu(struct fbuf *buf, struct printfrr_eargs *ea,
const void *ptr)
{
const union sockunion *su = ptr;
- bool include_port = false;
+ bool include_port = false, include_scope = false;
bool endflags = false;
ssize_t ret = 0;
char cbuf[INET6_ADDRSTRLEN];
@@ -682,6 +682,10 @@ static ssize_t printfrr_psu(struct fbuf *buf, struct printfrr_eargs *ea,
ea->fmt++;
include_port = true;
break;
+ case 's':
+ ea->fmt++;
+ include_scope = true;
+ break;
default:
endflags = true;
break;
@@ -696,14 +700,35 @@ static ssize_t printfrr_psu(struct fbuf *buf, struct printfrr_eargs *ea,
inet_ntop(AF_INET, &su->sin.sin_addr, cbuf, sizeof(cbuf));
ret += bputs(buf, cbuf);
if (include_port)
- ret += bprintfrr(buf, ":%d", su->sin.sin_port);
+ ret += bprintfrr(buf, ":%d", ntohs(su->sin.sin_port));
break;
case AF_INET6:
+ if (include_port)
+ ret += bputch(buf, '[');
inet_ntop(AF_INET6, &su->sin6.sin6_addr, cbuf, sizeof(cbuf));
ret += bputs(buf, cbuf);
+ if (include_scope && su->sin6.sin6_scope_id)
+ ret += bprintfrr(buf, "%%%u",
+ (unsigned int)su->sin6.sin6_scope_id);
if (include_port)
- ret += bprintfrr(buf, ":%d", su->sin6.sin6_port);
+ ret += bprintfrr(buf, "]:%d",
+ ntohs(su->sin6.sin6_port));
+ break;
+ case AF_UNIX: {
+ int len;
+#ifdef __linux__
+ if (su->sun.sun_path[0] == '\0' && su->sun.sun_path[1]) {
+ len = strnlen(su->sun.sun_path + 1,
+ sizeof(su->sun.sun_path) - 1);
+ ret += bprintfrr(buf, "@%*pSE", len,
+ su->sun.sun_path + 1);
+ break;
+ }
+#endif
+ len = strnlen(su->sun.sun_path, sizeof(su->sun.sun_path));
+ ret += bprintfrr(buf, "%*pSE", len, su->sun.sun_path);
break;
+ }
default:
ret += bprintfrr(buf, "(af %d)", sockunion_family(su));
}
diff --git a/lib/sockunion.h b/lib/sockunion.h
index 5e80ba109..46ab7ff20 100644
--- a/lib/sockunion.h
+++ b/lib/sockunion.h
@@ -24,6 +24,7 @@
#include "privs.h"
#include "if.h"
+#include <sys/un.h>
#ifdef __OpenBSD__
#include <netmpls/mpls.h>
#endif
@@ -36,6 +37,7 @@ union sockunion {
struct sockaddr sa;
struct sockaddr_in sin;
struct sockaddr_in6 sin6;
+ struct sockaddr_un sun;
#ifdef __OpenBSD__
struct sockaddr_mpls smpls;
struct sockaddr_rtlabel rtlabel;
@@ -106,6 +108,11 @@ extern int sockunion_is_null(const union sockunion *su);
#ifdef _FRR_ATTRIBUTE_PRINTFRR
#pragma FRR printfrr_ext "%pSU" (union sockunion *)
+#pragma FRR printfrr_ext "%pSU" (struct sockaddr *)
+#pragma FRR printfrr_ext "%pSU" (struct sockaddr_storage *)
+#pragma FRR printfrr_ext "%pSU" (struct sockaddr_in *)
+#pragma FRR printfrr_ext "%pSU" (struct sockaddr_in6 *)
+#pragma FRR printfrr_ext "%pSU" (struct sockaddr_un *)
#endif
#ifdef __cplusplus