mask signals while using connect(2) in connectto() - sacc - sacc(omys), simple console gopher client HTML git clone git://bitreich.org/sacc/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/sacc/ DIR Log DIR Files DIR Refs DIR Tags DIR LICENSE --- DIR commit dba0b8d682e77ac33fbdc6f75dee9ee9f08553f9 DIR parent c7ab5157ebc7e7d502e0970770a7e7be48e61ea2 HTML Author: Hiltjo Posthuma <hiltjo@codemadness.org> Date: Tue, 25 Dec 2018 20:44:18 +0100 mask signals while using connect(2) in connectto() This makes sure connect(2) don't return a possible < 0 and errno = EINTR. POSIX says for connect(2): " [EINTR] The connection attempt was interrupted by a signal. The attempt will continue asynchronously as if the socket was non-blocking." This was reproducable by launching with st -e sacc bitreich.org . When sacc was signaled with SIGWINCH while it was connecting the connect(2) would be handled as a failure and the next interface was tried. This gave a vague message "no route to host", because the next interfaces could fail. Diffstat: M sacc.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) --- DIR diff --git a/sacc.c b/sacc.c @@ -454,6 +454,7 @@ sendselector(int sock, const char *selector) static int connectto(const char *host, const char *port) { + sigset_t set, oset; static const struct addrinfo hints = { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM, @@ -462,10 +463,13 @@ connectto(const char *host, const char *port) struct addrinfo *addrs, *addr; int sock, r; + sigfillset(&set); + sigprocmask(SIG_BLOCK, &set, &oset); + if (r = getaddrinfo(host, port, &hints, &addrs)) { diag("Can't resolve hostname \"%s\": %s", host, gai_strerror(r)); - return -1; + goto err; } for (addr = addrs; addr; addr = addr->ai_next) { @@ -483,15 +487,20 @@ connectto(const char *host, const char *port) if (sock < 0) { diag("Can't open socket: %s", strerror(errno)); - return -1; + goto err; } if (r < 0) { diag("Can't connect to: %s:%s: %s", host, port, strerror(errno)); - return -1; + goto err; } + sigprocmask(SIG_SETMASK, &oset, NULL); return sock; + +err: + sigprocmask(SIG_SETMASK, &oset, NULL); + return -1; } static int