iFirst implementation of two-way TLS for scripts. - 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 f66a8a67b9471909016d6f24ce93f39584130a67 /scm/geomyidae/commit/f66a8a67b9471909016d6f24ce93f39584130a67.gph bitreich.org 70
1parent 3a9cbc78b4777d2dab54bca974f65c708ffc61a5 /scm/geomyidae/commit/3a9cbc78b4777d2dab54bca974f65c708ffc61a5.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:45:48 +0200 Err bitreich.org 70
i Err bitreich.org 70
iFirst implementation of two-way TLS for scripts. Err bitreich.org 70
i Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i M main.c | 58 ++++++++++++++++++++++++------- Err bitreich.org 70
i Err bitreich.org 70
i1 file changed, 45 insertions(+), 13 deletions(-) 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@@ -552,7 +552,7 @@ main(int argc, char *argv[]) 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 tlssocks[2], shufbuf[1025], Err bitreich.org 70
i- shuflen, wlen, shufpos, Err bitreich.org 70
i+ shuflen, wlen, shufpos, tlsclientreader, Err bitreich.org 70
i #endif /* ENABLE_TLS */ Err bitreich.org 70
i maxrecv, retl, Err bitreich.org 70
i rlen = 0; Err bitreich.org 70
i@@ -1049,27 +1049,59 @@ read_selector_again: 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(tlssocks[1]); Err bitreich.org 70
i+ tlsclientreader = 1; Err bitreich.org 70
i+ switch(fork()) { Err bitreich.org 70
i+ case 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+ tlsclientreader = 0; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ Err bitreich.org 70
i+ close(tlssocks[tlsclientreader? 1 : 0]); Err bitreich.org 70
i do { Err bitreich.org 70
i- shuflen = read(tlssocks[0], shufbuf, sizeof(shufbuf)-1); Err bitreich.org 70
i+ if (tlsclientreader) { Err bitreich.org 70
i+ shuflen = read(tlssocks[0], shufbuf, sizeof(shufbuf)-1); Err bitreich.org 70
i+ } else { Err bitreich.org 70
i+ shuflen = tls_read(tlsclientctx, shufbuf, sizeof(shufbuf)-1); Err bitreich.org 70
i+ } 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- wlen = tls_write(tlsclientctx, shufbuf+shufpos, shuflen-shufpos); Err bitreich.org 70
i- if (wlen < 0) { Err bitreich.org 70
i- fprintf(stderr, "tls_write failed: %s\n", tls_error(tlsclientctx)); Err bitreich.org 70
i- return 1; Err bitreich.org 70
i+ if (tlsclientreader) { Err bitreich.org 70
i+ wlen = tls_write(tlsclientctx, shufbuf+shufpos, shuflen-shufpos); Err bitreich.org 70
i+ if (wlen < 0) { Err bitreich.org 70
i+ fprintf(stderr, "tls_write failed: %s\n", tls_error(tlsclientctx)); Err bitreich.org 70
i+ return 1; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ } else { Err bitreich.org 70
i+ wlen = write(tlssocks[1], shufbuf+shufpos, shuflen-shufpos); Err bitreich.org 70
i+ if (wlen < 0) { Err bitreich.org 70
i+ perror("write"); Err bitreich.org 70
i+ return 1; Err bitreich.org 70
i+ } Err bitreich.org 70
i } Err bitreich.org 70
i } Err bitreich.org 70
i } while (shuflen > 0); 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(tlssocks[0]); Err bitreich.org 70
i+ if (tlsclientreader) { Err bitreich.org 70
i+ tls_close(tlsclientctx); Err bitreich.org 70
i+ tls_free(tlsclientctx); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ Err bitreich.org 70
i+ close(tlssocks[tlsclientreader? 0 : 1]); 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
i- close(sock); Err bitreich.org 70
i+ if (tlsclientreader) { Err bitreich.org 70
i+ /* Err bitreich.org 70
i+ * Only one process needs Err bitreich.org 70
i+ * to do this. 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
i+ close(sock); Err bitreich.org 70
i+ } Err bitreich.org 70
i return 0; Err bitreich.org 70
i } Err bitreich.org 70
i } Err bitreich.org 70
.
Response:
text/plain