diff options
author | shin <shin@FreeBSD.org> | 2000-02-09 00:38:06 +0000 |
---|---|---|
committer | shin <shin@FreeBSD.org> | 2000-02-09 00:38:06 +0000 |
commit | 05934f97678ef7d5925562d6cae001d60b9909bc (patch) | |
tree | 8339f4f0471246a77679a0b7883f296ede4cdce7 /lib/libc/net/getnameinfo.c | |
parent | fdb3a7064446f1bdec12175ccc5ede0c628a9443 (diff) | |
download | FreeBSD-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.c | 18 |
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 */ |