rbb 01/08/07 16:56:35
Modified: network_io/unix sockets.c
Log:
Finish the fix for the non-blocking connect. Basically, we need to
query the socket to find the actual error if the connect failed. This
is done using getsockopt with the SO_ERROR option. If error == 0, then
the connect succeeded, else error is the connect errno value.
Submitted by: Jeff Trawick
Revision Changes Path
1.85 +8 -0 apr/network_io/unix/sockets.c
Index: sockets.c
===================================================================
RCS file: /home/cvs/apr/network_io/unix/sockets.c,v
retrieving revision 1.84
retrieving revision 1.85
diff -u -r1.84 -r1.85
--- sockets.c 2001/08/07 20:24:50 1.84
+++ sockets.c 2001/08/07 23:56:35 1.85
@@ -273,9 +273,17 @@
* socket; if called again, we can see EALREADY
*/
if (rc == -1 && (errno == EINPROGRESS || errno == EALREADY) &&
sock->timeout != 0) {
+ int error;
+ apr_size_t len = sizeof(error);
rc = apr_wait_for_io_or_timeout(sock, 0);
if (rc != APR_SUCCESS) {
return rc;
+ }
+ if ((rc = getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len)) <
0) {
+ return(rc);
+ }
+ if (error) {
+ return error;
}
}