diff options
author | David Garcia Quintas <dgq@google.com> | 2017-03-03 16:53:54 -0800 |
---|---|---|
committer | David Garcia Quintas <dgq@google.com> | 2017-03-03 17:04:45 -0800 |
commit | 8a0ec8866edd552be16c9f7f3a0102ccb63eaf3e (patch) | |
tree | 49dba592dfe3455ed00620028e8bee0346e965bf /src/core/lib/iomgr | |
parent | 8c3eaf2f156775a8d4d8f6fafc23c2a985e52676 (diff) | |
parent | f87d9ea587d52fd34a4cf15e5877d767aa22a963 (diff) |
Merge remote-tracking branch 'upstream/v1.1.x' into 1.1.x_to_master
Diffstat (limited to 'src/core/lib/iomgr')
-rw-r--r-- | src/core/lib/iomgr/sockaddr_utils.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/core/lib/iomgr/sockaddr_utils.c b/src/core/lib/iomgr/sockaddr_utils.c index ffa62cb53c..9d2732666b 100644 --- a/src/core/lib/iomgr/sockaddr_utils.c +++ b/src/core/lib/iomgr/sockaddr_utils.c @@ -162,6 +162,7 @@ int grpc_sockaddr_to_string(char **out, char ntop_buf[INET6_ADDRSTRLEN]; const void *ip = NULL; int port; + uint32_t sin6_scope_id = 0; int ret; *out = NULL; @@ -177,10 +178,19 @@ int grpc_sockaddr_to_string(char **out, const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *)addr; ip = &addr6->sin6_addr; port = ntohs(addr6->sin6_port); + sin6_scope_id = addr6->sin6_scope_id; } if (ip != NULL && grpc_inet_ntop(addr->sa_family, ip, ntop_buf, sizeof(ntop_buf)) != NULL) { - ret = gpr_join_host_port(out, ntop_buf, port); + if (sin6_scope_id != 0) { + char *host_with_scope; + /* Enclose sin6_scope_id with the format defined in RFC 6784 section 2. */ + gpr_asprintf(&host_with_scope, "%s%%25%" PRIu32, ntop_buf, sin6_scope_id); + ret = gpr_join_host_port(out, host_with_scope, port); + gpr_free(host_with_scope); + } else { + ret = gpr_join_host_port(out, ntop_buf, port); + } } else { ret = gpr_asprintf(out, "(sockaddr family=%d)", addr->sa_family); } |