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