aboutsummaryrefslogtreecommitdiffstats
path: root/main/netsock2.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/netsock2.c')
-rw-r--r--main/netsock2.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/main/netsock2.c b/main/netsock2.c
index d6561fba2..4ac1d0ffb 100644
--- a/main/netsock2.c
+++ b/main/netsock2.c
@@ -95,7 +95,14 @@ char *ast_sockaddr_stringify_fmt(const struct ast_sockaddr *sa, int format)
return "";
}
- switch (format) {
+ if ((format & AST_SOCKADDR_STR_REMOTE) == AST_SOCKADDR_STR_REMOTE) {
+ char *p;
+ if (ast_sockaddr_is_ipv6_link_local(sa) && (p = strchr(host, '%'))) {
+ *p = '\0';
+ }
+ }
+
+ switch ((format & AST_SOCKADDR_STR_FORMAT_MASK)) {
case AST_SOCKADDR_STR_DEFAULT:
ast_str_set(&str, 0, sa_tmp->ss.ss_family == AF_INET6 ?
"[%s]:%s" : "%s:%s", host, port);
@@ -397,6 +404,12 @@ int ast_sockaddr_is_ipv4_multicast(const struct ast_sockaddr *addr)
return ((ast_sockaddr_ipv4(addr) & 0xf0000000) == 0xe0000000);
}
+int ast_sockaddr_is_ipv6_link_local(const struct ast_sockaddr *addr)
+{
+ const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&addr->ss;
+ return ast_sockaddr_is_ipv6(addr) && IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr);
+}
+
int ast_sockaddr_is_ipv6(const struct ast_sockaddr *addr)
{
return addr->ss.ss_family == AF_INET6 &&