iRetry cleartext connection in case TLS failed - sacc - sacc(omys), simple console gopher client Err bitreich.org 70 hgit clone git://bitreich.org/sacc/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/sacc/ URL:git://bitreich.org/sacc/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/sacc/ bitreich.org 70 1Log /scm/sacc/log.gph bitreich.org 70 1Files /scm/sacc/files.gph bitreich.org 70 1Refs /scm/sacc/refs.gph bitreich.org 70 1Tags /scm/sacc/tag bitreich.org 70 1LICENSE /scm/sacc/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 7e0793d8395184b5b21ecdd0b13bccb524d1e414 /scm/sacc/commit/7e0793d8395184b5b21ecdd0b13bccb524d1e414.gph bitreich.org 70 1parent 4aa1ecfaf6c97cb02c7e34c88cc67c070b600b67 /scm/sacc/commit/4aa1ecfaf6c97cb02c7e34c88cc67c070b600b67.gph bitreich.org 70 hAuthor: Quentin Rameau URL:mailto:quinq@fifth.space bitreich.org 70 iDate: Sun, 11 Apr 2021 17:12:00 +0200 Err bitreich.org 70 i Err bitreich.org 70 iRetry cleartext connection in case TLS failed Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M io_tls.c | 33 ++++++++++++++++++++++++++----- Err bitreich.org 70 i M sacc.c | 32 ++++++++++++++++--------------- Err bitreich.org 70 i Err bitreich.org 70 i2 files changed, 45 insertions(+), 20 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/io_tls.c b/io_tls.c /scm/sacc/file/io_tls.c.gph bitreich.org 70 i@@ -1,3 +1,4 @@ Err bitreich.org 70 i+#include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i@@ -32,6 +33,7 @@ static int Err bitreich.org 70 i connect_tls(struct cnx *c, struct addrinfo *ai, const char *host) Err bitreich.org 70 i { Err bitreich.org 70 i struct tls *t; Err bitreich.org 70 i+ char *r; Err bitreich.org 70 i int s; Err bitreich.org 70 i Err bitreich.org 70 i c->tls = NULL; Err bitreich.org 70 i@@ -43,13 +45,34 @@ connect_tls(struct cnx *c, struct addrinfo *ai, const char *host) Err bitreich.org 70 i if (tls) { Err bitreich.org 70 i if ((t = tls_client()) == NULL) Err bitreich.org 70 i return -1; Err bitreich.org 70 i- if (tls_connect_socket(t, s, host) == -1) Err bitreich.org 70 i- return -1; Err bitreich.org 70 i- Err bitreich.org 70 i- c->tls = t; Err bitreich.org 70 i+ if (tls_connect_socket(t, s, host) == 0) { Err bitreich.org 70 i+ do { Err bitreich.org 70 i+ s = tls_handshake(t); Err bitreich.org 70 i+ } while (s == TLS_WANT_POLLIN || s == TLS_WANT_POLLOUT); Err bitreich.org 70 i+ if (s == 0) { Err bitreich.org 70 i+ c->tls = t; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ diag("Can't establish TLS with \"%s\": %s", Err bitreich.org 70 i+ host, tls_error(t)); Err bitreich.org 70 i+ r = uiprompt("Retry on cleartext? [Yn]: "); Err bitreich.org 70 i+ switch (*r) { Err bitreich.org 70 i+ case 'Y': Err bitreich.org 70 i+ case 'y': Err bitreich.org 70 i+ case '\0': Err bitreich.org 70 i+ tls = 0; Err bitreich.org 70 i+ s = -2; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ default: Err bitreich.org 70 i+ s = -3; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ free(r); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ s = -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- return 0; Err bitreich.org 70 i+ return s; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static void Err bitreich.org 70 1diff --git a/sacc.c b/sacc.c /scm/sacc/file/sacc.c.gph bitreich.org 70 i@@ -491,8 +491,8 @@ connectto(const char *host, const char *port, struct cnx *c) Err bitreich.org 70 i .ai_socktype = SOCK_STREAM, Err bitreich.org 70 i .ai_protocol = IPPROTO_TCP, Err bitreich.org 70 i }; Err bitreich.org 70 i- struct addrinfo *addrs, *addr; Err bitreich.org 70 i- int r, err; Err bitreich.org 70 i+ struct addrinfo *addrs, *ai; Err bitreich.org 70 i+ int r, err, conn; Err bitreich.org 70 i Err bitreich.org 70 i sigemptyset(&set); Err bitreich.org 70 i sigaddset(&set, SIGWINCH); Err bitreich.org 70 i@@ -505,18 +505,20 @@ connectto(const char *host, const char *port, struct cnx *c) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i r = -1; Err bitreich.org 70 i- for (addr = addrs; addr; addr = addr->ai_next) { Err bitreich.org 70 i- if ((c->sock = socket(addr->ai_family, addr->ai_socktype, Err bitreich.org 70 i- addr->ai_protocol)) == -1) { Err bitreich.org 70 i- err = errno; Err bitreich.org 70 i- continue; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- if ((r = ioconnect(c, addr, host)) == 0) Err bitreich.org 70 i- break; Err bitreich.org 70 i+ for (ai = addrs; ai && r == -1; ai = ai->ai_next) { Err bitreich.org 70 i+ do { Err bitreich.org 70 i+ if ((c->sock = socket(ai->ai_family, ai->ai_socktype, Err bitreich.org 70 i+ ai->ai_protocol)) == -1) { Err bitreich.org 70 i+ err = errno; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i- err = errno; Err bitreich.org 70 i- close(c->sock); Err bitreich.org 70 i+ if ((r = ioconnect(c, ai, host)) < 0) { Err bitreich.org 70 i+ err = errno; Err bitreich.org 70 i+ ioclose(c); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ /* retry on cleartext */ Err bitreich.org 70 i+ } while (r == -2); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i freeaddrinfo(addrs); Err bitreich.org 70 i@@ -537,7 +539,7 @@ download(Item *item, int dest) Err bitreich.org 70 i ssize_t r, w; Err bitreich.org 70 i Err bitreich.org 70 i if (item->tag == NULL) { Err bitreich.org 70 i- if (connectto(item->host, item->port, &c) == -1 || Err bitreich.org 70 i+ if (connectto(item->host, item->port, &c) < 0 || Err bitreich.org 70 i sendselector(&c, item->selector) == -1) Err bitreich.org 70 i return 0; Err bitreich.org 70 i } else { Err bitreich.org 70 i@@ -621,7 +623,7 @@ fetchitem(Item *item) Err bitreich.org 70 i struct cnx c; Err bitreich.org 70 i char *raw; Err bitreich.org 70 i Err bitreich.org 70 i- if (connectto(item->host, item->port, &c) == -1 || Err bitreich.org 70 i+ if (connectto(item->host, item->port, &c) < 0 || Err bitreich.org 70 i sendselector(&c, item->selector) == -1) Err bitreich.org 70 i return 0; Err bitreich.org 70 i Err bitreich.org 70 .