This depends on eglibc being patched as in #638810. Ben.
--- libtirpc-0.2.2.orig/src/bindresvport.c
+++ libtirpc-0.2.2/src/bindresvport.c
@@ -58,12 +58,8 @@
return bindresvport_sa(sd, (struct sockaddr *)sin);
}
-#ifdef __linux__
-
-#define STARTPORT 600
-#define LOWPORT 512
-#define ENDPORT (IPPORT_RESERVED - 1)
-#define NPORTS (ENDPORT - STARTPORT + 1)
+/* We now want to call libc's bindresvport() */
+#undef bindresvport
int
bindresvport_sa(sd, sa)
@@ -72,17 +68,7 @@
{
int res, af;
struct sockaddr_storage myaddr;
- struct sockaddr_in *sin;
-#ifdef INET6
- struct sockaddr_in6 *sin6;
-#endif
- u_int16_t *portp;
- static u_int16_t port;
- static short startport = STARTPORT;
socklen_t salen;
- int nports = ENDPORT - startport + 1;
- int endport = ENDPORT;
- int i;
if (sa == NULL) {
salen = sizeof(myaddr);
@@ -97,140 +83,11 @@
switch (af) {
case AF_INET:
- sin = (struct sockaddr_in *)sa;
- salen = sizeof(struct sockaddr_in);
- port = ntohs(sin->sin_port);
- portp = &sin->sin_port;
- break;
-#ifdef INET6
+ return bindresvport(sd, (struct sockaddr_in *)sa);
case AF_INET6:
- sin6 = (struct sockaddr_in6 *)sa;
- salen = sizeof(struct sockaddr_in6);
- port = ntohs(sin6->sin6_port);
- portp = &sin6->sin6_port;
- break;
-#endif
+ return bindresvport6(sd, (struct sockaddr_in6 *)sa);
default:
errno = EPFNOSUPPORT;
return (-1);
}
- sa->sa_family = af;
-
- if (port == 0) {
- port = (getpid() % NPORTS) + STARTPORT;
- }
- res = -1;
- errno = EADDRINUSE;
- again:
- for (i = 0; i < nports; ++i) {
- *portp = htons(port++);
- if (port > endport)
- port = startport;
- res = bind(sd, sa, salen);
- if (res >= 0 || errno != EADDRINUSE)
- break;
- }
- if (i == nports && startport != LOWPORT) {
- startport = LOWPORT;
- endport = STARTPORT - 1;
- nports = STARTPORT - LOWPORT;
- port = LOWPORT + port % (STARTPORT - LOWPORT);
- goto again;
- }
- return (res);
-}
-#else
-
-#define IP_PORTRANGE 19
-#define IP_PORTRANGE_LOW 2
-
-/*
- * Bind a socket to a privileged IP port
- */
-int
-bindresvport_sa(sd, sa)
- int sd;
- struct sockaddr *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 *portp;
- socklen_t salen;
-
- if (sa == NULL) {
- salen = sizeof(myaddr);
- sa = (struct sockaddr *)&myaddr;
-
- if (getsockname(sd, sa, &salen) == -1)
- return -1; /* errno is correctly set */
-
- af = sa->sa_family;
- memset(sa, 0, salen);
- } else
- af = sa->sa_family;
-
- 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);
- 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);
- portp = &sin6->sin6_port;
- break;
-#endif
- default:
- errno = EPFNOSUPPORT;
- return (-1);
- }
- sa->sa_family = af;
-
- if (*portp == 0) {
- socklen_t oldlen = sizeof(old);
-
- error = getsockopt(sd, proto, portrange, &old, &oldlen);
- if (error < 0)
- return (error);
-
- error = setsockopt(sd, proto, portrange, &portlow,
- sizeof(portlow));
- if (error < 0)
- return (error);
- }
-
- error = bind(sd, sa, salen);
-
- if (*portp == 0) {
- int saved_errno = errno;
-
- if (error < 0) {
- if (setsockopt(sd, proto, portrange, &old,
- sizeof(old)) < 0)
- errno = saved_errno;
- return (error);
- }
-
- if (sa != (struct sockaddr *)&myaddr) {
- /* Hmm, what did the kernel assign? */
- if (getsockname(sd, sa, &salen) < 0)
- errno = saved_errno;
- return (error);
- }
- }
- return (error);
}
-#endif
--- libtirpc-0.2.2.orig/tirpc/rpc/rpc.h
+++ libtirpc-0.2.2/tirpc/rpc/rpc.h
@@ -79,6 +79,10 @@
#define UDPMSGSIZE 8800
#endif
+/* Change the real name of our bindresvport() function so it can easily
+ * call libc's bindresvport() */
+#define bindresvport tirpc_bindresvport
+
__BEGIN_DECLS
extern int get_myaddress(struct sockaddr_in *);
extern int bindresvport(int, struct sockaddr_in *) __THROW;
---
signature.asc
Description: This is a digitally signed message part

