diff options
Diffstat (limited to 'src/lib/libc/net/rcmd.c')
-rw-r--r-- | src/lib/libc/net/rcmd.c | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/src/lib/libc/net/rcmd.c b/src/lib/libc/net/rcmd.c index 22a956cfb0..28420d20eb 100644 --- a/src/lib/libc/net/rcmd.c +++ b/src/lib/libc/net/rcmd.c | |||
@@ -228,21 +228,19 @@ rresvport(alport) | |||
228 | s = socket(AF_INET, SOCK_STREAM, 0); | 228 | s = socket(AF_INET, SOCK_STREAM, 0); |
229 | if (s < 0) | 229 | if (s < 0) |
230 | return (-1); | 230 | return (-1); |
231 | for (;;) { | 231 | sin.sin_port = htons((u_short)*alport); |
232 | sin.sin_port = htons((u_short)*alport); | 232 | if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) >= 0) |
233 | if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) >= 0) | 233 | return (s); |
234 | return (s); | 234 | if (errno != EADDRINUSE) { |
235 | if (errno != EADDRINUSE) { | 235 | (void)close(s); |
236 | (void)close(s); | 236 | return (-1); |
237 | return (-1); | ||
238 | } | ||
239 | (*alport)--; | ||
240 | if (*alport == IPPORT_RESERVED/2) { | ||
241 | (void)close(s); | ||
242 | errno = EAGAIN; /* close */ | ||
243 | return (-1); | ||
244 | } | ||
245 | } | 237 | } |
238 | if (bindresvport(s, &sin) == -1) { | ||
239 | (void)close(s); | ||
240 | return (-1); | ||
241 | } | ||
242 | *alport = (int)ntohs(sin.sin_port); | ||
243 | return (s); | ||
246 | } | 244 | } |
247 | 245 | ||
248 | int __check_rhosts_file = 1; | 246 | int __check_rhosts_file = 1; |