summaryrefslogtreecommitdiffstats
path: root/lib/libc/net/getnameinfo.c
diff options
context:
space:
mode:
authorshin <shin@FreeBSD.org>2000-02-09 00:38:06 +0000
committershin <shin@FreeBSD.org>2000-02-09 00:38:06 +0000
commit05934f97678ef7d5925562d6cae001d60b9909bc (patch)
tree8339f4f0471246a77679a0b7883f296ede4cdce7 /lib/libc/net/getnameinfo.c
parentfdb3a7064446f1bdec12175ccc5ede0c628a9443 (diff)
downloadFreeBSD-src-05934f97678ef7d5925562d6cae001d60b9909bc.zip
FreeBSD-src-05934f97678ef7d5925562d6cae001d60b9909bc.tar.gz
IPv6 scoped addr format is changed as recent KAME change.
KAME scoped addr format is changed recently. before: addr@scope now: scope%addr Because the end of IPv6 numeric addr is tend to be truncated in `netstat -rn ` output, so placing scope part at starting of addr will be convenient. Approved by: jkh Obtained from: KAME project
Diffstat (limited to 'lib/libc/net/getnameinfo.c')
-rw-r--r--lib/libc/net/getnameinfo.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/lib/libc/net/getnameinfo.c b/lib/libc/net/getnameinfo.c
index 5ca6140..42f7906 100644
--- a/lib/libc/net/getnameinfo.c
+++ b/lib/libc/net/getnameinfo.c
@@ -189,14 +189,24 @@ getnameinfo(sa, salen, host, hostlen, serv, servlen, flags)
unsigned int ifindex =
((struct sockaddr_in6 *)sa)->sin6_scope_id;
char ifname[IF_NAMESIZE * 2 /* for safety */];
+ int scopelen, numaddrlen;
if ((if_indextoname(ifindex, ifname)) == NULL)
return ENI_SYSTEM;
- if (strlen(host) + 1 /* SCOPE_DELIMITER */
- + strlen(ifname) > hostlen)
+ scopelen = strlen(ifname);
+ numaddrlen = strlen(host);
+ if (numaddrlen + 1 /* SCOPE_DELIMITER */
+ + scopelen > hostlen)
return ENI_MEMORY;
- *ep = SCOPE_DELIMITER;
- strcpy(ep + 1, ifname);
+ /*
+ * Shift the host string to allocate
+ * space for the scope ID part.
+ */
+ memmove(host + scopelen + 1, host, numaddrlen);
+ /* copy the scope ID and the delimiter */
+ memcpy(host, ifname, scopelen);
+ host[scopelen] = SCOPE_DELIMITER;
+ host[scopelen + 1 + numaddrlen] = '\0';
}
}
#endif /* INET6 */
OpenPOWER on IntegriCloud