summaryrefslogtreecommitdiffstats
path: root/lib/libc/net/rcmd.c
diff options
context:
space:
mode:
authorderaadt <deraadt@openbsd.org>1996-07-29 05:48:39 +0000
committerderaadt <deraadt@openbsd.org>1996-07-29 05:48:39 +0000
commit16ef94ee0945ea66a4aadadc833f8922d19dc7f3 (patch)
treea75bb6e32718492554e529f956c7d2a26f4f099d /lib/libc/net/rcmd.c
parentRemove some FreeBSD cruft. (diff)
downloadwireguard-openbsd-16ef94ee0945ea66a4aadadc833f8922d19dc7f3.tar.xz
wireguard-openbsd-16ef94ee0945ea66a4aadadc833f8922d19dc7f3.zip
rresvport() in terms of bind() & bindresvport()
Diffstat (limited to 'lib/libc/net/rcmd.c')
-rw-r--r--lib/libc/net/rcmd.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/lib/libc/net/rcmd.c b/lib/libc/net/rcmd.c
index 22a956cfb05..28420d20ebe 100644
--- a/lib/libc/net/rcmd.c
+++ b/lib/libc/net/rcmd.c
@@ -228,21 +228,19 @@ rresvport(alport)
s = socket(AF_INET, SOCK_STREAM, 0);
if (s < 0)
return (-1);
- for (;;) {
- sin.sin_port = htons((u_short)*alport);
- if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) >= 0)
- return (s);
- if (errno != EADDRINUSE) {
- (void)close(s);
- return (-1);
- }
- (*alport)--;
- if (*alport == IPPORT_RESERVED/2) {
- (void)close(s);
- errno = EAGAIN; /* close */
- return (-1);
- }
+ sin.sin_port = htons((u_short)*alport);
+ if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) >= 0)
+ return (s);
+ if (errno != EADDRINUSE) {
+ (void)close(s);
+ return (-1);
}
+ if (bindresvport(s, &sin) == -1) {
+ (void)close(s);
+ return (-1);
+ }
+ *alport = (int)ntohs(sin.sin_port);
+ return (s);
}
int __check_rhosts_file = 1;