From: Sean Hefty Date: Tue, 17 Jul 2012 19:34:22 +0000 (-0700) Subject: refresh (create temporary patch) X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=7310eb7b6f06bc2dcaec4516014cf973bce76aaa;p=~shefty%2Flibrdmacm.git refresh (create temporary patch) --- diff --git a/meta b/meta index d4468ee6..073ec6a2 100644 --- a/meta +++ b/meta @@ -1,9 +1,10 @@ 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 diff --git a/patches/refresh-temp b/patches/refresh-temp new file mode 100644 index 00000000..efba49c2 --- /dev/null +++ b/patches/refresh-temp @@ -0,0 +1,94 @@ +Bottom: 3ef5d9a598c00e66ce2beafac99c914e0942c3c3 +Top: 89b109b9172f2fd26f7feaca314718e1127b4e64 +Author: Sean Hefty +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;