summaryrefslogtreecommitdiff
path: root/src/or/connection.c
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2008-06-11 01:14:23 +0000
committerRoger Dingledine <arma@torproject.org>2008-06-11 01:14:23 +0000
commit8c85eef9b065573da2be12c631e906dc149b1a4f (patch)
tree7d2fbc51f23e83911e03ba5e83932c68ec095851 /src/or/connection.c
parent42f21007a34ed5f0474e7eccd0991f1d8c5423f0 (diff)
downloadtor-8c85eef9b065573da2be12c631e906dc149b1a4f.tar.gz
tor-8c85eef9b065573da2be12c631e906dc149b1a4f.zip
start sending "bootstrap problem" status events when we're having troubles
reaching relays. svn:r15116
Diffstat (limited to 'src/or/connection.c')
-rw-r--r--src/or/connection.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/or/connection.c b/src/or/connection.c
index 8cbead64e3..8cfea46ea4 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -500,14 +500,18 @@ connection_about_to_close_connection(connection_t *conn)
if (!get_options()->HttpsProxy)
router_set_status(or_conn->identity_digest, 0);
if (conn->state == OR_CONN_STATE_CONNECTING) {
- control_event_or_conn_status(or_conn, OR_CONN_EVENT_FAILED, 0);
+ control_event_or_conn_status(or_conn, OR_CONN_EVENT_FAILED,
+ errno_to_orconn_end_reason(or_conn->socket_error));
control_event_bootstrap_problem(
- tor_socket_strerror(or_conn->socket_error), 0);
+ tor_socket_strerror(or_conn->socket_error),
+ errno_to_orconn_end_reason(or_conn->socket_error));
} else {
int reason = tls_error_to_orconn_end_reason(or_conn->tls_error);
control_event_or_conn_status(or_conn, OR_CONN_EVENT_FAILED,
reason);
- control_event_bootstrap_problem("foo", reason);
+ /* XXX021 come up with a better string for the first arg */
+ control_event_bootstrap_problem(
+ orconn_end_reason_to_control_string(reason), reason);
}
}
/* Inform any pending (not attached) circs that they should
@@ -1097,8 +1101,9 @@ connection_init_accepted_conn(connection_t *conn, uint8_t listener_type)
}
/** Take conn, make a nonblocking socket; try to connect to
- * addr:port (they arrive in *host order*). If fail, return -1. Else
- * assign s to conn-\>s: if connected return 1, if EAGAIN return 0.
+ * addr:port (they arrive in *host order*). If fail, return -1 and if
+ * applicable put your best guess about errno into *<b>socket_error</b>.
+ * Else assign s to conn-\>s: if connected return 1, if EAGAIN return 0.
*
* address is used to make the logs useful.
*
@@ -1106,7 +1111,7 @@ connection_init_accepted_conn(connection_t *conn, uint8_t listener_type)
*/
int
connection_connect(connection_t *conn, const char *address,
- uint32_t addr, uint16_t port)
+ uint32_t addr, uint16_t port, int *socket_error)
{
int s, inprogress = 0;
struct sockaddr_in dest_addr;
@@ -1123,8 +1128,9 @@ connection_connect(connection_t *conn, const char *address,
s = tor_open_socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
if (s < 0) {
+ *socket_error = tor_socket_errno(-1);
log_warn(LD_NET,"Error creating network socket: %s",
- tor_socket_strerror(tor_socket_errno(-1)));
+ tor_socket_strerror(*socket_error));
return -1;
}
@@ -1140,8 +1146,9 @@ connection_connect(connection_t *conn, const char *address,
} else {
if (bind(s, (struct sockaddr*)&ext_addr,
(socklen_t)sizeof(ext_addr)) < 0) {
+ *socket_error = tor_socket_errno(s);
log_warn(LD_NET,"Error binding network socket: %s",
- tor_socket_strerror(tor_socket_errno(s)));
+ tor_socket_strerror(*socket_error));
tor_close_socket(s);
return -1;
}
@@ -1165,6 +1172,7 @@ connection_connect(connection_t *conn, const char *address,
int e = tor_socket_errno(s);
if (!ERRNO_IS_CONN_EINPROGRESS(e)) {
/* yuck. kill it. */
+ *socket_error = e;
log_info(LD_NET,
"connect() to %s:%u failed: %s",escaped_safe_str(address),
port, tor_socket_strerror(e));