diff options
author | Martin Sustrik <sustrik@250bpm.com> | 2012-04-29 07:59:52 +0200 |
---|---|---|
committer | Martin Sustrik <sustrik@250bpm.com> | 2012-04-29 07:59:52 +0200 |
commit | a84a77a4861c8fc1b0b6d3ec0931e83395cb34b5 (patch) | |
tree | da4c789d742994a55f4d6627af7b727dbcf68994 | |
parent | b89d87787f8a388ebec038cd60a6c3db41919c41 (diff) |
Fix TCP/IPC socket shutdown
When socket in the process of asynchronous connect is being closed
and the fact that there is no peer is found out at the same time
close() may return ECONNRESET. This patch handles this situation
decently.
Signed-off-by: Martin Sustrik <sustrik@250bpm.com>
-rw-r--r-- | src/ipc_connecter.cpp | 9 | ||||
-rw-r--r-- | src/ipc_connecter.hpp | 2 | ||||
-rw-r--r-- | src/tcp_connecter.cpp | 2 |
3 files changed, 6 insertions, 7 deletions
diff --git a/src/ipc_connecter.cpp b/src/ipc_connecter.cpp index ec9c5b1..af3665c 100644 --- a/src/ipc_connecter.cpp +++ b/src/ipc_connecter.cpp @@ -206,16 +206,15 @@ int xs::ipc_connecter_t::open () return -1; } -int xs::ipc_connecter_t::close () +void xs::ipc_connecter_t::close () { if (s == retired_fd) - return 0; + return; int rc = ::close (s); - if (rc != 0) - return -1; + errno_assert (rc == 0 || errno == ECONNRESET); + s = retired_fd; - return 0; } xs::fd_t xs::ipc_connecter_t::connect () diff --git a/src/ipc_connecter.hpp b/src/ipc_connecter.hpp index 2a874bc..e6c419d 100644 --- a/src/ipc_connecter.hpp +++ b/src/ipc_connecter.hpp @@ -81,7 +81,7 @@ namespace xs int open (); // Close the connecting socket. - int close (); + void close (); // Get the file descriptor of newly created connection. Returns // retired_fd if the connection was unsuccessfull. diff --git a/src/tcp_connecter.cpp b/src/tcp_connecter.cpp index d1c04db..de105bb 100644 --- a/src/tcp_connecter.cpp +++ b/src/tcp_connecter.cpp @@ -307,7 +307,7 @@ void xs::tcp_connecter_t::close () wsa_assert (rc != SOCKET_ERROR); #else int rc = ::close (s); - errno_assert (rc == 0); + errno_assert (rc == 0 || errno == ECONNRESET); #endif s = retired_fd; } |