Version: 1
-Previous: 522ddb4fa21524c0f00148e1312e808d29de7f86
-Head: aaef2b3382a3bb7a45d12dfcf61dbe5f8114be6f
+Previous: 1250945bdad5b28b8152a68d2e8c30bf10001f2d
+Head: c41b63504fb961b432e3a09b0e9c99480ddf6a1a
Applied:
transpose: 84e0beee0d2d3c217cd9703b9e438d25856cacb6
- fork: b131326fd7cad28cd3b9a3d09c29c9476d7fddb0
- refresh-temp: aaef2b3382a3bb7a45d12dfcf61dbe5f8114be6f
+ fork: c41b63504fb961b432e3a09b0e9c99480ddf6a1a
Unapplied:
waitall-buggy: c49c6b56c55385774065f5aa2704078e6ae0ceb8
rs-1sge: 8ec392829399dec7ed5c608b8697a482e5faa2de
Bottom: c0306f4628b14e75db3da212b4a99875f49be65f
-Top: 3ef5d9a598c00e66ce2beafac99c914e0942c3c3
+Top: 89b109b9172f2fd26f7feaca314718e1127b4e64
Author: Sean Hefty <sean.hefty@intel.com>
Date: 2012-07-13 15:25:53 -0700
---
diff --git a/src/preload.c b/src/preload.c
-index d2058e2..5860a4c 100644
+index d2058e2..1d76df9 100644
--- a/src/preload.c
+++ b/src/preload.c
@@ -46,6 +46,8 @@
sin = (struct sockaddr_in *) addr;
if (ntohs(sin->sin_port) > 1024) {
ret = rconnect(fd, addr, addrlen);
-@@ -754,3 +803,57 @@ int fcntl(int socket, int cmd, ... /* arg */)
+@@ -754,3 +803,85 @@ int fcntl(int socket, int cmd, ... /* arg */)
va_end(args);
return ret;
}
+pid_t fork(void)
+{
+ struct sockaddr_storage sa;
++ struct sockaddr_in6 sin6;
+ pid_t pid;
+ sem_t *sem;
-+ int fd, lfd, newfd, ret, len, param;
++ int lfd, sfd, dfd, ret, len, param;
+ uint32_t msg;
+
+ init_preload();
+ pid = real.fork();
+ if (pid || !fork_support || (last_accept < 0) ||
-+ (fd_get(last_accept, &fd) != fd_fork))
++ (fd_get(last_accept, &sfd) != fd_fork))
+ goto out;
+
++ len = sizeof sa;
++ ret = real.getsockname(sfd, &sa, &len);
++ if (ret)
++ goto out;
++ sin6.sin6_family = sa.ss_family;
++ sin6.sin6_port = ((struct sockaddr_in6 *) &sa)->sin6_port;
++
+ sem = sem_open("/rsocket_fork", O_CREAT, 0644, 1);
+ if (sem == SEM_FAILED)
+ goto out;
+
-+ lfd = transpose_socket(last_accept, fd_rsocket);
++ lfd = rsocket(sa.ss_family, SOCK_STREAM, 0);
+ if (lfd < 0)
-+ goto out;
++ goto sclose;
+
+ param = 1;
-+ len = sizeof param;
-+ rsetsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, ¶m, len);
++ rsetsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, ¶m, sizeof param);
+
-+ len = sizeof sa;
-+ ret = real.getsockname(fd, &sa, &len);
++ sem_wait(sem);
++ ret = rbind(lfd, &sin6, sizeof sin6);
+ if (ret)
-+ goto out;
++ goto lclose;
+
-+ sem_wait(sem);
-+ ret = rbind()
++ ret = rlisten(lfd, 1);
++ if (ret)
++ goto lclose;
+
-+ real.close(fd);
++ dfd = raccept(lfd, NULL, NULL);
++ if (dfd < 0)
++ goto lclose;
++
++ param = 1;
++ rsetsockopt(dfd, IPPROTO_TCP, TCP_NODELAY, ¶m, sizeof param);
++
++ msg = 0;
++ ret = real.write(sfd, &msg, sizeof msg);
++ if (ret != sizeof msg) {
++ rclose(dfd);
++ goto lclose;
++ }
++
++ copysockopts(dfd, sfd, &rs, &real);
++ real.shutdown(sfd, SHUT_RDWR);
++ real.close(sfd);
++ fd_store(last_accept, dfd, fd_rsocket);
+
++lclose:
++ rclose(lfd);
+ sem_post(sem);
++sclose:
+ sem_close(sem);
+out:
+ last_accept = -1;
+++ /dev/null
-Bottom: 3ef5d9a598c00e66ce2beafac99c914e0942c3c3
-Top: 89b109b9172f2fd26f7feaca314718e1127b4e64
-Author: Sean Hefty <sean.hefty@intel.com>
-Date: 2012-07-17 12:34:22 -0700
-
-Refresh of fork
-
----
-
-diff --git a/src/preload.c b/src/preload.c
-index 5860a4c..1d76df9 100644
---- a/src/preload.c
-+++ b/src/preload.c
-@@ -818,40 +818,68 @@ int fcntl(int socket, int cmd, ... /* arg */)
- pid_t fork(void)
- {
- struct sockaddr_storage sa;
-+ struct sockaddr_in6 sin6;
- pid_t pid;
- sem_t *sem;
-- int fd, lfd, newfd, ret, len, param;
-+ int lfd, sfd, dfd, ret, len, param;
- uint32_t msg;
-
- init_preload();
- pid = real.fork();
- if (pid || !fork_support || (last_accept < 0) ||
-- (fd_get(last_accept, &fd) != fd_fork))
-+ (fd_get(last_accept, &sfd) != fd_fork))
- goto out;
-
-+ len = sizeof sa;
-+ ret = real.getsockname(sfd, &sa, &len);
-+ if (ret)
-+ goto out;
-+ sin6.sin6_family = sa.ss_family;
-+ sin6.sin6_port = ((struct sockaddr_in6 *) &sa)->sin6_port;
-+
- sem = sem_open("/rsocket_fork", O_CREAT, 0644, 1);
- if (sem == SEM_FAILED)
- goto out;
-
-- lfd = transpose_socket(last_accept, fd_rsocket);
-+ lfd = rsocket(sa.ss_family, SOCK_STREAM, 0);
- if (lfd < 0)
-- goto out;
-+ goto sclose;
-
- param = 1;
-- len = sizeof param;
-- rsetsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, ¶m, len);
-+ rsetsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, ¶m, sizeof param);
-
-- len = sizeof sa;
-- ret = real.getsockname(fd, &sa, &len);
-+ sem_wait(sem);
-+ ret = rbind(lfd, &sin6, sizeof sin6);
- if (ret)
-- goto out;
-+ goto lclose;
-
-- sem_wait(sem);
-- ret = rbind()
-+ ret = rlisten(lfd, 1);
-+ if (ret)
-+ goto lclose;
-
-- real.close(fd);
-+ dfd = raccept(lfd, NULL, NULL);
-+ if (dfd < 0)
-+ goto lclose;
-+
-+ param = 1;
-+ rsetsockopt(dfd, IPPROTO_TCP, TCP_NODELAY, ¶m, sizeof param);
-+
-+ msg = 0;
-+ ret = real.write(sfd, &msg, sizeof msg);
-+ if (ret != sizeof msg) {
-+ rclose(dfd);
-+ goto lclose;
-+ }
-+
-+ copysockopts(dfd, sfd, &rs, &real);
-+ real.shutdown(sfd, SHUT_RDWR);
-+ real.close(sfd);
-+ fd_store(last_accept, dfd, fd_rsocket);
-
-+lclose:
-+ rclose(lfd);
- sem_post(sem);
-+sclose:
- sem_close(sem);
- out:
- last_accept = -1;