-Bottom: 3ea2748a5c41b11a2e7033c56bddd938d2770b6c
+Bottom: 216c0397df2215433e2acfe73e52db57cbf694c4
Top: 652ae6e1dadacc92be353adaafd434f1ff7ddbfa
Author: Sean Hefty <sean.hefty@intel.com>
Date: 2012-08-10 21:44:39 -0700
---
diff --git a/src/preload.c b/src/preload.c
-index b18d310..8b86415 100644
+index bb8e3fb..8b86415 100644
--- a/src/preload.c
+++ b/src/preload.c
@@ -99,12 +99,20 @@ static int fork_support;
- type = fd_get(socket, &fd);
- if (type == fd_rsocket || type == fd_fork) {
+ if (fd_get(socket, &fd) == fd_rsocket) {
-+ index = fd_open();
-+ if (index < 0)
-+ return index;
-+
-+ ret = raccept(fd, addr, addrlen);
-+ if (ret < 0) {
-+ fd_close(index, &fd);
-+ return ret;
-+ }
-+
-+ fd_store(index, ret, fd_rsocket, fd_ready);
-+ return index;
-+ } else if (fd_gets(socket) == fd_fork_listen) {
index = fd_open();
if (index < 0)
return index;
- ret = (type == fd_rsocket) ? raccept(fd, addr, addrlen) :
- real.accept(fd, addr, addrlen);
-+ ret = real.accept(fd, addr, addrlen);
++ ret = raccept(fd, addr, addrlen);
if (ret < 0) {
fd_close(index, &fd);
return ret;
}
- fd_store(index, ret, type);
++ fd_store(index, ret, fd_rsocket, fd_ready);
++ return index;
++ } else if (fd_gets(socket) == fd_fork_listen) {
++ index = fd_open();
++ if (index < 0)
++ return index;
++
++ ret = real.accept(fd, addr, addrlen);
++ if (ret < 0) {
++ fd_close(index, &fd);
++ return ret;
++ }
++
+ fd_store(index, ret, fd_normal, fd_fork_passive);
return index;
} else {
+ ret = rconnect(ret, (struct sockaddr *) &addr, len);
+ if (ret)
+ goto err2;
-+
+
+- real.close(fd);
+- return rconnect(ret, addr, addrlen);
+ set_rsocket_options(dfd);
+ copysockopts(dfd, sfd, &rs, &real);
+ real.shutdown(sfd, SHUT_RDWR);
+ real.close(sfd);
+ fd_store(socket, dfd, fd_rsocket, fd_ready);
+ return;
-
-- real.close(fd);
-- return rconnect(ret, addr, addrlen);
++
+err2:
+ rclose(dfd);
+err1:
static void fork_passive(int socket)
{
struct sockaddr_in6 sin6;
-@@ -492,7 +545,7 @@ static void fork_passive(int socket)
- socklen_t len;
- uint32_t msg;
-
-- fd_get(socket, &sfd);
-+ sfd = fd_getd(socket);
-
- len = sizeof sin6;
- ret = real.getsockname(sfd, (struct sockaddr *) &sin6, &len);
-@@ -510,7 +563,7 @@ static void fork_passive(int socket)
-
- lfd = rsocket(sin6.sin6_family, SOCK_STREAM, 0);
- if (lfd < 0) {
-- ret = lfd;
-+ ret = lfd;
- goto sclose;
- }
-
-@@ -537,14 +590,11 @@ static void fork_passive(int socket)
- goto lclose;
- }
-
-- param = 1;
-- rsetsockopt(dfd, IPPROTO_TCP, TCP_NODELAY, ¶m, sizeof param);
- set_rsocket_options(dfd);
--
+@@ -541,7 +594,7 @@ static void fork_passive(int socket)
copysockopts(dfd, sfd, &rs, &real);
real.shutdown(sfd, SHUT_RDWR);
real.close(sfd);
lclose:
rclose(lfd);
-@@ -553,7 +603,7 @@ sclose:
+@@ -550,7 +603,7 @@ sclose:
sem_close(sem);
out:
if (ret)
}
static inline enum fd_type fd_fork_get(int index, int *fd)
-@@ -562,8 +612,10 @@ static inline enum fd_type fd_fork_get(int index, int *fd)
+@@ -559,8 +612,10 @@ static inline enum fd_type fd_fork_get(int index, int *fd)
fdi = idm_lookup(&idm, index);
if (fdi) {
*fd = fdi->fd;
return fdi->type;
-@@ -577,10 +629,7 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen)
+@@ -574,10 +629,7 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen)
{
int fd, ret;
ret = rconnect(fd, addr, addrlen);
if (!ret || errno == EINPROGRESS)
return ret;
-@@ -591,9 +640,8 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen)
+@@ -588,9 +640,8 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen)
rclose(fd);
fd = ret;