iTLS: use wrapper functions - 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 5a5611b3293eaac0b26832a54b845c6822736b65 /scm/sacc/commit/5a5611b3293eaac0b26832a54b845c6822736b65.gph bitreich.org 70 1parent e3535c1405eac56a658886023b057944b4b91bc0 /scm/sacc/commit/e3535c1405eac56a658886023b057944b4b91bc0.gph bitreich.org 70 hAuthor: Quentin Rameau URL:mailto:quinq@fifth.space bitreich.org 70 iDate: Sat, 10 Apr 2021 15:56:05 +0200 Err bitreich.org 70 i Err bitreich.org 70 iTLS: use wrapper functions Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M Makefile | 8 ++++---- Err bitreich.org 70 i M config.mk | 12 ++++++++---- Err bitreich.org 70 i A io.h | 17 +++++++++++++++++ Err bitreich.org 70 i A io_clr.c | 63 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A io_tls.c | 129 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i M sacc.c | 173 ++++++++----------------------- Err bitreich.org 70 i Err bitreich.org 70 i6 files changed, 264 insertions(+), 138 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/Makefile b/Makefile /scm/sacc/file/Makefile.gph bitreich.org 70 i@@ -6,7 +6,7 @@ include config.mk Err bitreich.org 70 i Err bitreich.org 70 i BIN = sacc Err bitreich.org 70 i MAN = $(BIN).1 Err bitreich.org 70 i-OBJ = $(BIN:=.o) ui_$(UI).o Err bitreich.org 70 i+OBJ = $(BIN:=.o) ui_$(UI).o io_$(IO).o Err bitreich.org 70 i Err bitreich.org 70 i all: $(BIN) Err bitreich.org 70 i Err bitreich.org 70 i@@ -14,9 +14,9 @@ config.h: Err bitreich.org 70 i cp config.def.h config.h Err bitreich.org 70 i Err bitreich.org 70 i $(BIN): $(OBJ) Err bitreich.org 70 i- $(CC) $(OBJ) $(LDFLAGS) $(LIBS) $(TLSLIBS) -o $@ Err bitreich.org 70 i+ $(CC) $(OBJ) $(LDFLAGS) $(IOLIBS) $(LIBS) -o $@ Err bitreich.org 70 i Err bitreich.org 70 i-$(OBJ): config.h config.mk common.h Err bitreich.org 70 i+$(OBJ): config.h config.mk common.h io.h Err bitreich.org 70 i Err bitreich.org 70 i clean: Err bitreich.org 70 i rm -f $(BIN) $(OBJ) Err bitreich.org 70 i@@ -33,7 +33,7 @@ uninstall: Err bitreich.org 70 i Err bitreich.org 70 i # Stock FLAGS Err bitreich.org 70 i SACCCFLAGS = -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 -D_BSD_SOURCE -D_GNU_SOURCE \ Err bitreich.org 70 i- $(TLSCFLAGS) $(CFLAGS) Err bitreich.org 70 i+ $(IOCFLAGS) $(CFLAGS) Err bitreich.org 70 i Err bitreich.org 70 i .c.o: Err bitreich.org 70 i $(CC) $(SACCCFLAGS) -c $< Err bitreich.org 70 1diff --git a/config.mk b/config.mk /scm/sacc/file/config.mk.gph bitreich.org 70 i@@ -9,10 +9,14 @@ MANDIR = $(PREFIX)/share/man/man1 Err bitreich.org 70 i UI=ti Err bitreich.org 70 i LIBS=-lcurses Err bitreich.org 70 i Err bitreich.org 70 i+# IO type Err bitreich.org 70 i+# clr (clear) Err bitreich.org 70 i+#IO = clr Err bitreich.org 70 i+# tls (Transport Layer Security) Err bitreich.org 70 i+IO = tls Err bitreich.org 70 i+IOLIBS = -ltls Err bitreich.org 70 i+IOCFLAGS = -DUSE_TLS Err bitreich.org 70 i+ Err bitreich.org 70 i # Define NEED_ASPRINTF and/or NEED_STRCASESTR in your cflags if your system does Err bitreich.org 70 i # not provide asprintf() or strcasestr(), respectively. Err bitreich.org 70 i #CFLAGS = -DNEED_ASPRINTF -DNEED_STRCASESTR Err bitreich.org 70 i- Err bitreich.org 70 i-# gophers (gopher over TLS) support Err bitreich.org 70 i-TLSCFLAGS = -DUSE_TLS Err bitreich.org 70 i-TLSLIBS = -ltls Err bitreich.org 70 1diff --git a/io.h b/io.h /scm/sacc/file/io.h.gph bitreich.org 70 i@@ -0,0 +1,17 @@ Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+struct cnx { Err bitreich.org 70 i+#ifdef USE_TLS Err bitreich.org 70 i+ struct tls *tls; Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ int sock; Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+extern int tls; Err bitreich.org 70 i+ Err bitreich.org 70 i+extern int (*ioclose)(struct cnx *); Err bitreich.org 70 i+extern int (*ioconnect)(struct cnx *, struct addrinfo *, const char *); Err bitreich.org 70 i+extern void (*ioconnerr)(struct cnx *, const char *, const char *, int); Err bitreich.org 70 i+extern char *(*ioparseurl)(char *); Err bitreich.org 70 i+extern ssize_t (*ioread)(struct cnx *, void *, size_t); Err bitreich.org 70 i+extern ssize_t (*iowrite)(struct cnx *, void *, size_t); Err bitreich.org 70 1diff --git a/io_clr.c b/io_clr.c /scm/sacc/file/io_clr.c.gph bitreich.org 70 i@@ -0,0 +1,63 @@ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include "common.h" Err bitreich.org 70 i+#include "io.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+static int Err bitreich.org 70 i+close_clr(struct cnx *c) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return close(c->sock); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static int Err bitreich.org 70 i+connect_clr(struct cnx *c, struct addrinfo *ai, const char *host) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return connect(c->sock, ai->ai_addr, ai->ai_addrlen); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static void Err bitreich.org 70 i+connerr_clr(struct cnx *c, const char *host, const char *port, int err) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ if (c->sock == -1) Err bitreich.org 70 i+ diag("Can't open socket: %s", strerror(err)); Err bitreich.org 70 i+ else Err bitreich.org 70 i+ diag("Can't connect to: %s:%s: %s", host, port, strerror(err)); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static char * Err bitreich.org 70 i+parseurl_clr(char *url) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char *p; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (p = strstr(url, "://")) { Err bitreich.org 70 i+ if (strncmp(url, "gopher", p - url)) Err bitreich.org 70 i+ die("Protocol not supported: %.*s", p - url, url); Err bitreich.org 70 i+ Err bitreich.org 70 i+ url = p + 3; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return url; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static ssize_t Err bitreich.org 70 i+read_clr(struct cnx *c, void *buf, size_t bs) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return read(c->sock, buf, bs); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static ssize_t Err bitreich.org 70 i+write_clr(struct cnx *c, void *buf, size_t bs) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return write(c->sock, buf, bs); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int (*ioclose)(struct cnx *) = close_clr; Err bitreich.org 70 i+int (*ioconnect)(struct cnx *, struct addrinfo *, const char *) = connect_clr; Err bitreich.org 70 i+void (*ioconnerr)(struct cnx *, const char *, const char *, int) = connerr_clr; Err bitreich.org 70 i+char *(*ioparseurl)(char *) = parseurl_clr; Err bitreich.org 70 i+ssize_t (*ioread)(struct cnx *, void *, size_t) = read_clr; Err bitreich.org 70 i+ssize_t (*iowrite)(struct cnx *, void *, size_t) = write_clr; 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@@ -0,0 +1,129 @@ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include "common.h" Err bitreich.org 70 i+#include "io.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+int tls; Err bitreich.org 70 i+ Err bitreich.org 70 i+static int Err bitreich.org 70 i+close_tls(struct cnx *c) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int r; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (tls) { Err bitreich.org 70 i+ if (c->tls) { Err bitreich.org 70 i+ do { Err bitreich.org 70 i+ r = tls_close(c->tls); Err bitreich.org 70 i+ } while (r == TLS_WANT_POLLIN || r == TLS_WANT_POLLOUT); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ tls_free(c->tls); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return close(c->sock); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+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+ int s; Err bitreich.org 70 i+ Err bitreich.org 70 i+ c->tls = NULL; Err bitreich.org 70 i+ s = c->sock; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (connect(s, ai->ai_addr, ai->ai_addrlen) == -1) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ 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+ } 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 i+static void Err bitreich.org 70 i+connerr_tls(struct cnx *c, const char *host, const char *port, int err) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ if (c->sock == -1) { Err bitreich.org 70 i+ diag("Can't open socket: %s", strerror(err)); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ if (tls && c->tls) { Err bitreich.org 70 i+ diag("Can't establish TLS with \"%s\": %s", Err bitreich.org 70 i+ host, tls_error(c->tls)); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ diag("Can't connect to: %s:%s: %s", host, port, Err bitreich.org 70 i+ strerror(err)); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static char * Err bitreich.org 70 i+parseurl_tls(char *url) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char *p; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (p = strstr(url, "://")) { Err bitreich.org 70 i+ if (!strncmp(url, "gopher", p - url)) { Err bitreich.org 70 i+ if (tls) Err bitreich.org 70 i+ diag("Switching from gophers to gopher"); Err bitreich.org 70 i+ tls = 0; Err bitreich.org 70 i+ } else if (!strncmp(url, "gophers", p - url)) { Err bitreich.org 70 i+ tls = 1; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ die("Protocol not supported: %.*s", p - url, url); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ url = p + 3; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return url; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static ssize_t Err bitreich.org 70 i+read_tls(struct cnx *c, void *buf, size_t bs) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ ssize_t n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (tls && c->tls) { Err bitreich.org 70 i+ do { Err bitreich.org 70 i+ n = tls_read(c->tls, buf, bs); Err bitreich.org 70 i+ } while (n == TLS_WANT_POLLIN || n == TLS_WANT_POLLOUT); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ n = read(c->sock, buf, bs); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return n; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static ssize_t Err bitreich.org 70 i+write_tls(struct cnx *c, void *buf, size_t bs) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ ssize_t n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (tls) { Err bitreich.org 70 i+ do { Err bitreich.org 70 i+ n = tls_write(c->tls, buf, bs); Err bitreich.org 70 i+ } while (n == TLS_WANT_POLLIN || n == TLS_WANT_POLLOUT); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ n = write(c->sock, buf, bs); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return n; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int (*ioclose)(struct cnx *) = close_tls; Err bitreich.org 70 i+int (*ioconnect)(struct cnx *, struct addrinfo *, const char *) = connect_tls; Err bitreich.org 70 i+void (*ioconnerr)(struct cnx *, const char *, const char *, int) = connerr_tls; Err bitreich.org 70 i+char *(*ioparseurl)(char *) = parseurl_tls; Err bitreich.org 70 i+ssize_t (*ioread)(struct cnx *, void *, size_t) = read_tls; Err bitreich.org 70 i+ssize_t (*iowrite)(struct cnx *, void *, size_t) = write_tls; Err bitreich.org 70 1diff --git a/sacc.c b/sacc.c /scm/sacc/file/sacc.c.gph bitreich.org 70 i@@ -18,26 +18,15 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i-#ifdef USE_TLS Err bitreich.org 70 i-#include Err bitreich.org 70 i-#endif Err bitreich.org 70 i- Err bitreich.org 70 i #include "common.h" Err bitreich.org 70 i+#include "io.h" Err bitreich.org 70 i #include "config.h" Err bitreich.org 70 i Err bitreich.org 70 i-struct cnx { Err bitreich.org 70 i-#ifdef USE_TLS Err bitreich.org 70 i- struct tls *tls; Err bitreich.org 70 i-#endif Err bitreich.org 70 i- int sock; Err bitreich.org 70 i-}; Err bitreich.org 70 i- Err bitreich.org 70 i static char *mainurl; Err bitreich.org 70 i static Item *mainentry; Err bitreich.org 70 i static int devnullfd; Err bitreich.org 70 i static int parent = 1; Err bitreich.org 70 i static int interactive; Err bitreich.org 70 i-static int tls; Err bitreich.org 70 i Err bitreich.org 70 i static void (*diag)(char *fmt, ...); Err bitreich.org 70 i Err bitreich.org 70 i@@ -429,7 +418,7 @@ molddiritem(char *raw) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static char * Err bitreich.org 70 i-getrawitem(struct cnx *cnx) Err bitreich.org 70 i+getrawitem(struct cnx *c) Err bitreich.org 70 i { Err bitreich.org 70 i char *raw, *buf; Err bitreich.org 70 i size_t bn, bs; Err bitreich.org 70 i@@ -458,17 +447,7 @@ getrawitem(struct cnx *cnx) Err bitreich.org 70 i bs = BUFSIZ; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-#ifdef USE_TLS Err bitreich.org 70 i- if (tls) { Err bitreich.org 70 i- do { Err bitreich.org 70 i- n = tls_read(cnx->tls, buf, bs); Err bitreich.org 70 i- } while (n == TLS_WANT_POLLIN || n == TLS_WANT_POLLOUT); Err bitreich.org 70 i- } else Err bitreich.org 70 i-#endif Err bitreich.org 70 i- { Err bitreich.org 70 i- n = read(cnx->sock, buf, bs); Err bitreich.org 70 i- } Err bitreich.org 70 i- } while (n > 0); Err bitreich.org 70 i+ } while ((n = ioread(c, buf, bs)) > 0); Err bitreich.org 70 i Err bitreich.org 70 i *buf = '\0'; Err bitreich.org 70 i Err bitreich.org 70 i@@ -481,7 +460,7 @@ getrawitem(struct cnx *cnx) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 i-sendselector(struct cnx *cnx, const char *selector) Err bitreich.org 70 i+sendselector(struct cnx *c, const char *selector) Err bitreich.org 70 i { Err bitreich.org 70 i char *msg, *p; Err bitreich.org 70 i size_t ln; Err bitreich.org 70 i@@ -491,21 +470,10 @@ sendselector(struct cnx *cnx, const char *selector) Err bitreich.org 70 i msg = p = xmalloc(ln); Err bitreich.org 70 i snprintf(msg, ln--, "%s\r\n", selector); Err bitreich.org 70 i Err bitreich.org 70 i- do { Err bitreich.org 70 i-#ifdef USE_TLS Err bitreich.org 70 i- if (tls) { Err bitreich.org 70 i- do { Err bitreich.org 70 i- n = tls_write(cnx->tls, p, ln); Err bitreich.org 70 i- } while (n == TLS_WANT_POLLIN || n == TLS_WANT_POLLOUT); Err bitreich.org 70 i- } else Err bitreich.org 70 i-#endif Err bitreich.org 70 i- { Err bitreich.org 70 i- n = write(cnx->sock, p, ln); Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i+ while ((n = iowrite(c, p, ln)) > 0) { Err bitreich.org 70 i ln -= n; Err bitreich.org 70 i p += n; Err bitreich.org 70 i- } while (n > 0); Err bitreich.org 70 i+ }; Err bitreich.org 70 i Err bitreich.org 70 i free(msg); Err bitreich.org 70 i if (n == -1) Err bitreich.org 70 i@@ -514,20 +482,8 @@ sendselector(struct cnx *cnx, const char *selector) Err bitreich.org 70 i return n; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-static void Err bitreich.org 70 i-closecnx(struct cnx *cnx) Err bitreich.org 70 i-{ Err bitreich.org 70 i-#ifdef USE_TLS Err bitreich.org 70 i- if (tls) { Err bitreich.org 70 i- tls_close(cnx->tls); Err bitreich.org 70 i- tls_free(cnx->tls); Err bitreich.org 70 i- } Err bitreich.org 70 i-#endif Err bitreich.org 70 i- close(cnx->sock); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i static int Err bitreich.org 70 i-connectto(const char *host, const char *port, struct cnx *cnx) Err bitreich.org 70 i+connectto(const char *host, const char *port, struct cnx *c) Err bitreich.org 70 i { Err bitreich.org 70 i sigset_t set, oset; Err bitreich.org 70 i static const struct addrinfo hints = { Err bitreich.org 70 i@@ -536,7 +492,7 @@ connectto(const char *host, const char *port, struct cnx *cnx) 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, sock = -1; Err bitreich.org 70 i+ int r, err; 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@@ -548,86 +504,54 @@ connectto(const char *host, const char *port, struct cnx *cnx) Err bitreich.org 70 i goto err; 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 ((sock = socket(addr->ai_family, addr->ai_socktype, Err bitreich.org 70 i- addr->ai_protocol)) == -1) Err bitreich.org 70 i- continue; Err bitreich.org 70 i- Err bitreich.org 70 i- r = connect(sock, addr->ai_addr, addr->ai_addrlen); Err bitreich.org 70 i- if (r == -1) { Err bitreich.org 70 i- close(sock); 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-#ifdef USE_TLS Err bitreich.org 70 i- if (tls) { Err bitreich.org 70 i- if ((cnx->tls = tls_client()) == NULL) { Err bitreich.org 70 i- diag("Can't establish TLS with \"%s\": %s", Err bitreich.org 70 i- host, tls_error(cnx->tls)); Err bitreich.org 70 i- close(sock); Err bitreich.org 70 i- continue; Err bitreich.org 70 i- } Err bitreich.org 70 i- r = tls_connect_socket(cnx->tls, sock, host); Err bitreich.org 70 i- } Err bitreich.org 70 i-#endif Err bitreich.org 70 i- break; Err bitreich.org 70 i- } Err bitreich.org 70 i Err bitreich.org 70 i- freeaddrinfo(addrs); Err bitreich.org 70 i+ if ((r = ioconnect(c, addr, host)) == 0) Err bitreich.org 70 i+ break; Err bitreich.org 70 i Err bitreich.org 70 i- if (sock == -1) { Err bitreich.org 70 i- diag("Can't open socket: %s", strerror(errno)); Err bitreich.org 70 i- goto err; Err bitreich.org 70 i- } Err bitreich.org 70 i- if (r == -1) { Err bitreich.org 70 i- diag("Can't connect to: %s:%s: %s", Err bitreich.org 70 i- host, port, strerror(errno)); Err bitreich.org 70 i- goto err; Err bitreich.org 70 i+ err = errno; Err bitreich.org 70 i+ close(c->sock); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- sigprocmask(SIG_SETMASK, &oset, NULL); Err bitreich.org 70 i- Err bitreich.org 70 i- cnx->sock = sock; Err bitreich.org 70 i+ freeaddrinfo(addrs); Err bitreich.org 70 i Err bitreich.org 70 i- return 0; Err bitreich.org 70 i+ if (r == -1) Err bitreich.org 70 i+ ioconnerr(c, host, port, err); Err bitreich.org 70 i err: Err bitreich.org 70 i sigprocmask(SIG_SETMASK, &oset, NULL); Err bitreich.org 70 i- return -1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ return r; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 i download(Item *item, int dest) Err bitreich.org 70 i { Err bitreich.org 70 i char buf[BUFSIZ]; Err bitreich.org 70 i- struct cnx cnx; Err bitreich.org 70 i+ struct cnx c; Err bitreich.org 70 i ssize_t r, w; Err bitreich.org 70 i- int src; Err bitreich.org 70 i Err bitreich.org 70 i- if (!item->tag) { Err bitreich.org 70 i- if (connectto(item->host, item->port, &cnx) == -1 || Err bitreich.org 70 i- sendselector(&cnx, item->selector) == -1) 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+ sendselector(&c, item->selector) == -1) Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ if ((c.sock = open(item->tag, O_RDONLY)) == -1) { Err bitreich.org 70 i+ printf("Can't open source file %s: %s", Err bitreich.org 70 i+ item->tag, strerror(errno)); Err bitreich.org 70 i+ errno = 0; Err bitreich.org 70 i return 0; Err bitreich.org 70 i- src = cnx.sock; Err bitreich.org 70 i- } else if ((src = open(item->tag, O_RDONLY)) == -1) { Err bitreich.org 70 i- printf("Can't open source file %s: %s", Err bitreich.org 70 i- item->tag, strerror(errno)); Err bitreich.org 70 i- errno = 0; Err bitreich.org 70 i- return 0; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- for (w = 0; w != -1;) { Err bitreich.org 70 i-#ifdef USE_TLS Err bitreich.org 70 i- if (tls) { Err bitreich.org 70 i- do { Err bitreich.org 70 i- r = tls_read(cnx.tls, buf, sizeof(buf)); Err bitreich.org 70 i- } while (r == TLS_WANT_POLLIN || r == TLS_WANT_POLLOUT); Err bitreich.org 70 i- } else Err bitreich.org 70 i-#endif Err bitreich.org 70 i- { Err bitreich.org 70 i- r = read(src, buf, sizeof(buf)); Err bitreich.org 70 i } Err bitreich.org 70 i- if (r <= 0) Err bitreich.org 70 i- break; Err bitreich.org 70 i+ c.tls = NULL; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i+ w = 0; Err bitreich.org 70 i+ while ((r = ioread(&c, buf, BUFSIZ)) > 0) { Err bitreich.org 70 i while ((w = write(dest, buf, r)) > 0) Err bitreich.org 70 i r -= w; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -638,7 +562,8 @@ download(Item *item, int dest) Err bitreich.org 70 i errno = 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- closecnx(&cnx); Err bitreich.org 70 i+ close(dest); Err bitreich.org 70 i+ ioclose(&c); Err bitreich.org 70 i Err bitreich.org 70 i return (r == 0 && w == 0); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -693,15 +618,15 @@ cleanup: Err bitreich.org 70 i static int Err bitreich.org 70 i fetchitem(Item *item) Err bitreich.org 70 i { Err bitreich.org 70 i- struct cnx cnx; 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, &cnx) == -1 || Err bitreich.org 70 i- sendselector(&cnx, item->selector) == -1) Err bitreich.org 70 i+ if (connectto(item->host, item->port, &c) == -1 || 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 i- raw = getrawitem(&cnx); Err bitreich.org 70 i- closecnx(&cnx); Err bitreich.org 70 i+ raw = getrawitem(&c); Err bitreich.org 70 i+ ioclose(&c); Err bitreich.org 70 i Err bitreich.org 70 i if (raw == NULL || !*raw) { Err bitreich.org 70 i diag("Empty response from server"); Err bitreich.org 70 i@@ -985,19 +910,7 @@ moldentry(char *url) Err bitreich.org 70 i char *p, *host = url, *port = "70", *gopherpath = "1"; Err bitreich.org 70 i int parsed, ipv6; Err bitreich.org 70 i Err bitreich.org 70 i- if (p = strstr(url, "://")) { Err bitreich.org 70 i- if (strncmp(url, "gopher", p - url) == 0) { Err bitreich.org 70 i- if (tls) { Err bitreich.org 70 i- diag("Switching from gophers to gopher"); Err bitreich.org 70 i- tls = 0; Err bitreich.org 70 i- } Err bitreich.org 70 i- } else if (strncmp(url, "gophers", p - url) == 0) { Err bitreich.org 70 i- tls = 1; Err bitreich.org 70 i- } else { Err bitreich.org 70 i- die("Protocol not supported: %.*s", p - url, url); Err bitreich.org 70 i- } Err bitreich.org 70 i- host = p + 3; Err bitreich.org 70 i- } Err bitreich.org 70 i+ host = ioparseurl(url); Err bitreich.org 70 i Err bitreich.org 70 i if (*host == '[') { Err bitreich.org 70 i ipv6 = 1; Err bitreich.org 70 .