From c224435ed9758990411e6a288c9d873ba29870ea Mon Sep 17 00:00:00 2001 From: Hajimu UMEMOTO Date: Thu, 27 Jan 2005 14:45:11 +0000 Subject: [PATCH] implement AI_NUMERICSERV (as defined in RFC3493). Obtained from: KAME MFC after: 1 week --- include/netdb.h | 8 +++++--- lib/libc/net/getaddrinfo.c | 23 +++++++++++++---------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/include/netdb.h b/include/netdb.h index ba3ed32f39a9..4278794af072 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 bbd73f4ff557..902996751cf1 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";