summaryrefslogtreecommitdiffstats
path: root/lib/libc/rpc/bindresvport.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/rpc/bindresvport.c')
-rw-r--r--lib/libc/rpc/bindresvport.c46
1 files changed, 31 insertions, 15 deletions
diff --git a/lib/libc/rpc/bindresvport.c b/lib/libc/rpc/bindresvport.c
index 2aed9dd..43b2a4f 100644
--- a/lib/libc/rpc/bindresvport.c
+++ b/lib/libc/rpc/bindresvport.c
@@ -1,3 +1,5 @@
+/* $NetBSD: bindresvport.c,v 1.19 2000/07/06 03:03:59 christos Exp $ */
+
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
@@ -27,6 +29,7 @@
* Mountain View, California 94043
*/
+#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
/*static char *sccsid = "from: @(#)bindresvport.c 1.8 88/02/08 SMI";*/
/*static char *sccsid = "from: @(#)bindresvport.c 2.2 88/07/29 4.0 RPCSRC";*/
@@ -42,10 +45,16 @@ static char *rcsid = "$FreeBSD$";
#include "namespace.h"
#include <sys/types.h>
-#include <sys/errno.h>
#include <sys/socket.h>
+
#include <netinet/in.h>
+
+#include <errno.h>
+#include <string.h>
#include <unistd.h>
+
+#include <rpc/rpc.h>
+
#include <string.h>
#include "un-namespace.h"
@@ -61,7 +70,7 @@ bindresvport(sd, sin)
}
/*
- * Bind a socket to a privileged port for whatever protocol.
+ * Bind a socket to a privileged IP port
*/
int
bindresvport_sa(sd, sa)
@@ -71,10 +80,12 @@ bindresvport_sa(sd, sa)
int old, error, af;
struct sockaddr_storage myaddr;
struct sockaddr_in *sin;
+#ifdef INET6
struct sockaddr_in6 *sin6;
+#endif
int proto, portrange, portlow;
- u_int16_t port;
- int salen;
+ u_int16_t *portp;
+ socklen_t salen;
if (sa == NULL) {
salen = sizeof(myaddr);
@@ -84,33 +95,38 @@ bindresvport_sa(sd, sa)
return -1; /* errno is correctly set */
af = sa->sa_family;
- memset(&myaddr, 0, salen);
+ memset(sa, 0, salen);
} else
af = sa->sa_family;
- if (af == AF_INET) {
+ switch (af) {
+ case AF_INET:
proto = IPPROTO_IP;
portrange = IP_PORTRANGE;
portlow = IP_PORTRANGE_LOW;
sin = (struct sockaddr_in *)sa;
salen = sizeof(struct sockaddr_in);
- port = sin->sin_port;
- } else if (af == AF_INET6) {
+ portp = &sin->sin_port;
+ break;
+#ifdef INET6
+ case AF_INET6:
proto = IPPROTO_IPV6;
portrange = IPV6_PORTRANGE;
portlow = IPV6_PORTRANGE_LOW;
sin6 = (struct sockaddr_in6 *)sa;
salen = sizeof(struct sockaddr_in6);
- port = sin6->sin6_port;
- } else {
+ portp = &sin6->sin6_port;
+ break;
+#endif
+ default:
errno = EPFNOSUPPORT;
return (-1);
}
sa->sa_family = af;
sa->sa_len = salen;
- if (port == 0) {
- int oldlen = sizeof(old);
+ if (*portp == 0) {
+ socklen_t oldlen = sizeof(old);
error = _getsockopt(sd, proto, portrange, &old, &oldlen);
if (error < 0)
@@ -124,10 +140,10 @@ bindresvport_sa(sd, sa)
error = _bind(sd, sa, salen);
- if (port == 0) {
+ if (*portp == 0) {
int saved_errno = errno;
- if (error) {
+ if (error < 0) {
if (_setsockopt(sd, proto, portrange, &old,
sizeof(old)) < 0)
errno = saved_errno;
@@ -135,7 +151,7 @@ bindresvport_sa(sd, sa)
}
if (sa != (struct sockaddr *)&myaddr) {
- /* Hmm, what did the kernel assign... */
+ /* Hmm, what did the kernel assign? */
if (_getsockname(sd, sa, &salen) < 0)
errno = saved_errno;
return (error);
OpenPOWER on IntegriCloud