Version: 1
-Previous: 9ef6e320c8759f17a5e6f26bd19c2837daa09228
-Head: b131326fd7cad28cd3b9a3d09c29c9476d7fddb0
+Previous: 522ddb4fa21524c0f00148e1312e808d29de7f86
+Head: aaef2b3382a3bb7a45d12dfcf61dbe5f8114be6f
Applied:
transpose: 84e0beee0d2d3c217cd9703b9e438d25856cacb6
fork: b131326fd7cad28cd3b9a3d09c29c9476d7fddb0
+ refresh-temp: aaef2b3382a3bb7a45d12dfcf61dbe5f8114be6f
Unapplied:
waitall-buggy: c49c6b56c55385774065f5aa2704078e6ae0ceb8
rs-1sge: 8ec392829399dec7ed5c608b8697a482e5faa2de
--- /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;