diff --git a/src/utils/net.c b/src/utils/net.c index ff8699b71..0dfa73168 100644 --- a/src/utils/net.c +++ b/src/utils/net.c @@ -397,29 +397,51 @@ bool is_ipv6_supported(void) return true; } -const char *get_sockaddr_str(struct sockaddr *sa) -{ - _Thread_local static char addr[IN6_MAX_ASCII_LEN + 3 /* []: */ + 5 /* port */ + 1 /* \0 */] = ""; +unsigned get_sockaddr_addr_port(struct sockaddr *sa){ unsigned port = 0; - const void *src = NULL; if (sa->sa_family == AF_INET6) { - strcpy(addr, "["); - src = &((struct sockaddr_in6 *)(void *) sa)->sin6_addr; port = ntohs(((struct sockaddr_in6 *)(void *) sa)->sin6_port); } else if (sa->sa_family == AF_INET) { - src = &((struct sockaddr_in *)(void *) sa)->sin_addr; port = ntohs(((struct sockaddr_in *)(void *) sa)->sin_port); } else { - return "(unknown)"; + return UINT_MAX; } - if (inet_ntop(sa->sa_family, src, addr + strlen(addr), sizeof addr - strlen(addr)) == NULL) { + + return port; +} + +void get_sockaddr_addr_str(struct sockaddr *sa, char *buf, size_t n){ + assert(n >= IN6_MAX_ASCII_LEN + 3 /* []: */ + 1 /* \0 */); + const void *src = NULL; + if (sa->sa_family == AF_INET6) { + strcpy(buf, "["); + src = &((struct sockaddr_in6 *)(void *) sa)->sin6_addr; + } else if (sa->sa_family == AF_INET) { + src = &((struct sockaddr_in *)(void *) sa)->sin_addr; + } else { + strcpy(buf, "(unknown)"); + return; + } + if (inet_ntop(sa->sa_family, src, buf + strlen(buf), n - strlen(buf)) == NULL) { perror("get_sockaddr_str"); - return "(error)"; + strcpy(buf, "(error)"); + return; } if (sa->sa_family == AF_INET6) { - strcpy(addr + strlen(addr), "]"); + strcat(buf, "]"); } +} + +const char *get_sockaddr_str(struct sockaddr *sa) +{ + _Thread_local static char addr[IN6_MAX_ASCII_LEN + 3 /* []: */ + 5 /* port */ + 1 /* \0 */] = ""; + + get_sockaddr_addr_str(sa, addr, sizeof(addr)); + + unsigned port = get_sockaddr_addr_port(sa); + if(port == UINT_MAX) + return addr; sprintf(addr + strlen(addr), ":%u", port); return addr; diff --git a/src/utils/net.h b/src/utils/net.h index 1b4a96afb..d8f29d696 100644 --- a/src/utils/net.h +++ b/src/utils/net.h @@ -68,6 +68,8 @@ bool is_host_private(const char *hostname); uint16_t socket_get_recv_port(int fd); bool get_local_addresses(struct sockaddr_storage *addrs, size_t *len, int ip_version); bool is_ipv6_supported(void); +void get_sockaddr_addr_str(struct sockaddr *sa, char *buf, size_t n); +unsigned get_sockaddr_addr_port(struct sockaddr *sa); const char *get_sockaddr_str(struct sockaddr *sa); #ifdef WIN32