From 3009739bc717a5f3922645595a418181c1a4b6d9 Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Fri, 10 Aug 2012 22:13:06 -0700 Subject: [PATCH] refresh --- meta | 7 ++--- patches/fork-connect | 74 +++++++++++++++++++++++++++++++------------- patches/refresh-temp | 52 ------------------------------- 3 files changed, 55 insertions(+), 78 deletions(-) delete mode 100644 patches/refresh-temp diff --git a/meta b/meta index 4152a26c..e1dc3e50 100644 --- a/meta +++ b/meta @@ -1,12 +1,11 @@ Version: 1 -Previous: 7b5ed8f3aa4c981d0fd5d588c01ab246724c5bbc -Head: 6d2d228c1827b30af934bc63121140282c3b3282 +Previous: f1b0b772fe7fe9a44c0ea2f6606fb6f0071dd7d7 +Head: 0b26f0861db82da1458125921f1a6cf57d438ab8 Applied: real-close: 3409f8d6af187d25c63a5d1f8ee8bff5f14555e2 dup2: ca5813e7cf95dee5933fc417e4a34d26f2b01824 oobinline: ac51c1095f505373a6ec54b8f1d990259fb34d97 - fork-connect: 8c650d7a0e10582928f0fd3e5d9e045a84fc0b66 - refresh-temp: 6d2d228c1827b30af934bc63121140282c3b3282 + fork-connect: 0b26f0861db82da1458125921f1a6cf57d438ab8 Unapplied: dbg-out: 04273ee712db4d53efb390462c1b738bb54a57df fstat: a62c653906870422edef5f6388dac9f76c953e35 diff --git a/patches/fork-connect b/patches/fork-connect index a04790c2..4e8301f8 100644 --- a/patches/fork-connect +++ b/patches/fork-connect @@ -1,5 +1,5 @@ Bottom: 3ea2748a5c41b11a2e7033c56bddd938d2770b6c -Top: 216390f24bdb1fa45d9326571f8dd46b1fd804ef +Top: 64baa18c546931a07eef988a8d6bdef26a73feab Author: Sean Hefty Date: 2012-08-10 21:44:39 -0700 @@ -28,7 +28,7 @@ Signed-off-by: Sean Hefty --- diff --git a/src/preload.c b/src/preload.c -index b18d310..c61d092 100644 +index b18d310..e5d3fcb 100644 --- a/src/preload.c +++ b/src/preload.c @@ -99,12 +99,20 @@ static int fork_support; @@ -106,7 +106,24 @@ index b18d310..c61d092 100644 set_rsocket_options(ret); } return index; -@@ -427,22 +444,32 @@ int listen(int socket, int backlog) +@@ -419,30 +436,46 @@ int bind(int socket, const struct sockaddr *addr, socklen_t addrlen) + + int listen(int socket, int backlog) + { +- int fd; +- return (fd_get(socket, &fd) == fd_rsocket) ? +- rlisten(fd, backlog) : real.listen(fd, backlog); ++ int fd, ret; ++ if (fd_get(socket, &fd) == fd_rsocket) { ++ ret = rlisten(fd, backlog); ++ } else { ++ ret = real.listen(fd, backlog); ++ if (!ret && fd_gets(socket) == fd_fork) ++ fd_store(socket, fd, fd_normal, fd_fork_listen); ++ } ++ return ret; + } + int accept(int socket, struct sockaddr *addr, socklen_t *addrlen) { int fd, index, ret; @@ -115,37 +132,37 @@ index b18d310..c61d092 100644 - 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 { return real.accept(fd, addr, addrlen); -@@ -471,7 +498,7 @@ static int fork_active(int socket, const struct sockaddr *addr, socklen_t addrle +@@ -471,7 +504,7 @@ static int fork_active(int socket, const struct sockaddr *addr, socklen_t addrle ret = real.recv(fd, &msg, sizeof msg, MSG_PEEK); if ((ret != sizeof msg) || msg) { @@ -154,7 +171,7 @@ index b18d310..c61d092 100644 return 0; } -@@ -544,7 +571,7 @@ static void fork_passive(int socket) +@@ -544,7 +577,7 @@ static void fork_passive(int socket) copysockopts(dfd, sfd, &rs, &real); real.shutdown(sfd, SHUT_RDWR); real.close(sfd); @@ -163,7 +180,7 @@ index b18d310..c61d092 100644 lclose: rclose(lfd); -@@ -553,7 +580,7 @@ sclose: +@@ -553,7 +586,7 @@ sclose: sem_close(sem); out: if (ret) @@ -172,7 +189,19 @@ index b18d310..c61d092 100644 } static inline enum fd_type fd_fork_get(int index, int *fd) -@@ -577,10 +604,7 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen) +@@ -562,8 +595,10 @@ static inline enum fd_type fd_fork_get(int index, int *fd) + + fdi = idm_lookup(&idm, index); + if (fdi) { +- if (fdi->type == fd_fork) ++ if (fdi->type == fd_fork_passive) + fork_passive(index); ++ else if (fdi->type == fd_fork_active) ++ fork_active(index); + *fd = fdi->fd; + return fdi->type; + +@@ -577,10 +612,7 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen) { int fd, ret; @@ -184,7 +213,7 @@ index b18d310..c61d092 100644 ret = rconnect(fd, addr, addrlen); if (!ret || errno == EINPROGRESS) return ret; -@@ -591,12 +615,9 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen) +@@ -591,12 +623,10 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen) rclose(fd); fd = ret; @@ -192,6 +221,7 @@ index b18d310..c61d092 100644 - default: - break; + } else { ++ /* Set state to fork_active if nonblocking. if blocking fork_active */ + return real.connect(fd, addr, addrlen); } - diff --git a/patches/refresh-temp b/patches/refresh-temp deleted file mode 100644 index cc10bb65..00000000 --- a/patches/refresh-temp +++ /dev/null @@ -1,52 +0,0 @@ -Bottom: 216390f24bdb1fa45d9326571f8dd46b1fd804ef -Top: 64baa18c546931a07eef988a8d6bdef26a73feab -Author: Sean Hefty -Date: 2012-08-10 22:13:06 -0700 - -Refresh of fork-connect - ---- - -diff --git a/src/preload.c b/src/preload.c -index c61d092..e5d3fcb 100644 ---- a/src/preload.c -+++ b/src/preload.c -@@ -436,9 +436,15 @@ int bind(int socket, const struct sockaddr *addr, socklen_t addrlen) - - int listen(int socket, int backlog) - { -- int fd; -- return (fd_get(socket, &fd) == fd_rsocket) ? -- rlisten(fd, backlog) : real.listen(fd, backlog); -+ int fd, ret; -+ if (fd_get(socket, &fd) == fd_rsocket) { -+ ret = rlisten(fd, backlog); -+ } else { -+ ret = real.listen(fd, backlog); -+ if (!ret && fd_gets(socket) == fd_fork) -+ fd_store(socket, fd, fd_normal, fd_fork_listen); -+ } -+ return ret; - } - - int accept(int socket, struct sockaddr *addr, socklen_t *addrlen) -@@ -589,8 +595,10 @@ static inline enum fd_type fd_fork_get(int index, int *fd) - - fdi = idm_lookup(&idm, index); - if (fdi) { -- if (fdi->type == fd_fork) -+ if (fdi->type == fd_fork_passive) - fork_passive(index); -+ else if (fdi->type == fd_fork_active) -+ fork_active(index); - *fd = fdi->fd; - return fdi->type; - -@@ -616,6 +624,7 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen) - rclose(fd); - fd = ret; - } else { -+ /* Set state to fork_active if nonblocking. if blocking fork_active */ - return real.connect(fd, addr, addrlen); - } - } -- 2.41.0