[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#638810: [PATCH] Add bindresvport6() implementation.



Convert existing bindresvport() implementation into a more generic
function used by both bindresvport() and bindresvport6().

---
The symbol version changes for this are a bit of a guess; I really have
no idea what the difference is between the definitions in Versions and
abilist/libc.abilist.

Ben.

 bindrsvprt.c |   41 +++++++++++++++++++++++++++++++----------
 1 file changed, 31 insertions(+), 10 deletions(-)

--- eglibc-2.13.orig/sunrpc/bindrsvprt.c
+++ eglibc-2.13/sunrpc/bindrsvprt.c
@@ -121,29 +121,17 @@
 /*
  * Bind a socket to a privileged IP port
  */
-int
-bindresvport (int sd, struct sockaddr_in *sin)
+static int
+__bindresvport (int sd, struct sockaddr *addr, size_t addrlen,
+		in_port_t *addrport)
 {
   static short startport = STARTPORT;
   static short port;
-  struct sockaddr_in myaddr;
   int i;
 
   if (!blacklist_read)
     load_blacklist ();
 
-  if (sin == (struct sockaddr_in *) 0)
-    {
-      sin = &myaddr;
-      __bzero (sin, sizeof (*sin));
-      sin->sin_family = AF_INET;
-    }
-  else if (sin->sin_family != AF_INET)
-    {
-      __set_errno (EAFNOSUPPORT);
-      return -1;
-    }
-
   if (port == 0)
     {
       port = (__getpid () % NPORTS) + STARTPORT;
@@ -160,14 +148,14 @@
     {
       int j;
 
-      sin->sin_port = htons (port);
+      *addrport = htons (port);
 
       /* Check, if this port is not blacklisted.  */
       for (j = 0; j < list_size; j++)
 	if (port == list[j])
 	  goto try_next_port;
 
-      res = __bind (sd, sin, sizeof (struct sockaddr_in));
+      res = __bind (sd, addr, addrlen);
       if (res >= 0 || errno != EADDRINUSE)
 	break;
 
@@ -187,4 +175,46 @@
 
   return res;
 }
+
+int
+bindresvport (int sd, struct sockaddr_in *sin)
+{
+  struct sockaddr_in myaddr;
+
+  if (sin == (struct sockaddr_in *) 0)
+    {
+      sin = &myaddr;
+      __bzero (sin, sizeof (*sin));
+      sin->sin_family = AF_INET;
+    }
+  else if (sin->sin_family != AF_INET)
+    {
+      __set_errno (EAFNOSUPPORT);
+      return -1;
+    }
+
+  return __bindresvport (sd, (struct sockaddr *) sin, sizeof (*sin),
+			 &sin->sin_port);
+}
 libc_hidden_def (bindresvport)
+
+int
+bindresvport6 (int sd, struct sockaddr_in6 *sin6)
+{
+  struct sockaddr_in6 myaddr;
+
+  if (sin6 == (struct sockaddr_in6 *) 0)
+    {
+      sin6 = &myaddr;
+      __bzero (sin6, sizeof (*sin6));
+      sin6->sin6_family = AF_INET6;
+    }
+  else if (sin6->sin6_family != AF_INET6)
+    {
+      __set_errno (EAFNOSUPPORT);
+      return -1;
+    }
+
+  return __bindresvport (sd, (struct sockaddr *) sin6, sizeof (*sin6),
+			 &sin6->sin6_port);
+}
--- eglibc-2.13.orig/sunrpc/Versions
+++ eglibc-2.13/sunrpc/Versions
@@ -116,6 +116,9 @@
   GLIBC_2.3.4 {
     xdr_quad_t; xdr_u_quad_t;
   }
+  GLIBC_2.13_DEBIAN {
+    bindresvport6;
+  }
   GLIBC_PRIVATE {
     __libc_clntudp_bufcreate; __libc_rpc_getport;
   }
--- eglibc-2.13.orig/Versions.def
+++ eglibc-2.13/Versions.def
@@ -30,6 +30,7 @@
   GLIBC_2.11
   GLIBC_2.12
   GLIBC_2.13
+  GLIBC_2.13_DEBIAN
 %ifdef USE_IN_LIBIO
   HURD_CTHREADS_0.3
 %endif
--- eglibc-2.13.orig/abilist/libc.abilist
+++ eglibc-2.13/abilist/libc.abilist
@@ -2229,3 +2229,5 @@
 GLIBC_2.3 ia64-.*-linux.*/tls powerpc64-.*-linux.*/thread s390x-.*-linux.*/tls x86_64-.*-linux.*/tls
  _sys_errlist D 0x3f0
  sys_errlist D 0x3f0
+GLIBC_2.13_DEBIAN .*-.*-linux.* .*-.*-gnu-gnu.* .*-.*-freebsd.*-gnu.*
+ bindresvport6 F
---

Attachment: signature.asc
Description: This is a digitally signed message part


Reply to: