| Use sockets instead of pipes to allow bidirectional communication. - geomyidae … | |
| git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfri… | |
| Log | |
| Files | |
| Refs | |
| Tags | |
| README | |
| LICENSE | |
| --- | |
| commit 3a9cbc78b4777d2dab54bca974f65c708ffc61a5 | |
| parent 5359e24388be689acc073af1739af4c932a57915 | |
| Author: Christoph Lohmann <[email protected]> | |
| Date: Fri, 26 May 2023 06:28:28 +0200 | |
| Use sockets instead of pipes to allow bidirectional communication. | |
| * In CGI it was already possible to completely speak two way with the | |
| client. | |
| * In DCGI this allows the same behaviour as in CGI. | |
| * For TLS this is a preparation for TLS support too. | |
| Diffstat: | |
| M handlr.c | 14 +++++++------- | |
| M main.c | 16 ++++++++-------- | |
| 2 files changed, 15 insertions(+), 15 deletions(-) | |
| --- | |
| diff --git a/handlr.c b/handlr.c | |
| @@ -192,10 +192,10 @@ handledcgi(int sock, char *file, char *port, char *base, … | |
| char *p, *path, *ln = NULL; | |
| size_t linesiz = 0; | |
| ssize_t n; | |
| - int outpipe[2], ret = 0; | |
| + int outsocks[2], ret = 0; | |
| Elems *el; | |
| - if (pipe(outpipe) < 0) | |
| + if (socketpair(AF_LOCAL, SOCK_STREAM, 0, outsocks) < 0) | |
| return; | |
| path = xstrdup(file); | |
| @@ -218,8 +218,8 @@ handledcgi(int sock, char *file, char *port, char *base, ch… | |
| while (dup2(sock, 2) < 0 && errno == EINTR); | |
| switch (fork()) { | |
| case 0: | |
| - while (dup2(outpipe[1], 1) < 0 && errno == EINTR); | |
| - close(outpipe[0]); | |
| + while (dup2(outsocks[1], 1) < 0 && errno == EINTR); | |
| + close(outsocks[0]); | |
| if (path != NULL) { | |
| if (chdir(path) < 0) | |
| break; | |
| @@ -239,11 +239,11 @@ handledcgi(int sock, char *file, char *port, char *base, … | |
| break; | |
| default: | |
| while (dup2(sock, 1) < 0 && errno == EINTR); | |
| - close(outpipe[1]); | |
| + close(outsocks[1]); | |
| - if (!(fp = fdopen(outpipe[0], "r"))) { | |
| + if (!(fp = fdopen(outsocks[0], "r"))) { | |
| perror("fdopen"); | |
| - close(outpipe[0]); | |
| + close(outsocks[0]); | |
| break; | |
| } | |
| diff --git a/main.c b/main.c | |
| @@ -551,7 +551,7 @@ main(int argc, char *argv[]) | |
| nlfdret, *lfdret, listfd, maxlfd, istls = 0, | |
| dotls = 0, dohaproxy = 0, tcpver = -1, haret = 0, | |
| #ifdef ENABLE_TLS | |
| - tlspipe[2], shufbuf[1025], | |
| + tlssocks[2], shufbuf[1025], | |
| shuflen, wlen, shufpos, | |
| #endif /* ENABLE_TLS */ | |
| maxrecv, retl, | |
| @@ -1035,23 +1035,23 @@ read_selector_again: | |
| #ifdef ENABLE_TLS | |
| if (istls) { | |
| - if (pipe(tlspipe) < 0) { | |
| - perror("tls_pipe"); | |
| + if (socketpair(AF_LOCAL, SOCK_STREAM, 0, tlsso… | |
| + perror("tls_socketpair"); | |
| return 1; | |
| } | |
| switch(fork()) { | |
| case 0: | |
| - sock = tlspipe[1]; | |
| - close(tlspipe[0]); | |
| + sock = tlssocks[1]; | |
| + close(tlssocks[0]); | |
| break; | |
| case -1: | |
| perror("fork"); | |
| return 1; | |
| default: | |
| - close(tlspipe[1]); | |
| + close(tlssocks[1]); | |
| do { | |
| - shuflen = read(tlspipe[0], shu… | |
| + shuflen = read(tlssocks[0], sh… | |
| if (shuflen == -1 && errno == … | |
| continue; | |
| for (shufpos = 0; shufpos < sh… | |
| @@ -1065,7 +1065,7 @@ read_selector_again: | |
| tls_close(tlsclientctx); | |
| tls_free(tlsclientctx); | |
| - close(tlspipe[0]); | |
| + close(tlssocks[0]); | |
| waitforpendingbytes(sock); | |
| shutdown(sock, SHUT_RDWR); |