From f1430d521a767a13035d6d8e96686564552194fd Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 30 Apr 2010 15:01:32 -0500 Subject: [PATCH] fix switch_get_addr to work with v6 properly --- src/include/switch_utils.h | 1 + src/switch_apr.c | 9 +++++++-- src/switch_utils.c | 11 +++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/include/switch_utils.h b/src/include/switch_utils.h index 3d8679228b..2ac5981c1e 100644 --- a/src/include/switch_utils.h +++ b/src/include/switch_utils.h @@ -197,6 +197,7 @@ SWITCH_DECLARE(switch_status_t) switch_find_local_ip(_Out_opt_bytecapcount_(len) \return the ip adress string */ SWITCH_DECLARE(char *) get_addr(char *buf, switch_size_t len, struct sockaddr *sa, socklen_t salen); +SWITCH_DECLARE(char *) get_addr6(char *buf, switch_size_t len, struct sockaddr_in6 *sa, socklen_t salen); SWITCH_DECLARE(int) get_addr_int(switch_sockaddr_t *sa); SWITCH_DECLARE(int) switch_cmp_addr(switch_sockaddr_t *sa1, switch_sockaddr_t *sa2); diff --git a/src/switch_apr.c b/src/switch_apr.c index d857d48906..360974af95 100644 --- a/src/switch_apr.c +++ b/src/switch_apr.c @@ -778,9 +778,14 @@ SWITCH_DECLARE(switch_status_t) switch_mcast_loopback(switch_socket_t *sock, uin SWITCH_DECLARE(const char *) switch_get_addr(char *buf, switch_size_t len, switch_sockaddr_t *in) { if (!in) { - return ""; + return SWITCH_BLANK_STRING; } - return get_addr(buf, len, (struct sockaddr *) &in->sa, in->salen); + + if (in->family == AF_INET) { + return get_addr(buf, len, (struct sockaddr *) &in->sa, in->salen); + } + + return get_addr6(buf, len, (struct sockaddr_in6 *) &in->sa, in->salen); } SWITCH_DECLARE(uint16_t) switch_sockaddr_get_port(switch_sockaddr_t *sa) diff --git a/src/switch_utils.c b/src/switch_utils.c index 72eb3ed962..6d58512d45 100644 --- a/src/switch_utils.c +++ b/src/switch_utils.c @@ -1482,6 +1482,17 @@ SWITCH_DECLARE(int) switch_cmp_addr(switch_sockaddr_t *sa1, switch_sockaddr_t *s return 0; } +SWITCH_DECLARE(char *) get_addr6(char *buf, switch_size_t len, struct sockaddr_in6 *sa, socklen_t salen) +{ + switch_assert(buf); + *buf = '\0'; + + if (sa) { + inet_ntop(AF_INET6, sa, buf, len); + } + + return buf; +} SWITCH_DECLARE(char *) get_addr(char *buf, switch_size_t len, struct sockaddr *sa, socklen_t salen) {