summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorume <ume@FreeBSD.org>2002-07-02 11:05:31 +0000
committerume <ume@FreeBSD.org>2002-07-02 11:05:31 +0000
commitddbac8e31144c1b1d9d8af4ec593f0024421bb0b (patch)
treea1a1d2b072d437e483c3cb495768c4beab7f8baf /lib
parentdb272949cf8ac5fc7dd8e1dc21413e9d96a2ba6a (diff)
downloadFreeBSD-src-ddbac8e31144c1b1d9d8af4ec593f0024421bb0b.zip
FreeBSD-src-ddbac8e31144c1b1d9d8af4ec593f0024421bb0b.tar.gz
Make NI_WITHSCOPEID a default (always on), to synchronize
with recent 2553bis. Obtained from: KAME MFC after: 3 weeks
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/net/getnameinfo.c50
1 files changed, 20 insertions, 30 deletions
diff --git a/lib/libc/net/getnameinfo.c b/lib/libc/net/getnameinfo.c
index 2acef3e..1a1c6df 100644
--- a/lib/libc/net/getnameinfo.c
+++ b/lib/libc/net/getnameinfo.c
@@ -37,8 +37,10 @@
* modified). ipngwg rough consensus seems to follow RFC2553.
* - What is "local" in NI_FQDN?
* - NI_NAMEREQD and NI_NUMERICHOST conflict with each other.
- * - (KAME extension) NI_WITHSCOPEID when called with global address,
- * and sin6_scope_id filled
+ * - (KAME extension) always attach textual scopeid (fe80::1%lo0), if
+ * sin6_scope_id is filled - standardization status?
+ * XXX breaks backward compat for code that expects no scopeid.
+ * beware on merge.
*/
#include <sys/cdefs.h>
@@ -308,36 +310,24 @@ ip6_parsenumeric(sa, addr, host, hostlen, flags)
return ENI_MEMORY;
strcpy(host, numaddr);
-#ifdef NI_WITHSCOPEID
- if (
-#ifdef DONT_OPAQUE_SCOPEID
- (IN6_IS_ADDR_LINKLOCAL((struct in6_addr *)addr) ||
- IN6_IS_ADDR_MULTICAST((struct in6_addr *)addr)) &&
-#endif
- ((const struct sockaddr_in6 *)sa)->sin6_scope_id) {
-#ifndef ALWAYS_WITHSCOPE
- if (flags & NI_WITHSCOPEID)
-#endif /* !ALWAYS_WITHSCOPE */
- {
- char scopebuf[MAXHOSTNAMELEN];
- int scopelen;
+ if (((const struct sockaddr_in6 *)sa)->sin6_scope_id) {
+ char zonebuf[MAXHOSTNAMELEN];
+ int zonelen;
- /* ip6_sa2str never fails */
- scopelen = ip6_sa2str((const struct sockaddr_in6 *)sa,
- scopebuf, sizeof(scopebuf),
- flags);
- if (scopelen + 1 + numaddrlen + 1 > hostlen)
- return ENI_MEMORY;
- /*
- * construct <numeric-addr><delim><scopeid>
- */
- memcpy(host + numaddrlen + 1, scopebuf,
- scopelen);
- host[numaddrlen] = SCOPE_DELIMITER;
- host[numaddrlen + 1 + scopelen] = '\0';
- }
+ /* ip6_sa2str never fails */
+ zonelen = ip6_sa2str(
+ (const struct sockaddr_in6 *)(const void *)sa,
+ zonebuf, sizeof(zonebuf), flags);
+ if (zonelen < 0)
+ return EAI_MEMORY;
+ if (zonelen + 1 + numaddrlen + 1 > hostlen)
+ return ENI_MEMORY;
+ /* construct <numeric-addr><delim><scopeid> */
+ memcpy(host + numaddrlen + 1, zonebuf,
+ (size_t)zonelen);
+ host[numaddrlen] = SCOPE_DELIMITER;
+ host[numaddrlen + 1 + zonelen] = '\0';
}
-#endif /* NI_WITHSCOPEID */
return 0;
}
OpenPOWER on IntegriCloud