diff options
-rw-r--r-- | src/log.c | 21 | ||||
-rw-r--r-- | src/socket.c | 5 |
2 files changed, 16 insertions, 10 deletions
@@ -44,7 +44,7 @@ static inline size_t snprintf_safe(char *buffer, size_t size, const char *format return min_size_t(ret, size); } -static size_t snprint_peer_address(const fastd_context_t *ctx, char *buffer, size_t size, const fastd_peer_address_t *address, bool bind_address) { +static size_t snprint_peer_address(const fastd_context_t *ctx, char *buffer, size_t size, const fastd_peer_address_t *address, const char *iface, bool bind_address) { char addr_buf[INET6_ADDRSTRLEN] = ""; switch (address->sa.sa_family) { @@ -66,13 +66,14 @@ static size_t snprint_peer_address(const fastd_context_t *ctx, char *buffer, siz if (!bind_address && ctx->conf->hide_ip_addresses) return snprintf_safe(buffer, size, "[hidden]:%u", ntohs(address->in.sin_port)); if (inet_ntop(AF_INET6, &address->in6.sin6_addr, addr_buf, sizeof(addr_buf))) { - if (IN6_IS_ADDR_LINKLOCAL(&address->in6.sin6_addr)) { - char ifname_buf[IF_NAMESIZE]; - if (if_indextoname(address->in6.sin6_scope_id, ifname_buf)) - return snprintf_safe(buffer, size, "[%s%%%s]:%u", addr_buf, if_indextoname(address->in6.sin6_scope_id, ifname_buf), ntohs(address->in6.sin6_port)); - } + char ifname_buf[IF_NAMESIZE]; + if (!iface && IN6_IS_ADDR_LINKLOCAL(&address->in6.sin6_addr)) + iface = if_indextoname(address->in6.sin6_scope_id, ifname_buf); - return snprintf_safe(buffer, size, "[%s]:%u", addr_buf, ntohs(address->in6.sin6_port)); + if (iface) + return snprintf_safe(buffer, size, "[%s%%%s]:%u", addr_buf, iface, ntohs(address->in6.sin6_port)); + else + return snprintf_safe(buffer, size, "[%s]:%u", addr_buf, ntohs(address->in6.sin6_port)); } else return 0; @@ -103,6 +104,7 @@ static int fastd_vsnprintf(const fastd_context_t *ctx, char *buffer, size_t size for (; *format; format++) { const void *p; + const char *iface; const fastd_eth_addr_t *eth_addr; if (buffer >= buffer_end) @@ -164,10 +166,13 @@ static int fastd_vsnprintf(const fastd_context_t *ctx, char *buffer, size_t size case 'I': case 'B': + case 'L': p = va_arg(ap, const fastd_peer_address_t*); + iface = (*format == 'L') ? va_arg(ap, const char*) : NULL; + if (p) - buffer += snprint_peer_address(ctx, buffer, buffer_end-buffer, (const fastd_peer_address_t*)p, *format == 'B'); + buffer += snprint_peer_address(ctx, buffer, buffer_end-buffer, (const fastd_peer_address_t*)p, iface, *format != 'I'); else buffer += snprintf_safe(buffer, buffer_end-buffer, "(null)"); break; diff --git a/src/socket.c b/src/socket.c index 25f50e7..a9e6f33 100644 --- a/src/socket.c +++ b/src/socket.c @@ -114,7 +114,8 @@ static int bind_socket(fastd_context_t *ctx, const fastd_bind_address_t *addr, b bind_address.in6.sin6_scope_id = if_nametoindex(addr->bindtodev); if (!bind_address.in6.sin6_scope_id) { - pr_warn_errno(ctx, "if_nametoindex"); + if (warn) + pr_warn_errno(ctx, "if_nametoindex"); goto error; } } @@ -145,7 +146,7 @@ static int bind_socket(fastd_context_t *ctx, const fastd_bind_address_t *addr, b if (warn) { if (addr->bindtodev) - pr_warn(ctx, "unable to bind to %B on `%s'", &addr->addr, addr->bindtodev); + pr_warn(ctx, fastd_peer_address_is_v6_ll(&addr->addr) ? "unable to bind to %L" : "unable to bind to %B on `%s'", &addr->addr, addr->bindtodev); else pr_warn(ctx, "unable to bind to %B", &addr->addr); } |