ndresvport): Wrap around to startport in the loop if port is bigger than
authordrepper <drepper>
Tue, 22 Nov 2005 04:39:05 +0000 (04:39 +0000)
committerdrepper <drepper>
Tue, 22 Nov 2005 04:39:05 +0000 (04:39 +0000)
endport, initially set to ENDPORT.  When changing startport, set endport
and port appropriately.

sunrpc/bindrsvprt.c

index f58d3b2..023ae17 100644 (file)
@@ -74,14 +74,13 @@ bindresvport (int sd, struct sockaddr_in *sin)
   int res = -1;
 
   int nports = ENDPORT - startport + 1;
+  int endport = ENDPORT;
  again:
   for (i = 0; i < nports; ++i)
     {
       sin->sin_port = htons (port++);
-      if (port > ENDPORT)
-       {
-         port = startport;
-       }
+      if (port > endport)
+       port = startport;
       res = __bind (sd, sin, sizeof (struct sockaddr_in));
       if (res >= 0 || errno != EADDRINUSE)
        break;
@@ -90,7 +89,9 @@ bindresvport (int sd, struct sockaddr_in *sin)
   if (i == nports && startport != LOWPORT)
     {
       startport = LOWPORT;
+      endport = STARTPORT - 1;
       nports = STARTPORT - LOWPORT;
+      port = LOWPORT + port % (STARTPORT - LOWPORT);
       goto again;
     }