From f4ac0add2219f3f78fe20031e0eb363126a9ee29 Mon Sep 17 00:00:00 2001 From: Fabian Mauchle Date: Thu, 28 Jun 2018 15:41:26 +0200 Subject: [PATCH] report detailed error when tcp connect fails --- util.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/util.c b/util.c index eebb4b9..f76e5ca 100644 --- a/util.c +++ b/util.c @@ -178,7 +178,8 @@ int bindtoaddr(struct addrinfo *addrinfo, int family, int reuse) { } int connectnonblocking(int s, const struct sockaddr *addr, socklen_t addrlen, int timeout) { - int origflags, r = -1; + int origflags, r = -1, sockerr = 0; + socklen_t errlen = sizeof(sockerr); struct pollfd fds[1]; origflags = fcntl(s, F_GETFL, 0); @@ -202,8 +203,15 @@ int connectnonblocking(int s, const struct sockaddr *addr, socklen_t addrlen, in if (poll(fds, 1, timeout * 1000) < 1) goto exit; - if (fds[0].revents & (POLLERR | POLLHUP | POLLNVAL) ) { - debug(DBG_WARN, "Connection failed or refused"); + if (fds[0].revents & POLLERR) { + if(!getsockopt(s, SOL_SOCKET, SO_ERROR, (void *)&sockerr, &errlen)) + debug(DBG_WARN, "Connection failed: %s", strerror(sockerr)); + else + debug(DBG_WARN, "Connection failed: unknown error"); + } else if (fds[0].revents & POLLHUP) { + debug(DBG_WARN, "Connect error: hang up"); + } else if (fds[0].revents & POLLNVAL) { + debug(DBG_WARN, "Connect error: fd not open"); } else if(fds[0].revents & POLLOUT) { debug(DBG_DBG, "Connection up"); r = 0;