summaryrefslogtreecommitdiff
path: root/src/or/control.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2013-10-21 13:02:25 -0400
committerNick Mathewson <nickm@torproject.org>2013-10-21 13:02:25 -0400
commit71bd10097677cd035bd97a6c36b85d07fdbafb62 (patch)
treec721e0bbe724ae462e46b7c44ab094c7d4fcdccb /src/or/control.c
parent17d368281ad374908fb019e29f3f012659be010c (diff)
downloadtor-71bd10097677cd035bd97a6c36b85d07fdbafb62.tar.gz
tor-71bd10097677cd035bd97a6c36b85d07fdbafb62.zip
DROPGUARDS controller command
Implements ticket 9934; patch from "ra"
Diffstat (limited to 'src/or/control.c')
-rw-r--r--src/or/control.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/or/control.c b/src/or/control.c
index e97c18d892..65c543a430 100644
--- a/src/or/control.c
+++ b/src/or/control.c
@@ -3141,6 +3141,30 @@ handle_control_usefeature(control_connection_t *conn,
return 0;
}
+/** Implementation for the DROPGUARDS command. */
+static int
+handle_control_dropguards(control_connection_t *conn,
+ uint32_t len,
+ const char *body)
+{
+ smartlist_t *args;
+ (void) len; /* body is nul-terminated; it's safe to ignore the length */
+ args = smartlist_new();
+ smartlist_split_string(args, body, " ",
+ SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
+
+ if (smartlist_len(args)) {
+ connection_printf_to_buf(conn, "512 Too many arguments to DROPGUARDS\r\n");
+ } else {
+ remove_all_entry_guards();
+ send_control_done(conn);
+ }
+
+ SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
+ smartlist_free(args);
+ return 0;
+}
+
/** Called when <b>conn</b> has no more bytes left on its outbuf. */
int
connection_control_finished_flushing(control_connection_t *conn)
@@ -3440,6 +3464,9 @@ connection_control_process_inbuf(control_connection_t *conn)
} else if (!strcasecmp(conn->incoming_cmd, "AUTHCHALLENGE")) {
if (handle_control_authchallenge(conn, cmd_data_len, args))
return -1;
+ } else if (!strcasecmp(conn->incoming_cmd, "DROPGUARDS")) {
+ if (handle_control_dropguards(conn, cmd_data_len, args))
+ return -1;
} else {
connection_printf_to_buf(conn, "510 Unrecognized command \"%s\"\r\n",
conn->incoming_cmd);