diff options
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | src/or/circuitlist.c | 44 | ||||
-rw-r--r-- | src/or/control.c | 42 | ||||
-rw-r--r-- | src/or/or.h | 1 |
4 files changed, 63 insertions, 25 deletions
@@ -64,6 +64,7 @@ Changes in version 0.2.1.6-alpha - 2008-09-29 people find host:port too confusing. - Make TrackHostExit mappings expire a while after their last use, not after their creation. Patch from Robert Hogan. + - Provide circuit purposes along with circuit events to the controller. o Minor bugfixes: - Fix compile on OpenBSD 4.4-current. Bugfix on 0.2.1.5-alpha. diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c index 29dd1fd50..9dbec897c 100644 --- a/src/or/circuitlist.c +++ b/src/or/circuitlist.c @@ -319,6 +319,50 @@ circuit_state_to_string(int state) } } +/** Map a circuit purpose to a string suitable to be displayed to a + * controller. */ +const char * +circuit_purpose_to_controller_string(uint8_t purpose) +{ + static char buf[32]; + switch (purpose) { + case CIRCUIT_PURPOSE_OR: + case CIRCUIT_PURPOSE_INTRO_POINT: + case CIRCUIT_PURPOSE_REND_POINT_WAITING: + case CIRCUIT_PURPOSE_REND_ESTABLISHED: + return "SERVER"; /* A controller should never see these, actually. */ + + case CIRCUIT_PURPOSE_C_GENERAL: + return "GENERAL"; + case CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT: + case CIRCUIT_PURPOSE_C_INTRODUCE_ACKED: + return "HS_CLIENT_INTRO"; + + case CIRCUIT_PURPOSE_C_ESTABLISH_REND: + case CIRCUIT_PURPOSE_C_REND_READY: + case CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED: + case CIRCUIT_PURPOSE_C_REND_JOINED: + return "HS_CLIENT_REND"; + + case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: + case CIRCUIT_PURPOSE_S_INTRO: + return "HS_SERVICE_INTRO"; + + case CIRCUIT_PURPOSE_S_CONNECT_REND: + case CIRCUIT_PURPOSE_S_REND_JOINED: + return "HS_SERVICE_REND"; + + case CIRCUIT_PURPOSE_TESTING: + return "TESTING"; + case CIRCUIT_PURPOSE_CONTROLLER: + return "CONTROLLER"; + + default: + tor_snprintf(buf, sizeof(buf), "UNKNOWN_%d", (int)purpose); + return buf; + } +} + /** Initialize the common elements in a circuit_t, and add it to the global * list. */ static void diff --git a/src/or/control.c b/src/or/control.c index 8ae93e499..c41ef3785 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -2964,7 +2964,7 @@ control_event_circuit_status(origin_circuit_t *circ, circuit_status_event_t tp, int reason_code) { const char *status; - char reason_buf[64]; + char extended_buf[96]; int providing_reason=0; char *path=NULL; if (!EVENT_IS_INTERESTING(EVENT_CIRCUIT_STATUS)) @@ -2986,9 +2986,13 @@ control_event_circuit_status(origin_circuit_t *circ, circuit_status_event_t tp, return 0; } + tor_snprintf(extended_buf, sizeof(extended_buf), "PURPOSE=%s", + circuit_purpose_to_controller_string(circ->_base.purpose)); + if (tp == CIRC_EVENT_FAILED || tp == CIRC_EVENT_CLOSED) { const char *reason_str = circuit_end_reason_to_control_string(reason_code); char *reason = NULL; + size_t n=strlen(extended_buf); providing_reason=1; if (!reason_str) { reason = tor_malloc(16); @@ -2996,41 +3000,29 @@ control_event_circuit_status(origin_circuit_t *circ, circuit_status_event_t tp, reason_str = reason; } if (reason_code > 0 && reason_code & END_CIRC_REASON_FLAG_REMOTE) { - tor_snprintf(reason_buf, sizeof(reason_buf), - "REASON=DESTROYED REMOTE_REASON=%s", reason_str); + tor_snprintf(extended_buf+n, sizeof(extended_buf)-n, + " REASON=DESTROYED REMOTE_REASON=%s", reason_str); } else { - tor_snprintf(reason_buf, sizeof(reason_buf), - "REASON=%s", reason_str); + tor_snprintf(extended_buf+n, sizeof(extended_buf)-n, + " REASON=%s", reason_str); } tor_free(reason); } if (EVENT_IS_INTERESTING1S(EVENT_CIRCUIT_STATUS)) { const char *sp = strlen(path) ? " " : ""; - if (providing_reason) - send_control_event_extended(EVENT_CIRCUIT_STATUS, SHORT_NAMES, - "650 CIRC %lu %s%s%s@%s\r\n", - (unsigned long)circ->global_identifier, - status, sp, path, reason_buf); - else - send_control_event_extended(EVENT_CIRCUIT_STATUS, SHORT_NAMES, - "650 CIRC %lu %s%s%s\r\n", - (unsigned long)circ->global_identifier, - status, sp, path); + send_control_event_extended(EVENT_CIRCUIT_STATUS, SHORT_NAMES, + "650 CIRC %lu %s%s%s@%s\r\n", + (unsigned long)circ->global_identifier, + status, sp, path, extended_buf); } if (EVENT_IS_INTERESTING1L(EVENT_CIRCUIT_STATUS)) { char *vpath = circuit_list_path_for_controller(circ); const char *sp = strlen(vpath) ? " " : ""; - if (providing_reason) - send_control_event_extended(EVENT_CIRCUIT_STATUS, LONG_NAMES, - "650 CIRC %lu %s%s%s@%s\r\n", - (unsigned long)circ->global_identifier, - status, sp, vpath, reason_buf); - else - send_control_event_extended(EVENT_CIRCUIT_STATUS, LONG_NAMES, - "650 CIRC %lu %s%s%s\r\n", - (unsigned long)circ->global_identifier, - status, sp, vpath); + send_control_event_extended(EVENT_CIRCUIT_STATUS, LONG_NAMES, + "650 CIRC %lu %s%s%s@%s\r\n", + (unsigned long)circ->global_identifier, + status, sp, vpath, extended_buf); tor_free(vpath); } diff --git a/src/or/or.h b/src/or/or.h index 81d662e12..06bd64492 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -2703,6 +2703,7 @@ void entry_guards_free_all(void); circuit_t * _circuit_get_global_list(void); const char *circuit_state_to_string(int state); +const char *circuit_purpose_to_controller_string(uint8_t purpose); void circuit_dump_by_conn(connection_t *conn, int severity); void circuit_set_p_circid_orconn(or_circuit_t *circ, circid_t id, or_connection_t *conn); |