imask signals while using connect(2) in connectto() - 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 dba0b8d682e77ac33fbdc6f75dee9ee9f08553f9 /scm/sacc/commit/dba0b8d682e77ac33fbdc6f75dee9ee9f08553f9.gph bitreich.org 70 1parent c7ab5157ebc7e7d502e0970770a7e7be48e61ea2 /scm/sacc/commit/c7ab5157ebc7e7d502e0970770a7e7be48e61ea2.gph bitreich.org 70 hAuthor: Hiltjo Posthuma URL:mailto:hiltjo@codemadness.org bitreich.org 70 iDate: Tue, 25 Dec 2018 20:44:18 +0100 Err bitreich.org 70 i Err bitreich.org 70 imask signals while using connect(2) in connectto() Err bitreich.org 70 i Err bitreich.org 70 iThis makes sure connect(2) don't return a possible < 0 and errno = EINTR. Err bitreich.org 70 i Err bitreich.org 70 iPOSIX says for connect(2): " Err bitreich.org 70 i[EINTR] The connection attempt was interrupted by a signal. Err bitreich.org 70 i The attempt will continue asynchronously as if the Err bitreich.org 70 i socket was non-blocking." Err bitreich.org 70 i Err bitreich.org 70 iThis was reproducable by launching with st -e sacc bitreich.org . When sacc was Err bitreich.org 70 isignaled with SIGWINCH while it was connecting the connect(2) would be handled Err bitreich.org 70 ias a failure and the next interface was tried. This gave a vague message "no Err bitreich.org 70 iroute to host", because the next interfaces could fail. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M sacc.c | 15 ++++++++++++--- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 12 insertions(+), 3 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/sacc.c b/sacc.c /scm/sacc/file/sacc.c.gph bitreich.org 70 i@@ -454,6 +454,7 @@ sendselector(int sock, const char *selector) Err bitreich.org 70 i static int Err bitreich.org 70 i connectto(const char *host, const char *port) 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 .ai_family = AF_UNSPEC, Err bitreich.org 70 i .ai_socktype = SOCK_STREAM, Err bitreich.org 70 i@@ -462,10 +463,13 @@ connectto(const char *host, const char *port) Err bitreich.org 70 i struct addrinfo *addrs, *addr; Err bitreich.org 70 i int sock, r; Err bitreich.org 70 i Err bitreich.org 70 i+ sigfillset(&set); Err bitreich.org 70 i+ sigprocmask(SIG_BLOCK, &set, &oset); Err bitreich.org 70 i+ Err bitreich.org 70 i if (r = getaddrinfo(host, port, &hints, &addrs)) { Err bitreich.org 70 i diag("Can't resolve hostname \"%s\": %s", Err bitreich.org 70 i host, gai_strerror(r)); Err bitreich.org 70 i- return -1; Err bitreich.org 70 i+ goto err; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i for (addr = addrs; addr; addr = addr->ai_next) { Err bitreich.org 70 i@@ -483,15 +487,20 @@ connectto(const char *host, const char *port) Err bitreich.org 70 i Err bitreich.org 70 i if (sock < 0) { Err bitreich.org 70 i diag("Can't open socket: %s", strerror(errno)); Err bitreich.org 70 i- return -1; Err bitreich.org 70 i+ goto err; Err bitreich.org 70 i } Err bitreich.org 70 i if (r < 0) { 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- return -1; Err bitreich.org 70 i+ goto err; 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 return sock; Err bitreich.org 70 i+ 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 Err bitreich.org 70 i static int Err bitreich.org 70 .