]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/statd/rmtcall.c
Be more cautious about use for privilege ports (<1024).
[nfs-utils.git] / utils / statd / rmtcall.c
index 816a6f368fa208d12313de3f1721d297401cf42a..eb1919ab363d221d481069d6ca9b722577729110 100644 (file)
@@ -62,25 +62,37 @@ int
 statd_get_socket(void)
 {
        struct sockaddr_in      sin;
+       struct servent *se;
+       int loopcnt = 100;
 
        if (sockfd >= 0)
                return sockfd;
 
-       if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
-               note(N_CRIT, "Can't create socket: %m");
-               return -1;
-       }
+       while (loopcnt-- > 0) {
 
-       FD_SET(sockfd, &SVC_FDSET);
+               if (sockfd >= 0) close(sockfd);
 
-       memset(&sin, 0, sizeof(sin));
-       sin.sin_family = AF_INET;
-       sin.sin_addr.s_addr = INADDR_ANY;
+               if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
+                       note(N_CRIT, "Can't create socket: %m");
+                       return -1;
+               }
 
-       if (bindresvport(sockfd, &sin) < 0) {
-               dprintf(N_WARNING,
-                       "process_hosts: can't bind to reserved port\n");
+
+               memset(&sin, 0, sizeof(sin));
+               sin.sin_family = AF_INET;
+               sin.sin_addr.s_addr = INADDR_ANY;
+
+               if (bindresvport(sockfd, &sin) < 0) {
+                       dprintf(N_WARNING,
+                               "process_hosts: can't bind to reserved port\n");
+                       break;
+               }
+               se = getservbyport(sin.sin_port, "udp");
+               if (se == NULL)
+                       break;
+               /* rather not use that port, try again */
        }
+       FD_SET(sockfd, &SVC_FDSET);
        return sockfd;
 }