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
.
Response:
text/plain