Add support for for the AI_NUMERICSERV getaddrinfo(3) flag. While pulling
authorHasso Tepper <hasso@dragonflybsd.org>
Thu, 22 May 2008 06:50:14 +0000 (06:50 +0000)
committerHasso Tepper <hasso@dragonflybsd.org>
Thu, 22 May 2008 06:50:14 +0000 (06:50 +0000)
documentation for it from FreeBSD, add missing info about other flags as
well.

Obtained-from: KAME and FreeBSD

include/netdb.h
lib/libc/net/getaddrinfo.3
lib/libc/net/getaddrinfo.c

index d42de73..0010b7a 100644 (file)
@@ -56,7 +56,7 @@
  *      @(#)netdb.h    8.1 (Berkeley) 6/2/93
  *      From: Id: netdb.h,v 8.9 1996/11/19 08:39:29 vixie Exp $
  * $FreeBSD: src/include/netdb.h,v 1.14.2.5 2001/08/29 08:46:51 alfred Exp $
- * $DragonFly: src/include/netdb.h,v 1.5 2003/11/15 19:28:42 asmodai Exp $
+ * $DragonFly: src/include/netdb.h,v 1.6 2008/05/22 06:50:14 hasso Exp $
  */
 
 #ifndef _NETDB_H_
@@ -172,10 +172,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 */
index 1ae72d4..9732e2c 100644 (file)
@@ -1,7 +1,7 @@
 .\"    $KAME: getaddrinfo.3,v 1.36 2005/01/05 03:23:05 itojun Exp $
 .\"    $OpenBSD: getaddrinfo.3,v 1.35 2004/12/21 03:40:31 jaredy Exp $
 .\"    $FreeBSD: src/lib/libc/net/getaddrinfo.3,v 1.29 2005/01/23 16:02:48 gnn Exp $
-.\"    $DragonFly: src/lib/libc/net/getaddrinfo.3,v 1.6 2007/08/18 20:48:47 swildner Exp $
+.\"    $DragonFly: src/lib/libc/net/getaddrinfo.3,v 1.7 2008/05/22 06:50:14 hasso Exp $
 .\"
 .\" Copyright (C) 2004  Internet Systems Consortium, Inc. ("ISC")
 .\" Copyright (C) 2000, 2001  Internet Software Consortium.
@@ -18,7 +18,7 @@
 .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 .\" PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd December 20, 2004
+.Dd May 22, 2008
 .Dt GETADDRINFO 3
 .Os
 .Sh NAME
@@ -124,6 +124,26 @@ is formed by
 .Tn OR Ns 'ing
 the following values:
 .Bl -tag -width "AI_CANONNAMEXX"
+.It Dv AI_ADDRCONFIG
+If the
+.Dv AI_ADDRCONFIG
+bit is set, IPv4 addresses shall be returned only if
+an IPv4 address is configured on the local system,
+and IPv6 addresses shall be returned only if
+an IPv6 address is configured on the local system.
+.It Dv AI_ALL
+If the
+.Dv AI_ALL
+bit is set with the
+.Dv AI_V4MAPPED
+bit, then
+.Fn getaddrinfo
+shall return all matching IPv6 and IPv4 addresses.
+The
+.Dv AI_ALL
+bit without the
+.Dv AI_V4MAPPED
+bit is ignored.
 .It Dv AI_CANONNAME
 If the
 .Dv AI_CANONNAME
@@ -142,6 +162,18 @@ bit is set, it indicates that
 .Fa hostname
 should be treated as a numeric string defining an IPv4 or IPv6 address
 and no name resolution should be attempted.
+.It Dv AI_NUMERICSERV
+If the
+.Dv AI_NUMERICSERV
+bit is set,
+then a non-null
+.Fa servname
+string supplied shall be a numeric port string.
+Otherwise, an
+.Dv EAI_NONAME
+error shall be returned.
+This bit shall prevent any type of name resolution service
+(for example, NIS+) from being invoked.
 .It Dv AI_PASSIVE
 If the
 .Dv AI_PASSIVE
@@ -176,6 +208,25 @@ loopback address if
 is the null pointer and
 .Dv AI_PASSIVE
 is not set.
+.It Dv AI_V4MAPPED
+If the
+.Dv AI_V4MAPPED
+flag is specified along with an
+.Fa ai_family
+of
+.Dv AF_INET6 ,
+then
+.Fn getaddrinfo
+shall return IPv4-mapped IPv6 addresses
+on finding no matching IPv6 addresses (
+.Fa ai_addrlen
+shall be 16).
+The
+.Dv AI_V4MAPPED
+flag shall be ignored unless
+.Fa ai_family
+equals
+.Dv AF_INET6 .
 .El
 .El
 .Pp
index 5a71c66..1dd833f 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/lib/libc/net/getaddrinfo.c,v 1.9.2.14 2002/11/08 17:49:31 ume Exp $       */
-/*     $DragonFly: src/lib/libc/net/getaddrinfo.c,v 1.6 2005/11/13 02:04:47 swildner Exp $     */
+/*     $DragonFly: src/lib/libc/net/getaddrinfo.c,v 1.7 2008/05/22 06:50:14 hasso Exp $        */
 /*     $KAME: getaddrinfo.c,v 1.15 2000/07/09 04:37:24 itojun Exp $    */
 
 /*
@@ -186,7 +186,7 @@ struct res_target {
        int n;                  /* result length */
 };
 
-static int str_isnumber (const char *);
+static int str2number (const char *);
 static int explore_fqdn (const struct addrinfo *, const char *,
        const char *, struct addrinfo **);
 static int explore_null (const struct addrinfo *,
@@ -349,19 +349,20 @@ freeaddrinfo(struct addrinfo *ai)
 }
 
 static int
-str_isnumber(const char *p)
+str2number(const char *p)
 {
        char *ep;
+       unsigned long v;
 
        if (*p == '\0')
-               return NO;
+               return -1;
        ep = NULL;
        errno = 0;
-       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
@@ -1027,14 +1028,16 @@ get_port(struct addrinfo *ai, const char *servname, int 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";