diff options
Diffstat (limited to 'src/or/connection.c')
-rw-r--r-- | src/or/connection.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/or/connection.c b/src/or/connection.c index 4b06f7369..c95b412a5 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -834,9 +834,18 @@ int connection_handle_write(connection_t *conn) { /* Sometimes, "writeable" means "connected". */ if (connection_state_is_connecting(conn)) { if (getsockopt(conn->s, SOL_SOCKET, SO_ERROR, (void*)&e, &len) < 0) { - /* not yet */ + log_fn(LOG_WARN,"getsockopt() syscall failed?! Please report to tor-ops."); + connection_close_immediate(conn); + connection_mark_for_close(conn); + return -1; + } + if(e) { + /* some sort of error, but maybe just inprogress still */ + errno = e; /* XXX008 this is a kludge. maybe we should rearrange + our error-hunting functions? E.g. pass errno to + tor_socket_errno(). */ if(!ERRNO_IS_CONN_EINPROGRESS(tor_socket_errno(conn->s))) { - log_fn(LOG_DEBUG,"in-progress connect failed. Removing."); + log_fn(LOG_INFO,"in-progress connect failed. Removing."); connection_close_immediate(conn); connection_mark_for_close(conn); /* it's safe to pass OPs to router_mark_as_down(), since it just |