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