From 6492db5453a3d398f096e9f7d6e84ea3984a1f04 Mon Sep 17 00:00:00 2001 From: Krzysztof Piotr Oledzki Date: Sat, 2 Jan 2010 22:03:01 +0100 Subject: [PATCH] [BUG] Healthchecks: get a proper error code if connection cannot be completed immediately In case of a non-blocking socket, used for connecting to a remote server (not localhost), the error reported by the health check was most of a time one of EINPROGRESS/EAGAIN/EALREADY. This patch adds a getsockopt(..., SO_ERROR, ...) call so now the proper error message is reported. --- src/checks.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/checks.c b/src/checks.c index 388efdf02..b6f73bd30 100644 --- a/src/checks.c +++ b/src/checks.c @@ -651,7 +651,13 @@ static int event_srv_chk_w(int fd) //fprintf(stderr, "event_srv_chk_w, state=%ld\n", unlikely(fdtab[fd].state)); if (unlikely(fdtab[fd].state == FD_STERROR || (fdtab[fd].ev & FD_POLL_ERR))) { - set_server_check_status(s, HCHK_STATUS_L4CON, strerror(errno)); + int skerr, err = errno; + socklen_t lskerr = sizeof(skerr); + + if (!getsockopt(fd, SOL_SOCKET, SO_ERROR, &skerr, &lskerr) && skerr) + err = skerr; + + set_server_check_status(s, HCHK_STATUS_L4CON, strerror(err)); goto out_error; }