summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorume <ume@FreeBSD.org>2005-01-27 14:45:11 +0000
committerume <ume@FreeBSD.org>2005-01-27 14:45:11 +0000
commit4a4e55c7dd46f4fec5bab18c86a18fbd287011d8 (patch)
tree10cb3649a94c0c01ef410c680d70c4eb8522b1fa
parentfa89c5605faa7ae6d16c35fc946e46a24e9d1efe (diff)
downloadFreeBSD-src-4a4e55c7dd46f4fec5bab18c86a18fbd287011d8.zip
FreeBSD-src-4a4e55c7dd46f4fec5bab18c86a18fbd287011d8.tar.gz
implement AI_NUMERICSERV (as defined in RFC3493).
Obtained from: KAME MFC after: 1 week
-rw-r--r--include/netdb.h8
-rw-r--r--lib/libc/net/getaddrinfo.c23
2 files changed, 18 insertions, 13 deletions
diff --git a/include/netdb.h b/include/netdb.h
index ba3ed32..4278794 100644
--- a/include/netdb.h
+++ b/include/netdb.h
@@ -175,10 +175,12 @@ struct addrinfo {
*/
#define AI_PASSIVE 0x00000001 /* get address to use bind() */
#define AI_CANONNAME 0x00000002 /* fill ai_canonname */
-#define AI_NUMERICHOST 0x00000004 /* prevent name resolution */
-/* valid flags for addrinfo */
+#define AI_NUMERICHOST 0x00000004 /* prevent host name resolution */
+#define AI_NUMERICSERV 0x00000008 /* prevent service name resolution */
+/* valid flags for addrinfo (not a standard def, apps should not use it) */
#define AI_MASK \
- (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST | AI_ADDRCONFIG)
+ (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST | AI_NUMERICSERV | \
+ AI_ADDRCONFIG)
#define AI_ALL 0x00000100 /* IPv6 and IPv4-mapped (with AI_V4MAPPED) */
#define AI_V4MAPPED_CFG 0x00000200 /* accept IPv4-mapped if kernel supports */
diff --git a/lib/libc/net/getaddrinfo.c b/lib/libc/net/getaddrinfo.c
index bbd73f4..9029967 100644
--- a/lib/libc/net/getaddrinfo.c
+++ b/lib/libc/net/getaddrinfo.c
@@ -233,7 +233,7 @@ typedef union {
u_char buf[MAXPACKET];
} querybuf;
-static int str_isnumber(const char *);
+static int str2number(const char *);
static int explore_null(const struct addrinfo *,
const char *, struct addrinfo **);
static int explore_numeric(const struct addrinfo *, const char *,
@@ -390,20 +390,21 @@ freeaddrinfo(ai)
}
static int
-str_isnumber(p)
+str2number(p)
const char *p;
{
char *ep;
+ unsigned long v;
if (*p == '\0')
- return NO;
+ return -1;
ep = NULL;
errno = 0;
- (void)strtoul(p, &ep, 10);
- if (errno == 0 && ep && *ep == '\0')
- return YES;
+ v = strtoul(p, &ep, 10);
+ if (errno == 0 && ep && *ep == '\0' && v <= UINT_MAX)
+ return v;
else
- return NO;
+ return -1;
}
int
@@ -1415,7 +1416,7 @@ get_portmatch(ai, servname)
const char *servname;
{
- /* get_port does not touch first argument. when matchonly == 1. */
+ /* get_port does not touch first argument when matchonly == 1. */
/* LINTED const cast */
return get_port((struct addrinfo *)ai, servname, 1);
}
@@ -1457,14 +1458,16 @@ get_port(ai, servname, matchonly)
return EAI_SOCKTYPE;
}
- if (str_isnumber(servname)) {
+ port = str2number(servname);
+ if (port >= 0) {
if (!allownumeric)
return EAI_SERVICE;
- port = atoi(servname);
if (port < 0 || port > 65535)
return EAI_SERVICE;
port = htons(port);
} else {
+ if (ai->ai_flags & AI_NUMERICSERV)
+ return EAI_NONAME;
switch (ai->ai_socktype) {
case SOCK_DGRAM:
proto = "udp";
OpenPOWER on IntegriCloud