--- a/src/libwaitress/waitress.c
|
|
+++ b/src/libwaitress/waitress.c
|
|
@@ -805,34 +805,37 @@ static WaitressReturn_t WaitressConnect
|
|
int pollres;
|
|
|
|
/* we need shorter timeouts for connect() */
|
|
- fcntl (sock, F_SETFL, O_NONBLOCK);
|
|
+ pollres = fcntl (sock, F_SETFL, O_NONBLOCK);
|
|
+ assert (pollres != -1);
|
|
|
|
- /* increase socket receive buffer */
|
|
- const int sockopt = 256*1024;
|
|
- setsockopt (sock, SOL_SOCKET, SO_RCVBUF, &sockopt,
|
|
- sizeof (sockopt));
|
|
-
|
|
- /* non-blocking connect will return immediately */
|
|
- connect (sock, gacurr->ai_addr, gacurr->ai_addrlen);
|
|
-
|
|
- pollres = WaitressPollLoop (sock, POLLOUT, waith->timeout);
|
|
- if (pollres == 0) {
|
|
- ret = WAITRESS_RET_TIMEOUT;
|
|
- } else if (pollres == -1) {
|
|
- ret = WAITRESS_RET_ERR;
|
|
- } else {
|
|
- /* check connect () return value */
|
|
- socklen_t pollresSize = sizeof (pollres);
|
|
- getsockopt (sock, SOL_SOCKET, SO_ERROR, &pollres,
|
|
- &pollresSize);
|
|
- if (pollres != 0) {
|
|
- ret = WAITRESS_RET_CONNECT_REFUSED;
|
|
+ if (connect (sock, gacurr->ai_addr, gacurr->ai_addrlen) != -1) {
|
|
+ /* working */
|
|
+ waith->request.sockfd = sock;
|
|
+ break;
|
|
+ } else if (errno == EINPROGRESS) {
|
|
+ /* wait for connect to succeed */
|
|
+ pollres = WaitressPollLoop (sock, POLLOUT, waith->timeout);
|
|
+ if (pollres == 0) {
|
|
+ ret = WAITRESS_RET_TIMEOUT;
|
|
+ } else if (pollres == -1) {
|
|
+ ret = WAITRESS_RET_ERR;
|
|
} else {
|
|
- /* this one is working */
|
|
- waith->request.sockfd = sock;
|
|
- break;
|
|
+ /* check connect () return value */
|
|
+ socklen_t pollresSize = sizeof (pollres);
|
|
+ getsockopt (sock, SOL_SOCKET, SO_ERROR, &pollres,
|
|
+ &pollresSize);
|
|
+ if (pollres != 0) {
|
|
+ ret = WAITRESS_RET_CONNECT_REFUSED;
|
|
+ } else {
|
|
+ /* this one is working */
|
|
+ waith->request.sockfd = sock;
|
|
+ break;
|
|
+ }
|
|
}
|
|
+ } else {
|
|
+ ret = WAITRESS_RET_ERR;
|
|
}
|
|
+
|
|
close (sock);
|
|
}
|
|
}
|
|
--- a/src/libfootball/fb_service.c
|
|
+++ b/src/libfootball/fb_service.c
|
|
@@ -111,6 +111,8 @@ static bool fb_setup_socket (FB_SERVICE
|
|
service->socket [which] = 0;
|
|
} else {
|
|
fb_perror ("socket");
|
|
+ // Element must be zero (not -1)
|
|
+ service->socket [which] = 0;
|
|
};
|
|
return false;
|
|
}
|