Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/lib/libc/net bring in latest KAME implementation.
details: https://anonhg.NetBSD.org/src/rev/62b5809cdb95
branches: trunk
changeset: 485377:62b5809cdb95
user: itojun <itojun%NetBSD.org@localhost>
date: Wed Apr 26 16:08:38 2000 +0000
description:
bring in latest KAME implementation.
conforms to draft-ietf-ipngwg-scopedaddr-format-01.txt.
behavior change: returns numeric scopeid if we can't convert to string.
removed #if 0'ed portion which we will never revisit.
diffstat:
lib/libc/net/getnameinfo.c | 209 +++++++++++++++++++++++++++-----------------
1 files changed, 128 insertions(+), 81 deletions(-)
diffs (truncated from 304 to 300 lines):
diff -r 996ecf2806bc -r 62b5809cdb95 lib/libc/net/getnameinfo.c
--- a/lib/libc/net/getnameinfo.c Wed Apr 26 16:08:10 2000 +0000
+++ b/lib/libc/net/getnameinfo.c Wed Apr 26 16:08:38 2000 +0000
@@ -1,4 +1,5 @@
-/* $NetBSD: getnameinfo.c,v 1.15 2000/04/24 10:40:25 itojun Exp $ */
+/* $NetBSD: getnameinfo.c,v 1.16 2000/04/26 16:08:38 itojun Exp $ */
+/* $KAME: getnameinfo.c,v 1.38 2000/04/26 15:58:50 itojun Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -37,11 +38,15 @@
* - RFC2553 says that we should raise error on short buffer. X/Open says
* we need to truncate the result. We obey RFC2553 (and X/Open should be
* modified).
+ * - 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
*/
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: getnameinfo.c,v 1.15 2000/04/24 10:40:25 itojun Exp $");
+__RCSID("$NetBSD: getnameinfo.c,v 1.16 2000/04/26 16:08:38 itojun Exp $");
#endif /* LIBC_SCCS and not lint */
#include "namespace.h"
@@ -87,7 +92,9 @@
};
#ifdef INET6
-static char *ip6_sa2str __P((struct sockaddr_in6 *, char *, int));
+static int ip6_parsenumeric __P((const struct sockaddr *, const char *, char *,
+ size_t, int));
+static int ip6_sa2str __P((const struct sockaddr_in6 *, char *, size_t, int));
#endif
#define ENI_NOSOCKET 0
@@ -113,7 +120,7 @@
struct hostent *hp;
u_short port;
int family, i;
- char *addr, *p;
+ const char *addr;
u_int32_t v4a;
int h_error;
char numserv[512];
@@ -139,8 +146,9 @@
if (salen != afd->a_socklen)
return ENI_SALEN;
- port = ((struct sockinet *)sa)->si_port; /* network byte order */
- addr = (char *)sa + afd->a_off;
+ /* network byte order */
+ port = ((const struct sockinet *)sa)->si_port;
+ addr = (const char *)sa + afd->a_off;
if (serv == NULL || servlen == 0) {
/*
@@ -171,7 +179,7 @@
switch (sa->sa_family) {
case AF_INET:
v4a = (u_int32_t)
- ntohl(((struct sockaddr_in *)sa)->sin_addr.s_addr);
+ ntohl(((const struct sockaddr_in *)sa)->sin_addr.s_addr);
if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a))
flags |= NI_NUMERICHOST;
v4a >>= IN_CLASSA_NSHIFT;
@@ -181,8 +189,8 @@
#ifdef INET6
case AF_INET6:
{
- struct sockaddr_in6 *sin6;
- sin6 = (struct sockaddr_in6 *)sa;
+ const struct sockaddr_in6 *sin6;
+ sin6 = (const struct sockaddr_in6 *)sa;
switch (sin6->sin6_addr.s6_addr[0]) {
case 0x00:
if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr))
@@ -217,69 +225,46 @@
/* NUMERICHOST and NAMEREQD conflicts with each other */
if (flags & NI_NAMEREQD)
return ENI_NOHOSTNAME;
- if (inet_ntop(afd->a_af, addr, numaddr, sizeof(numaddr))
- == NULL)
- return ENI_SYSTEM;
- numaddrlen = strlen(numaddr);
- if (numaddrlen + 1 > hostlen) /* don't forget terminator */
- return ENI_MEMORY;
- strcpy(host, numaddr);
-#if defined(INET6) && defined(NI_WITHSCOPEID)
- if (afd->a_af == AF_INET6 &&
- (IN6_IS_ADDR_LINKLOCAL((struct in6_addr *)addr) ||
- IN6_IS_ADDR_MULTICAST((struct in6_addr *)addr)) &&
- ((struct sockaddr_in6 *)sa)->sin6_scope_id) {
-#ifndef ALWAYS_WITHSCOPE
- if (flags & NI_WITHSCOPEID)
-#endif /* !ALWAYS_WITHSCOPE */
- {
- char scopebuf[MAXHOSTNAMELEN], *s;
- int scopelen;
- if ((s = ip6_sa2str((struct sockaddr_in6 *)sa,
- scopebuf, 0)) == NULL)
- /* XXX what should we do? */
- strcpy(scopebuf, "0");
+ switch(afd->a_af) {
+#ifdef INET6
+ case AF_INET6:
+ {
+ int error;
- scopelen = strlen(scopebuf);
- if (scopelen + 1 + numaddrlen + 1 > hostlen)
- return ENI_MEMORY;
-
-#if 0
- /*
- * construct <scopeid><delim><numeric-addr>
- */
- /*
- * 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, scopebuf, scopelen);
- host[scopelen] = SCOPE_DELIMITER;
- host[scopelen + 1 + numaddrlen] = '\0';
-#else
- /*
- * construct <numeric-addr><delim><scopeid>
- */
- memcpy(host + numaddrlen + 1, scopebuf,
- scopelen);
- host[numaddrlen] = SCOPE_DELIMITER;
- host[numaddrlen + 1 + scopelen] = '\0';
+ if ((error = ip6_parsenumeric(sa, addr, host,
+ hostlen, flags)) != 0)
+ return(error);
+ break;
+ }
#endif
- }
+ default:
+ if (inet_ntop(afd->a_af, addr, numaddr, sizeof(numaddr))
+ == NULL)
+ return ENI_SYSTEM;
+ numaddrlen = strlen(numaddr);
+ if (numaddrlen + 1 > hostlen) /* don't forget terminator */
+ return ENI_MEMORY;
+ strcpy(host, numaddr);
+ break;
}
-#endif /* INET6 */
} else {
hp = gethostbyaddr(addr, afd->a_addrlen, afd->a_af);
h_error = h_errno;
if (hp) {
+#if 0
+ /*
+ * commented out, since "for local host" is not
+ * implemented here - see RFC2553 p30
+ */
if (flags & NI_NOFQDN) {
+ char *p;
p = strchr(hp->h_name, '.');
- if (p) *p = '\0';
+ if (p)
+ *p = '\0';
}
+#endif
if (strlen(hp->h_name) > hostlen) {
return ENI_MEMORY;
}
@@ -287,43 +272,105 @@
} else {
if (flags & NI_NAMEREQD)
return ENI_NOHOSTNAME;
- if (inet_ntop(afd->a_af, addr, numaddr, sizeof(numaddr))
- == NULL)
- return ENI_NOHOSTNAME;
- if (strlen(numaddr) > hostlen)
- return ENI_MEMORY;
- strcpy(host, numaddr);
+ switch(afd->a_af) {
+#ifdef INET6
+ case AF_INET6:
+ {
+ int error;
+
+ if ((error = ip6_parsenumeric(sa, addr, host,
+ hostlen,
+ flags)) != 0)
+ return(error);
+ break;
+ }
+#endif
+ default:
+ if (inet_ntop(afd->a_af, addr, host,
+ hostlen) == NULL)
+ return ENI_SYSTEM;
+ break;
+ }
}
}
return SUCCESS;
}
#ifdef INET6
+static int
+ip6_parsenumeric(sa, addr, host, hostlen, flags)
+ const struct sockaddr *sa;
+ const char *addr;
+ char *host;
+ size_t hostlen;
+ int flags;
+{
+ int numaddrlen;
+ char numaddr[512];
+
+ if (inet_ntop(AF_INET6, addr, numaddr, sizeof(numaddr))
+ == NULL)
+ return ENI_SYSTEM;
+
+ numaddrlen = strlen(numaddr);
+ if (numaddrlen + 1 > hostlen) /* don't forget terminator */
+ return ENI_MEMORY;
+ strcpy(host, numaddr);
+
+#ifdef NI_WITHSCOPEID
+ if (((const struct sockaddr_in6 *)sa)->sin6_scope_id) {
+ if (flags & NI_WITHSCOPEID)
+ {
+ char scopebuf[MAXHOSTNAMELEN];
+ int scopelen;
+
+ /* ip6_sa2str never fails */
+ scopelen = ip6_sa2str((const struct sockaddr_in6 *)sa,
+ scopebuf, sizeof(scopebuf),
+ 0);
+ 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';
+ }
+ }
+#endif /* NI_WITHSCOPEID */
+
+ return 0;
+}
+
/* ARGSUSED */
-static char *
-ip6_sa2str(sa6, buf, flags)
- struct sockaddr_in6 *sa6;
+static int
+ip6_sa2str(sa6, buf, bufsiz, flags)
+ const struct sockaddr_in6 *sa6;
char *buf;
+ size_t bufsiz;
int flags;
{
unsigned int ifindex = (unsigned int)sa6->sin6_scope_id;
- struct in6_addr *a6 = &sa6->sin6_addr;
+ const struct in6_addr *a6 = &sa6->sin6_addr;
#ifdef notyet
if (flags & NI_NUMERICSCOPE) {
- sprintf(buf, "%d", sa6->sin6_scope_id);
- return(buf);
+ return(snprintf(buf, bufsiz, "%d", sa6->sin6_scope_id));
}
#endif
- if (IN6_IS_ADDR_LINKLOCAL(a6) || IN6_IS_ADDR_MC_LINKLOCAL(a6))
- return(if_indextoname(ifindex, buf));
+ /* if_indextoname() does not take buffer size. not a good api... */
+ if ((IN6_IS_ADDR_LINKLOCAL(a6) || IN6_IS_ADDR_MC_LINKLOCAL(a6)) &&
+ bufsiz >= IF_NAMESIZE) {
+ char *p = if_indextoname(ifindex, buf);
+ if (p) {
+ return(strlen(p));
+ }
+ }
- if (IN6_IS_ADDR_SITELOCAL(a6) || IN6_IS_ADDR_MC_SITELOCAL(a6))
- return(NULL); /* XXX */
- if (IN6_IS_ADDR_MC_ORGLOCAL(a6))
- return(NULL); /* XXX */
-
- return(NULL); /* XXX */
+ /* last resort */
Home |
Main Index |
Thread Index |
Old Index