diff --git a/src/fdevent.c b/src/fdevent.c index acbafe67..d9c24335 100644 --- a/src/fdevent.c +++ b/src/fdevent.c @@ -618,6 +618,15 @@ int fdevent_ioctl_fionread (int fd, int fdfmt, int *toread) { } +int fdevent_connect_status(int fd) { + /* try to finish the connect() */ + /*(should be called after connect() only when fd is writable (POLLOUT))*/ + int opt; + socklen_t len = sizeof(opt); + return (0 == getsockopt(fd,SOL_SOCKET,SO_ERROR,&opt,&len)) ? opt : errno; +} + + #include #if (defined(__APPLE__) && defined(__MACH__)) \ || defined(__FreeBSD__) || defined(__NetBSD__) \ diff --git a/src/fdevent.h b/src/fdevent.h index 19dd7563..2130fecc 100644 --- a/src/fdevent.h +++ b/src/fdevent.h @@ -235,6 +235,8 @@ int fdevent_libev_init(fdevents *ev); int fdevent_ioctl_fionread (int fd, int fdfmt, int *toread); +int fdevent_connect_status(int fd); + /* fd must be TCP socket (AF_INET, AF_INET6), end-of-stream recv() 0 bytes */ int fdevent_is_tcp_half_closed(int fd); diff --git a/src/mod_fastcgi.c b/src/mod_fastcgi.c index fb93721b..728ae411 100644 --- a/src/mod_fastcgi.c +++ b/src/mod_fastcgi.c @@ -2133,18 +2133,7 @@ static handler_t fcgi_write_request(server *srv, handler_ctx *hctx) { /* we can't handle this in the switch as we have to fall through in it */ if (hctx->state == FCGI_STATE_CONNECT_DELAYED) { - int socket_error; - socklen_t socket_error_len = sizeof(socket_error); - - /* try to finish the connect() */ - if (0 != getsockopt(hctx->fd, SOL_SOCKET, SO_ERROR, &socket_error, &socket_error_len)) { - log_error_write(srv, __FILE__, __LINE__, "ss", - "getsockopt failed:", strerror(errno)); - - fcgi_proc_disable(srv, hctx->host, hctx->proc, hctx); - - return HANDLER_ERROR; - } + int socket_error = fdevent_connect_status(hctx->fd); if (socket_error != 0) { if (!hctx->proc->is_local || hctx->conf.debug) { /* local procs get restarted */ diff --git a/src/mod_proxy.c b/src/mod_proxy.c index 525a41af..a326cd36 100644 --- a/src/mod_proxy.c +++ b/src/mod_proxy.c @@ -1368,16 +1368,7 @@ static handler_t proxy_write_request(server *srv, handler_ctx *hctx) { break; } } else { - int socket_error; - socklen_t socket_error_len = sizeof(socket_error); - - /* try to finish the connect() */ - if (0 != getsockopt(hctx->fd, SOL_SOCKET, SO_ERROR, &socket_error, &socket_error_len)) { - log_error_write(srv, __FILE__, __LINE__, "ss", - "getsockopt failed:", strerror(errno)); - - return HANDLER_ERROR; - } + int socket_error = fdevent_connect_status(hctx->fd); if (socket_error != 0) { log_error_write(srv, __FILE__, __LINE__, "sssd", "establishing connection failed:", strerror(socket_error), diff --git a/src/mod_scgi.c b/src/mod_scgi.c index 97f2aefe..2d56daf8 100644 --- a/src/mod_scgi.c +++ b/src/mod_scgi.c @@ -1760,16 +1760,7 @@ static handler_t scgi_write_request(server *srv, handler_ctx *hctx) { } else { - int socket_error; - socklen_t socket_error_len = sizeof(socket_error); - - /* try to finish the connect() */ - if (0 != getsockopt(hctx->fd, SOL_SOCKET, SO_ERROR, &socket_error, &socket_error_len)) { - log_error_write(srv, __FILE__, __LINE__, "ss", - "getsockopt failed:", strerror(errno)); - - return HANDLER_ERROR; - } + int socket_error = fdevent_connect_status(hctx->fd); if (socket_error != 0) { if (!hctx->proc->is_local || hctx->conf.debug) { /* local procs get restarted */