- --- 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;
- }
|