+++ /dev/null
-Bottom: a8d2f5e9e4909e604d5a7b614f02d08080507dcb
-Top: 5fd229f7e20bde0c0ed3050847f79e5d4c8af2b1
-Author: Sean Hefty <sean.hefty@intel.com>
-Date: 2012-07-17 10:19:20 -0700
-
-Refresh of transpose
-
----
-
-diff --git a/src/preload.c b/src/preload.c
-index 498e813..8f281d3 100644
---- a/src/preload.c
-+++ b/src/preload.c
-@@ -276,60 +276,73 @@ out:
- }
-
- /*
-- * Convert between an rsocket and a normal socket. The new socket should have
-- * the same settings and bindings as the current socket. We currently only
-- * handle setting a few of the more common values.
-+ * We currently only handle copying a few common values.
- */
--static int transpose_socket(int index, int *fd, enum fd_type new_type)
-+static int copysockopts(int dfd, int sfd, struct socket_calls *dapi,
-+ struct socket_calls *sapi)
-+{
-+ socklen_t len;
-+ int param, ret;
-+
-+ ret = sapi->fcntl(sfd, F_GETFL);
-+ if (ret > 0)
-+ ret = dapi->fcntl(dfd, F_SETFL, ret);
-+ if (ret)
-+ return ret;
-+
-+ len = sizeof param;
-+ ret = sapi->getsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, ¶m, &len);
-+ if (param && !ret)
-+ ret = dapi->setsockopt(dfd, SOL_SOCKET, SO_REUSEADDR, ¶m, len);
-+ if (ret)
-+ return ret;
-+
-+ len = sizeof param;
-+ ret = sapi->getsockopt(sfd, IPPROTO_TCP, TCP_NODELAY, ¶m, &len);
-+ if (param && !ret)
-+ ret = dapi->setsockopt(dfd, IPPROTO_TCP, TCP_NODELAY, ¶m, len);
-+ if (ret)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+/*
-+ * Convert between an rsocket and a normal socket.
-+ */
-+static int transpose_socket(int socket, enum fd_type new_type)
- {
- socklen_t len = 0;
-- int new_fd, param, ret;
-- struct socket_calls *new, *old;
-+ int sfd, dfd, param, ret;
-+ struct socket_calls *sapi, *dapi;
-
-+ sfd = fd_getd(socket);
- if (new_type == fd_rsocket) {
-- new = &rs;
-- old = ℜ
-+ dapi = &rs;
-+ sapi = ℜ
- } else {
-- new = ℜ
-- old = &rs;
-+ dapi = ℜ
-+ sapi = &rs;
- }
-
-- ret = old->getsockname(*fd, NULL, &len);
-+ ret = sapi->getsockname(sfd, NULL, &len);
- if (ret)
- return ret;
-
- param = (len == sizeof(struct sockaddr_in6)) ? PF_INET6 : PF_INET;
-- new_fd = new->socket(param, SOCK_STREAM, 0);
-- if (new_fd < 0)
-- return new_fd;
--
-- ret = old->fcntl(*fd, F_GETFL);
-- if (ret > 0)
-- ret = new->fcntl(new_fd, F_SETFL, ret);
-- if (ret)
-- goto err;
--
-- len = sizeof param;
-- ret = old->getsockopt(*fd, SOL_SOCKET, SO_REUSEADDR, ¶m, &len);
-- if (param && !ret)
-- ret = new->setsockopt(new_fd, SOL_SOCKET, SO_REUSEADDR, ¶m, len);
-- if (ret)
-- goto err;
-+ dfd = dapi->socket(param, SOCK_STREAM, 0);
-+ if (dfd < 0)
-+ return dfd;
-
-- len = sizeof param;
-- ret = old->getsockopt(*fd, IPPROTO_TCP, TCP_NODELAY, ¶m, &len);
-- if (param && !ret)
-- ret = new->setsockopt(new_fd, IPPROTO_TCP, TCP_NODELAY, ¶m, len);
-+ ret = copysockopts(dfd, sfd, dapi, sapi);
- if (ret)
- goto err;
-
-- old->close(*fd);
-- fd_store(socket, new_fd, new_type);
-- *fd = new_fd;
-- return 0;
-+ fd_store(socket, dfd, new_type);
-+ return dfd;
-
- err:
-- new->close(new_fd);
-+ dapi->close(dfd);
- return ret;
- }
-
-@@ -384,9 +397,12 @@ int bind(int socket, const struct sockaddr *addr, socklen_t addrlen)
- if (!sin->sin_port || ntohs(sin->sin_port) > 1024)
- return rbind(fd, addr, addrlen);
-
-- ret = transpose_socket(socket, &fd, fd_normal);
-- if (ret)
-+ ret = transpose_socket(socket, fd_normal);
-+ if (ret < 0)
- return ret;
-+
-+ rclose(fd);
-+ fd = ret;
- }
-
- return real.bind(fd, addr, addrlen);
-@@ -434,9 +450,12 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen)
- return ret;
- }
-
-- ret = transpose_socket(socket, &fd, fd_normal);
-+ ret = transpose_socket(socket, fd_normal);
- if (ret)
- return ret;
-+
-+ rclose(fd);
-+ fd = ret;
- }
-
- return real.connect(fd, addr, addrlen);
Bottom: 7ec243f3149e9a1ff1d5183f18e30d2458e354d6
-Top: a8d2f5e9e4909e604d5a7b614f02d08080507dcb
+Top: 5fd229f7e20bde0c0ed3050847f79e5d4c8af2b1
Author: Sean Hefty <sean.hefty@intel.com>
Date: 2012-07-16 14:17:58 -0700
---
diff --git a/src/preload.c b/src/preload.c
-index 2750b30..498e813 100644
+index 2750b30..8f281d3 100644
--- a/src/preload.c
+++ b/src/preload.c
@@ -53,38 +53,38 @@
getenv_options();
init = 1;
-@@ -252,51 +276,60 @@ out:
+@@ -252,51 +276,73 @@ out:
}
/*
- * Convert from an rsocket to a normal socket. The new socket should have the
- * same settings and bindings as the rsocket. We currently only handle setting
- * a few of the more common values.
-+ * Convert between an rsocket and a normal socket. The new socket should have
-+ * the same settings and bindings as the current socket. We currently only
-+ * handle setting a few of the more common values.
++ * We currently only handle copying a few common values.
*/
-static int socket_fallback(int socket, int *fd)
-+static int transpose_socket(int index, int *fd, enum fd_type new_type)
++static int copysockopts(int dfd, int sfd, struct socket_calls *dapi,
++ struct socket_calls *sapi)
{
- socklen_t len = 0;
- int new_fd, param, ret;
-+ struct socket_calls *new, *old;
-+
-+ if (new_type == fd_rsocket) {
-+ new = &rs;
-+ old = ℜ
-+ } else {
-+ new = ℜ
-+ old = &rs;
-+ }
+- socklen_t len = 0;
+- int new_fd, param, ret;
++ socklen_t len;
++ int param, ret;
- ret = rgetsockname(*fd, NULL, &len);
-+ ret = old->getsockname(*fd, NULL, &len);
- if (ret)
- return ret;
-
- param = (len == sizeof(struct sockaddr_in6)) ? PF_INET6 : PF_INET;
+- if (ret)
+- return ret;
+-
+- param = (len == sizeof(struct sockaddr_in6)) ? PF_INET6 : PF_INET;
- new_fd = real_socket(param, SOCK_STREAM, IPPROTO_TCP);
-+ new_fd = new->socket(param, SOCK_STREAM, 0);
- if (new_fd < 0)
- return new_fd;
-
+- if (new_fd < 0)
+- return new_fd;
+-
- ret = rfcntl(*fd, F_GETFL);
-+ ret = old->fcntl(*fd, F_GETFL);
++ ret = sapi->fcntl(sfd, F_GETFL);
if (ret > 0)
- ret = real_fcntl(new_fd, F_SETFL, ret);
-+ ret = new->fcntl(new_fd, F_SETFL, ret);
++ ret = dapi->fcntl(dfd, F_SETFL, ret);
if (ret)
- goto err;
+- goto err;
++ return ret;
len = sizeof param;
- ret = rgetsockopt(*fd, SOL_SOCKET, SO_REUSEADDR, ¶m, &len);
-+ ret = old->getsockopt(*fd, SOL_SOCKET, SO_REUSEADDR, ¶m, &len);
++ ret = sapi->getsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, ¶m, &len);
if (param && !ret)
- ret = real_setsockopt(new_fd, SOL_SOCKET, SO_REUSEADDR, ¶m, len);
-+ ret = new->setsockopt(new_fd, SOL_SOCKET, SO_REUSEADDR, ¶m, len);
++ ret = dapi->setsockopt(dfd, SOL_SOCKET, SO_REUSEADDR, ¶m, len);
if (ret)
- goto err;
+- goto err;
++ return ret;
len = sizeof param;
- ret = rgetsockopt(*fd, IPPROTO_TCP, TCP_NODELAY, ¶m, &len);
-+ ret = old->getsockopt(*fd, IPPROTO_TCP, TCP_NODELAY, ¶m, &len);
++ ret = sapi->getsockopt(sfd, IPPROTO_TCP, TCP_NODELAY, ¶m, &len);
if (param && !ret)
- ret = real_setsockopt(new_fd, IPPROTO_TCP, TCP_NODELAY, ¶m, len);
-+ ret = new->setsockopt(new_fd, IPPROTO_TCP, TCP_NODELAY, ¶m, len);
++ ret = dapi->setsockopt(dfd, IPPROTO_TCP, TCP_NODELAY, ¶m, len);
if (ret)
- goto err;
+- goto err;
++ return ret;
- rclose(*fd);
- fd_store(socket, new_fd, fd_normal);
-+ old->close(*fd);
-+ fd_store(socket, new_fd, new_type);
- *fd = new_fd;
+- *fd = new_fd;
return 0;
++}
++
++/*
++ * Convert between an rsocket and a normal socket.
++ */
++static int transpose_socket(int socket, enum fd_type new_type)
++{
++ socklen_t len = 0;
++ int sfd, dfd, param, ret;
++ struct socket_calls *sapi, *dapi;
++
++ sfd = fd_getd(socket);
++ if (new_type == fd_rsocket) {
++ dapi = &rs;
++ sapi = ℜ
++ } else {
++ dapi = ℜ
++ sapi = &rs;
++ }
++
++ ret = sapi->getsockname(sfd, NULL, &len);
++ if (ret)
++ return ret;
++
++ param = (len == sizeof(struct sockaddr_in6)) ? PF_INET6 : PF_INET;
++ dfd = dapi->socket(param, SOCK_STREAM, 0);
++ if (dfd < 0)
++ return dfd;
++
++ ret = copysockopts(dfd, sfd, dapi, sapi);
++ if (ret)
++ goto err;
++
++ fd_store(socket, dfd, new_type);
++ return dfd;
err:
- real_close(new_fd);
-+ new->close(new_fd);
++ dapi->close(dfd);
return ret;
}
-@@ -338,7 +371,7 @@ int socket(int domain, int type, int protocol)
+@@ -338,7 +384,7 @@ int socket(int domain, int type, int protocol)
}
fd_close(index, &ret);
real:
}
int bind(int socket, const struct sockaddr *addr, socklen_t addrlen)
-@@ -351,19 +384,19 @@ int bind(int socket, const struct sockaddr *addr, socklen_t addrlen)
+@@ -351,19 +397,22 @@ int bind(int socket, const struct sockaddr *addr, socklen_t addrlen)
if (!sin->sin_port || ntohs(sin->sin_port) > 1024)
return rbind(fd, addr, addrlen);
- ret = socket_fallback(socket, &fd);
-+ ret = transpose_socket(socket, &fd, fd_normal);
- if (ret)
+- if (ret)
++ ret = transpose_socket(socket, fd_normal);
++ if (ret < 0)
return ret;
++
++ rclose(fd);
++ fd = ret;
}
- return real_bind(fd, addr, addrlen);
}
int accept(int socket, struct sockaddr *addr, socklen_t *addrlen)
-@@ -384,7 +417,7 @@ int accept(int socket, struct sockaddr *addr, socklen_t *addrlen)
+@@ -384,7 +433,7 @@ int accept(int socket, struct sockaddr *addr, socklen_t *addrlen)
fd_store(index, ret, fd_rsocket);
return index;
} else {
}
}
-@@ -401,19 +434,19 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen)
+@@ -401,19 +450,22 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen)
return ret;
}
- ret = socket_fallback(socket, &fd);
-+ ret = transpose_socket(socket, &fd, fd_normal);
++ ret = transpose_socket(socket, fd_normal);
if (ret)
return ret;
++
++ rclose(fd);
++ fd = ret;
}
- return real_connect(fd, addr, addrlen);
}
ssize_t recvfrom(int socket, void *buf, size_t len, int flags,
-@@ -422,14 +455,14 @@ ssize_t recvfrom(int socket, void *buf, size_t len, int flags,
+@@ -422,14 +474,14 @@ ssize_t recvfrom(int socket, void *buf, size_t len, int flags,
int fd;
return (fd_get(socket, &fd) == fd_rsocket) ?
rrecvfrom(fd, buf, len, flags, src_addr, addrlen) :
}
ssize_t read(int socket, void *buf, size_t count)
-@@ -437,7 +470,7 @@ ssize_t read(int socket, void *buf, size_t count)
+@@ -437,7 +489,7 @@ ssize_t read(int socket, void *buf, size_t count)
int fd;
init_preload();
return (fd_get(socket, &fd) == fd_rsocket) ?
}
ssize_t readv(int socket, const struct iovec *iov, int iovcnt)
-@@ -445,14 +478,14 @@ ssize_t readv(int socket, const struct iovec *iov, int iovcnt)
+@@ -445,14 +497,14 @@ ssize_t readv(int socket, const struct iovec *iov, int iovcnt)
int fd;
init_preload();
return (fd_get(socket, &fd) == fd_rsocket) ?
}
ssize_t sendto(int socket, const void *buf, size_t len, int flags,
-@@ -461,14 +494,14 @@ ssize_t sendto(int socket, const void *buf, size_t len, int flags,
+@@ -461,14 +513,14 @@ ssize_t sendto(int socket, const void *buf, size_t len, int flags,
int fd;
return (fd_get(socket, &fd) == fd_rsocket) ?
rsendto(fd, buf, len, flags, dest_addr, addrlen) :
}
ssize_t write(int socket, const void *buf, size_t count)
-@@ -476,7 +509,7 @@ ssize_t write(int socket, const void *buf, size_t count)
+@@ -476,7 +528,7 @@ ssize_t write(int socket, const void *buf, size_t count)
int fd;
init_preload();
return (fd_get(socket, &fd) == fd_rsocket) ?
}
ssize_t writev(int socket, const struct iovec *iov, int iovcnt)
-@@ -484,7 +517,7 @@ ssize_t writev(int socket, const struct iovec *iov, int iovcnt)
+@@ -484,7 +536,7 @@ ssize_t writev(int socket, const struct iovec *iov, int iovcnt)
int fd;
init_preload();
return (fd_get(socket, &fd) == fd_rsocket) ?
}
static struct pollfd *fds_alloc(nfds_t nfds)
-@@ -514,7 +547,7 @@ int poll(struct pollfd *fds, nfds_t nfds, int timeout)
+@@ -514,7 +566,7 @@ int poll(struct pollfd *fds, nfds_t nfds, int timeout)
goto use_rpoll;
}
use_rpoll:
rfds = fds_alloc(nfds);
-@@ -619,14 +652,14 @@ int shutdown(int socket, int how)
+@@ -619,14 +671,14 @@ int shutdown(int socket, int how)
{
int fd;
return (fd_get(socket, &fd) == fd_rsocket) ?
}
int getpeername(int socket, struct sockaddr *addr, socklen_t *addrlen)
-@@ -634,7 +667,7 @@ int getpeername(int socket, struct sockaddr *addr, socklen_t *addrlen)
+@@ -634,7 +686,7 @@ int getpeername(int socket, struct sockaddr *addr, socklen_t *addrlen)
int fd;
return (fd_get(socket, &fd) == fd_rsocket) ?
rgetpeername(fd, addr, addrlen) :
}
int getsockname(int socket, struct sockaddr *addr, socklen_t *addrlen)
-@@ -642,7 +675,7 @@ int getsockname(int socket, struct sockaddr *addr, socklen_t *addrlen)
+@@ -642,7 +694,7 @@ int getsockname(int socket, struct sockaddr *addr, socklen_t *addrlen)
int fd;
return (fd_get(socket, &fd) == fd_rsocket) ?
rgetsockname(fd, addr, addrlen) :
}
int setsockopt(int socket, int level, int optname,
-@@ -651,7 +684,7 @@ int setsockopt(int socket, int level, int optname,
+@@ -651,7 +703,7 @@ int setsockopt(int socket, int level, int optname,
int fd;
return (fd_get(socket, &fd) == fd_rsocket) ?
rsetsockopt(fd, level, optname, optval, optlen) :
}
int getsockopt(int socket, int level, int optname,
-@@ -660,7 +693,7 @@ int getsockopt(int socket, int level, int optname,
+@@ -660,7 +712,7 @@ int getsockopt(int socket, int level, int optname,
int fd;
return (fd_get(socket, &fd) == fd_rsocket) ?
rgetsockopt(fd, level, optname, optval, optlen) :
}
int fcntl(int socket, int cmd, ... /* arg */)
-@@ -679,7 +712,7 @@ int fcntl(int socket, int cmd, ... /* arg */)
+@@ -679,7 +731,7 @@ int fcntl(int socket, int cmd, ... /* arg */)
case F_GETSIG:
case F_GETLEASE:
ret = (fd_get(socket, &fd) == fd_rsocket) ?
break;
case F_DUPFD:
/*case F_DUPFD_CLOEXEC:*/
-@@ -691,12 +724,12 @@ int fcntl(int socket, int cmd, ... /* arg */)
+@@ -691,12 +743,12 @@ int fcntl(int socket, int cmd, ... /* arg */)
case F_NOTIFY:
lparam = va_arg(args, long);
ret = (fd_get(socket, &fd) == fd_rsocket) ?