about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--inet/netinet/in.h6
-rw-r--r--nss/getent.c16
-rw-r--r--sysdeps/posix/getaddrinfo.c42
-rw-r--r--sysdeps/unix/sysv/linux/bits/socket.h4
5 files changed, 60 insertions, 19 deletions
diff --git a/ChangeLog b/ChangeLog
index 108beaf0b9..c2745c2858 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2008-05-14  Ulrich Drepper  <drepper@redhat.com>
+
+	* sysdeps/posix/getaddrinfo.c: Implement handling of DCCP and
+	UDPlite.
+
+	* nss/getent.c (ahosts_keys_int): Handle all known socket types.
+
+	* inet/netinet/in.h (IPPIPPROTO_DCCP, IPPROTO_UDPLITE): Define.
+
+	* sysdeps/unix/sysv/linux/bits/socket.h (SOCK_DCCP): Define.
+
 2008-05-13  Ulrich Drepper  <drepper@redhat.com>
 
 	* po/lt.po: New file.  From Lituanian translation team.
diff --git a/inet/netinet/in.h b/inet/netinet/in.h
index e3446a9994..180227af5b 100644
--- a/inet/netinet/in.h
+++ b/inet/netinet/in.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991-2001, 2003, 2004, 2006, 2007
+/* Copyright (C) 1991-2001, 2003, 2004, 2006, 2007, 2008
    Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -53,6 +53,8 @@ enum
 #define IPPROTO_IDP		IPPROTO_IDP
     IPPROTO_TP = 29,	   /* SO Transport Protocol Class 4.  */
 #define IPPROTO_TP		IPPROTO_TP
+    IPPROTO_DCCP = 33,	   /* Datagram Congestion Control Protocol.  */
+#define IPPROTO_DCCP		IPPROTO_DCCP
     IPPROTO_IPV6 = 41,     /* IPv6 header.  */
 #define IPPROTO_IPV6		IPPROTO_IPV6
     IPPROTO_ROUTING = 43,  /* IPv6 routing header.  */
@@ -83,6 +85,8 @@ enum
 #define IPPROTO_COMP		IPPROTO_COMP
     IPPROTO_SCTP = 132,	   /* Stream Control Transmission Protocol.  */
 #define IPPROTO_SCTP		IPPROTO_SCTP
+    IPPROTO_UDPLITE = 136, /* UDP-Lite protocol.  */
+#define IPPROTO_UDPLITE		IPPROTO_UDPLITE
     IPPROTO_RAW = 255,	   /* Raw IP packets.  */
 #define IPPROTO_RAW		IPPROTO_RAW
     IPPROTO_MAX
diff --git a/nss/getent.c b/nss/getent.c
index 28c6dce13b..c8173d0b51 100644
--- a/nss/getent.c
+++ b/nss/getent.c
@@ -337,6 +337,22 @@ ahosts_keys_int (int af, int xflags, int number, char *key[])
 		sockstr = "DGRAM";
 	      else if (runp->ai_socktype == SOCK_RAW)
 		sockstr = "RAW";
+#ifdef SOCK_SEQPACKET
+	      else if (runp->ai_socktype == SOCK_SEQPACKET)
+		sockstr = "SEQPACKET";
+#endif
+#ifdef SOCK_RDM
+	      else if (runp->ai_socktype == SOCK_RDM)
+		sockstr = "RDM";
+#endif
+#ifdef SOCK_DCCP
+	      else if (runp->ai_socktype == SOCK_DCCP)
+		sockstr = "DCCP";
+#endif
+#ifdef SOCK_PACKET
+	      else if (runp->ai_socktype == SOCK_PACKET)
+		sockstr = "PACKET";
+#endif
 	      else
 		{
 		  snprintf (sockbuf, sizeof (sockbuf), "%d",
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index 3de83e3948..7548ddf6f0 100644
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -97,8 +97,9 @@ struct gaih_typeproto
   {
     int socktype;
     int protocol;
-    char name[4];
-    int protoflag;
+    uint8_t protoflag;
+    bool defaultflag;
+    char name[8];
   };
 
 /* Values for `protoflag'.  */
@@ -107,11 +108,17 @@ struct gaih_typeproto
 
 static const struct gaih_typeproto gaih_inet_typeproto[] =
 {
-  { 0, 0, "", 0 },
-  { SOCK_STREAM, IPPROTO_TCP, "tcp", 0 },
-  { SOCK_DGRAM, IPPROTO_UDP, "udp", 0 },
-  { SOCK_RAW, 0, "raw", GAI_PROTO_PROTOANY|GAI_PROTO_NOSERVICE },
-  { 0, 0, "", 0 }
+  { 0, 0, 0, false, "" },
+  { SOCK_STREAM, IPPROTO_TCP, 0, true, "tcp" },
+  { SOCK_DGRAM, IPPROTO_UDP, 0, true, "udp" },
+#if defined SOCK_DCCP && defined IPPROTO_DCCP
+  { SOCK_DCCP, IPPROTO_DCCP, 0, false, "dccp" },
+#endif
+#ifdef IPPROTO_UDPLITE
+  { SOCK_DGRAM, IPPROTO_UDPLITE, 0, false, "udplite" },
+#endif
+  { SOCK_RAW, 0, GAI_PROTO_PROTOANY|GAI_PROTO_NOSERVICE, true, "raw" },
+  { 0, 0, 0, false, "" }
 };
 
 struct gaih
@@ -363,18 +370,19 @@ gaih_inet (const char *name, const struct gaih_service *service,
 	     we know about.  */
 	  struct gaih_servtuple **lastp = &st;
 	  for (++tp; tp->name[0]; ++tp)
-	    {
-	      struct gaih_servtuple *newp;
+	    if (tp->defaultflag)
+	      {
+		struct gaih_servtuple *newp;
 
-	      newp = __alloca (sizeof (struct gaih_servtuple));
-	      newp->next = NULL;
-	      newp->socktype = tp->socktype;
-	      newp->protocol = tp->protocol;
-	      newp->port = port;
+		newp = __alloca (sizeof (struct gaih_servtuple));
+		newp->next = NULL;
+		newp->socktype = tp->socktype;
+		newp->protocol = tp->protocol;
+		newp->port = port;
 
-	      *lastp = newp;
-	      lastp = &newp->next;
-	    }
+		*lastp = newp;
+		lastp = &newp->next;
+	      }
 	}
     }
 
diff --git a/sysdeps/unix/sysv/linux/bits/socket.h b/sysdeps/unix/sysv/linux/bits/socket.h
index ceb60133e3..3dda3d1c29 100644
--- a/sysdeps/unix/sysv/linux/bits/socket.h
+++ b/sysdeps/unix/sysv/linux/bits/socket.h
@@ -1,5 +1,5 @@
 /* System-specific socket constants and types.  Linux version.
-   Copyright (C) 1991, 1992, 1994-2001, 2004, 2006, 2007
+   Copyright (C) 1991, 1992, 1994-2001, 2004, 2006, 2007, 2008
    Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -52,6 +52,8 @@ enum __socket_type
   SOCK_SEQPACKET = 5,		/* Sequenced, reliable, connection-based,
 				   datagrams of fixed maximum length.  */
 #define SOCK_SEQPACKET SOCK_SEQPACKET
+  SOCK_DCCP = 6,
+#define SOCK_DCCP SOCK_DCCP	/* Datagram Congestion Control Protocol.  */
   SOCK_PACKET = 10		/* Linux specific way of getting packets
 				   at the dev level.  For writing rarp and
 				   other similar things on the user level. */