diff options
author | Roland McGrath <roland@gnu.org> | 2005-07-18 01:43:31 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2005-07-18 01:43:31 +0000 |
commit | fb7a30193e4bb0e0a282f9e2011557cfc2333a02 (patch) | |
tree | f202ea3b2ca305cac1ce7615a71a04d9c8cb7230 | |
parent | 278a5107898935732e43be70f2c3e68de4b31162 (diff) | |
download | glibc-fb7a30193e4bb0e0a282f9e2011557cfc2333a02.tar.gz glibc-fb7a30193e4bb0e0a282f9e2011557cfc2333a02.tar.xz glibc-fb7a30193e4bb0e0a282f9e2011557cfc2333a02.zip |
2005-05-23 Ulrich Drepper <drepper@redhat.com>
[BZ #1086] * sunrpc/bindrsvprt.c (LOWPORT): Apparently some mountd implementations are broken and don't accept ports < 512. [BZ #1086] * sunrpc/bindrsvprt.c (bindresvport): Try harder to find a port. If we tried looking at the usual range without success extend the range to even lower ports.
-rw-r--r-- | sunrpc/bindrsvprt.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/sunrpc/bindrsvprt.c b/sunrpc/bindrsvprt.c index 374518716e..f58d3b2a8b 100644 --- a/sunrpc/bindrsvprt.c +++ b/sunrpc/bindrsvprt.c @@ -43,14 +43,15 @@ int bindresvport (int sd, struct sockaddr_in *sin) { - int res; static short port; struct sockaddr_in myaddr; int i; #define STARTPORT 600 +#define LOWPORT 512 #define ENDPORT (IPPORT_RESERVED - 1) #define NPORTS (ENDPORT - STARTPORT + 1) + static short startport = STARTPORT; if (sin == (struct sockaddr_in *) 0) { @@ -68,17 +69,29 @@ bindresvport (int sd, struct sockaddr_in *sin) { port = (__getpid () % NPORTS) + STARTPORT; } - res = -1; - __set_errno (EADDRINUSE); - for (i = 0; i < NPORTS && res < 0 && errno == EADDRINUSE; ++i) + /* Initialize to make gcc happy. */ + int res = -1; + + int nports = ENDPORT - startport + 1; + again: + for (i = 0; i < nports; ++i) { sin->sin_port = htons (port++); if (port > ENDPORT) { - port = STARTPORT; + port = startport; } res = __bind (sd, sin, sizeof (struct sockaddr_in)); + if (res >= 0 || errno != EADDRINUSE) + break; + } + + if (i == nports && startport != LOWPORT) + { + startport = LOWPORT; + nports = STARTPORT - LOWPORT; + goto again; } return res; |