diff options
author | max <max@noemail.net> | 2013-11-12 11:45:04 (GMT) |
---|---|---|
committer | max <max@noemail.net> | 2013-11-12 11:45:04 (GMT) |
commit | c669d04f4e7833baea6809932c4ed830b6e0d6b1 (patch) | |
tree | efcc5b230331a85a3544fca7676c0acffc17aeb0 /unix/tclUnixSock.c | |
parent | b28d2a265306e72e9608f6fb3773002f202c2b32 (diff) | |
download | tcl-c669d04f4e7833baea6809932c4ed830b6e0d6b1.zip tcl-c669d04f4e7833baea6809932c4ed830b6e0d6b1.tar.gz tcl-c669d04f4e7833baea6809932c4ed830b6e0d6b1.tar.bz2 |
Fix [5425f2c082]: [fconfigure -error] breaks the background processing of a pending [socket -async].
FossilOrigin-Name: 80ca9fe74674a254bc519a050709c9018ee6230b
Diffstat (limited to 'unix/tclUnixSock.c')
-rw-r--r-- | unix/tclUnixSock.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/unix/tclUnixSock.c b/unix/tclUnixSock.c index a6360c2..7ef28d8 100644 --- a/unix/tclUnixSock.c +++ b/unix/tclUnixSock.c @@ -737,7 +737,10 @@ TcpGetOptionProc( if (statePtr->status == 0) { ret = getsockopt(statePtr->fds.fd, SOL_SOCKET, SO_ERROR, - (char *) &err, &optlen); + (char *) &err, &optlen); + if (statePtr->flags & TCP_ASYNC_CONNECT) { + statePtr->status = err; + } if (ret < 0) { err = errno; } @@ -1054,12 +1057,17 @@ CreateClientSocket( */ optlen = sizeof(int); - getsockopt(state->fds.fd, SOL_SOCKET, SO_ERROR, - (char *) &status, &optlen); - state->status = status; + + if (state->status == 0) { + getsockopt(state->fds.fd, SOL_SOCKET, SO_ERROR, + (char *) &status, &optlen); + state->status = status; + } else { + status = state->status; + state->status = 0; + } } if (status == 0) { - CLEAR_BITS(state->flags, TCP_ASYNC_CONNECT); goto out; } } @@ -1067,6 +1075,7 @@ CreateClientSocket( out: + CLEAR_BITS(state->flags, TCP_ASYNC_CONNECT); if (async_callback) { /* * An asynchonous connection has finally succeeded or failed. |