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];
ea->fmt++;
include_port = true;
break;
+ case 's':
+ ea->fmt++;
+ include_scope = true;
+ break;
default:
endflags = true;
break;
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));
}
#include "privs.h"
#include "if.h"
+#include <sys/un.h>
#ifdef __OpenBSD__
#include <netmpls/mpls.h>
#endif
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;
#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