From 77bd90142d4369fbf22b0f6cf70ab4ad26f2106c Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Mon, 23 Jul 2012 12:35:44 -0700 Subject: [PATCH] Refresh of fork-xfer --- src/preload.c | 54 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/src/preload.c b/src/preload.c index 70869978..82a41256 100644 --- a/src/preload.c +++ b/src/preload.c @@ -493,7 +493,7 @@ static int fork_active(int socket, const struct sockaddr *addr, socklen_t addrle return rconnect(ret, addr, addrlen); } -static int fork_passive(int socket) +static void fork_passive(int socket) { struct sockaddr_in6 sin6; sem_t *sem; @@ -501,6 +501,8 @@ static int fork_passive(int socket) socklen_t len; uint32_t msg; + fd_get(socket, &sfd); + len = sizeof sin6; ret = real.getsockname(sfd, (struct sockaddr *) &sin6, &len); if (ret) @@ -510,12 +512,16 @@ static int fork_passive(int socket) sem = sem_open("/rsocket_fork", O_CREAT | O_RDWR, S_IRWXU | S_IRWXG, 1); - if (sem == SEM_FAILED) + if (sem == SEM_FAILED) { + ret = -1; goto out; + } lfd = rsocket(sin6.sin6_family, SOCK_STREAM, 0); - if (lfd < 0) + if (lfd < 0) { + ret = lfd; goto sclose; + } param = 1; rsetsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, ¶m, sizeof param); @@ -535,8 +541,10 @@ static int fork_passive(int socket) goto lclose; dfd = raccept(lfd, NULL, NULL); - if (dfd < 0) + if (dfd < 0) { + ret = dfd; goto lclose; + } param = 1; rsetsockopt(dfd, IPPROTO_TCP, TCP_NODELAY, ¶m, sizeof param); @@ -555,7 +563,23 @@ sclose: out: if (ret) fd_store(socket, sfd, fd_normal); - return ret; +} + +static inline enum fd_type fd_fork_get(int index, int *fd) +{ + struct fd_info *fdi; + + fdi = idm_lookup(&idm, index); + if (fdi) { + if (fdi->type == fd_fork) + fork_passive(index); + *fd = fdi->fd; + return fdi->type; + + } else { + *fd = index; + return fd_normal; + } } int connect(int socket, const struct sockaddr *addr, socklen_t addrlen) @@ -591,7 +615,7 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen) ssize_t recv(int socket, void *buf, size_t len, int flags) { int fd; - return (fd_get(socket, &fd) == fd_rsocket) ? + return (fd_fork_get(socket, &fd) == fd_rsocket) ? rrecv(fd, buf, len, flags) : real.recv(fd, buf, len, flags); } @@ -599,7 +623,7 @@ ssize_t recvfrom(int socket, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen) { int fd; - return (fd_get(socket, &fd) == fd_rsocket) ? + return (fd_fork_get(socket, &fd) == fd_rsocket) ? rrecvfrom(fd, buf, len, flags, src_addr, addrlen) : real.recvfrom(fd, buf, len, flags, src_addr, addrlen); } @@ -607,7 +631,7 @@ ssize_t recvfrom(int socket, void *buf, size_t len, int flags, ssize_t recvmsg(int socket, struct msghdr *msg, int flags) { int fd; - return (fd_get(socket, &fd) == fd_rsocket) ? + return (fd_fork_get(socket, &fd) == fd_rsocket) ? rrecvmsg(fd, msg, flags) : real.recvmsg(fd, msg, flags); } @@ -615,7 +639,7 @@ ssize_t read(int socket, void *buf, size_t count) { int fd; init_preload(); - return (fd_get(socket, &fd) == fd_rsocket) ? + return (fd_fork_get(socket, &fd) == fd_rsocket) ? rread(fd, buf, count) : real.read(fd, buf, count); } @@ -623,14 +647,14 @@ ssize_t readv(int socket, const struct iovec *iov, int iovcnt) { int fd; init_preload(); - return (fd_get(socket, &fd) == fd_rsocket) ? + return (fd_fork_get(socket, &fd) == fd_rsocket) ? rreadv(fd, iov, iovcnt) : real.readv(fd, iov, iovcnt); } ssize_t send(int socket, const void *buf, size_t len, int flags) { int fd; - return (fd_get(socket, &fd) == fd_rsocket) ? + return (fd_fork_get(socket, &fd) == fd_rsocket) ? rsend(fd, buf, len, flags) : real.send(fd, buf, len, flags); } @@ -638,7 +662,7 @@ ssize_t sendto(int socket, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen) { int fd; - return (fd_get(socket, &fd) == fd_rsocket) ? + return (fd_fork_get(socket, &fd) == fd_rsocket) ? rsendto(fd, buf, len, flags, dest_addr, addrlen) : real.sendto(fd, buf, len, flags, dest_addr, addrlen); } @@ -646,7 +670,7 @@ ssize_t sendto(int socket, const void *buf, size_t len, int flags, ssize_t sendmsg(int socket, const struct msghdr *msg, int flags) { int fd; - return (fd_get(socket, &fd) == fd_rsocket) ? + return (fd_fork_get(socket, &fd) == fd_rsocket) ? rsendmsg(fd, msg, flags) : real.sendmsg(fd, msg, flags); } @@ -654,7 +678,7 @@ ssize_t write(int socket, const void *buf, size_t count) { int fd; init_preload(); - return (fd_get(socket, &fd) == fd_rsocket) ? + return (fd_fork_get(socket, &fd) == fd_rsocket) ? rwrite(fd, buf, count) : real.write(fd, buf, count); } @@ -662,7 +686,7 @@ ssize_t writev(int socket, const struct iovec *iov, int iovcnt) { int fd; init_preload(); - return (fd_get(socket, &fd) == fd_rsocket) ? + return (fd_fork_get(socket, &fd) == fd_rsocket) ? rwritev(fd, iov, iovcnt) : real.writev(fd, iov, iovcnt); } -- 2.45.2