X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fstatd%2Frmtcall.c;fp=utils%2Fstatd%2Frmtcall.c;h=eb1919ab363d221d481069d6ca9b722577729110;hp=816a6f368fa208d12313de3f1721d297401cf42a;hb=0210f16cf1bd2f87b7fe4336311c6dfd88030f8b;hpb=ec79b7a3b06c034a9a71a39a5ac24b66dbd475a6 diff --git a/utils/statd/rmtcall.c b/utils/statd/rmtcall.c index 816a6f3..eb1919a 100644 --- a/utils/statd/rmtcall.c +++ b/utils/statd/rmtcall.c @@ -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; }