diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | doc/spec/control-spec.txt | 8 | ||||
-rw-r--r-- | src/or/control.c | 25 | ||||
-rw-r--r-- | src/or/or.h | 4 |
4 files changed, 37 insertions, 4 deletions
@@ -1,4 +1,8 @@ Changes in version 0.2.0.27-rc - 2008-05-?? + o Minor features (controller): + - Add a "PURPOSE=" argument to "STREAM NEW" events, as suggested by + Robert Hogan. Fixes the first part of bug 681. + o Minor bugfixes (controller): - When tunneling an encrypted directory connection, and its first circuit fails do not leave it unattached and ask the controller to deal. Fixes diff --git a/doc/spec/control-spec.txt b/doc/spec/control-spec.txt index 0ab794d6ec..df27b74049 100644 --- a/doc/spec/control-spec.txt +++ b/doc/spec/control-spec.txt @@ -984,6 +984,7 @@ $Id$ "650" SP "STREAM" SP StreamID SP StreamStatus SP CircID SP Target [SP "REASON=" Reason [ SP "REMOTE_REASON=" Reason ]] [SP "SOURCE=" Source] [ SP "SOURCE_ADDR=" Address ":" Port ] + [SP "PURPOSE=" Purpose] CRLF StreamStatus = @@ -1033,6 +1034,13 @@ $Id$ that requested the connection, and can be (e.g.) used to look up the requesting program. + Purpose = "DIR_FETCH" / "UPLOAD_DESC" / "DNS_REQUEST" / + "USER" / "DIRPORT_TEST" + + The "PURPOSE" field is provided only for NEW and NEWRESOLVE events, and + only if extended events are enabled (see 3.19). Clients MUST accept + purposes not listed above. + 4.1.3. OR Connection status changed The syntax is: diff --git a/src/or/control.c b/src/or/control.c index 1327a1fc6a..d0403f9006 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -3048,6 +3048,7 @@ control_event_stream_status(edge_connection_t *conn, stream_status_event_t tp, circuit_t *circ; origin_circuit_t *origin_circ = NULL; char buf[256]; + const char *purpose = ""; tor_assert(conn->socks_request); if (!EVENT_IS_INTERESTING(EVENT_STREAM_STATUS)) @@ -3115,15 +3116,35 @@ control_event_stream_status(edge_connection_t *conn, stream_status_event_t tp, addrport_buf[0] = '\0'; } + if (tp == STREAM_EVENT_NEW_RESOLVE) { + purpose = " PURPOSE=DNS_REQUEST"; + } else if (tp == STREAM_EVENT_NEW) { + if (conn->is_dns_request || + (conn->socks_request && + SOCKS_COMMAND_IS_RESOLVE(conn->socks_request->command))) + purpose = " PURPOSE=DNS_REQUEST"; + else if (conn->use_begindir) { + connection_t *linked = TO_CONN(conn)->linked_conn; + int linked_dir_purpose = -1; + if (linked && linked->type == CONN_TYPE_DIR) + linked_dir_purpose = linked->purpose; + if (DIR_PURPOSE_IS_UPLOAD(linked_dir_purpose)) + purpose = " PURPOSE=DIR_UPLOAD"; + else + purpose = " PURPOSE=DIR_FETCH"; + } else + purpose = " PURPOSE=USER"; + } + circ = circuit_get_by_edge_conn(conn); if (circ && CIRCUIT_IS_ORIGIN(circ)) origin_circ = TO_ORIGIN_CIRCUIT(circ); send_control_event_extended(EVENT_STREAM_STATUS, ALL_NAMES, - "650 STREAM %lu %s %lu %s@%s%s\r\n", + "650 STREAM %lu %s %lu %s@%s%s%s\r\n", (unsigned long)conn->global_identifier, status, origin_circ? (unsigned long)origin_circ->global_identifier : 0ul, - buf, reason_buf, addrport_buf); + buf, reason_buf, addrport_buf, purpose); /* XXX need to specify its intended exit, etc? */ diff --git a/src/or/or.h b/src/or/or.h index c7cfa21b2a..329260a476 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -371,8 +371,8 @@ typedef enum { #define DIR_PURPOSE_IS_UPLOAD(p) \ ((p)==DIR_PURPOSE_UPLOAD_DIR || \ - (p)==DIR_PURPOSE_UPLOAD_RENDDESC || \ - (p)==DIR_PURPOSE_UPLOAD_VOTE || \ + (p)==DIR_PURPOSE_UPLOAD_RENDDESC || \ + (p)==DIR_PURPOSE_UPLOAD_VOTE || \ (p)==DIR_PURPOSE_UPLOAD_SIGNATURES) #define _EXIT_PURPOSE_MIN 1 |