aboutsummaryrefslogtreecommitdiff
path: root/src/or/control.c
diff options
context:
space:
mode:
authorMike Perry <mikeperry-git@fscked.org>2009-12-29 04:17:12 +0100
committerMike Perry <mikeperry-git@fscked.org>2010-02-18 09:08:31 -0800
commitac68704f07c2b70321b72e3b8665cb6d12da7e6b (patch)
tree2c8d329bd53f299e710a16eee4bb5662a0dd6c16 /src/or/control.c
parent8512e337734a1eb8746df8500ec0f1f8b1fdc5e8 (diff)
downloadtor-ac68704f07c2b70321b72e3b8665cb6d12da7e6b.tar
tor-ac68704f07c2b70321b72e3b8665cb6d12da7e6b.tar.gz
Allow "EXTENDCIRCUIT 0" to omit a path.
Diffstat (limited to 'src/or/control.c')
-rw-r--r--src/or/control.c53
1 files changed, 42 insertions, 11 deletions
diff --git a/src/or/control.c b/src/or/control.c
index c34848d45..a7e60d55f 100644
--- a/src/or/control.c
+++ b/src/or/control.c
@@ -2055,27 +2055,58 @@ handle_control_extendcircuit(control_connection_t *conn, uint32_t len,
router_nicknames = smartlist_create();
- args = getargs_helper("EXTENDCIRCUIT", conn, body, 2, -1);
+ args = getargs_helper("EXTENDCIRCUIT", conn, body, 1, -1);
if (!args)
goto done;
zero_circ = !strcmp("0", (char*)smartlist_get(args,0));
+
+ if (zero_circ) {
+ char *purp = NULL;
+ if (smartlist_len(args) == 2) {
+ // "EXTENDCIRCUIT 0 PURPOSE=foo"
+ purp = smartlist_get(args,1);
+ } else if (smartlist_len(args) == 3) {
+ // "EXTENDCIRCUIT 0 router1,router2 PURPOSE=foo"
+ purp = smartlist_get(args,2);
+ }
+
+ if (purp && strcmpstart(purp, "purpose=") != 0)
+ purp = NULL;
+
+ if (purp) {
+ intended_purpose = circuit_purpose_from_string(purp);
+ if (intended_purpose == CIRCUIT_PURPOSE_UNKNOWN) {
+ connection_printf_to_buf(conn, "552 Unknown purpose \"%s\"\r\n", purp);
+ SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
+ smartlist_free(args);
+ }
+ }
+
+ if ((smartlist_len(args) == 1) || (purp && (smartlist_len(args) == 2))) {
+ // "EXTENDCIRCUIT 0" || EXTENDCIRCUIT 0 PURPOSE=foo"
+ circ = circuit_launch_by_router(intended_purpose, NULL,
+ CIRCLAUNCH_NEED_CAPACITY);
+ if (!circ) {
+ connection_write_str_to_buf("551 Couldn't start circuit\r\n", conn);
+ } else {
+ connection_printf_to_buf(conn, "250 EXTENDED %lu\r\n",
+ (unsigned long)circ->global_identifier);
+ }
+ goto done;
+ }
+ // "EXTENDCIRCUIT 0 router1,router2" ||
+ // "EXTENDCIRCUIT 0 router1,router2 PURPOSE=foo"
+ }
+
if (!zero_circ && !(circ = get_circ(smartlist_get(args,0)))) {
connection_printf_to_buf(conn, "552 Unknown circuit \"%s\"\r\n",
(char*)smartlist_get(args, 0));
+ goto done;
}
+
smartlist_split_string(router_nicknames, smartlist_get(args,1), ",", 0, 0);
- if (zero_circ && smartlist_len(args)>2) {
- char *purp = smartlist_get(args,2);
- intended_purpose = circuit_purpose_from_string(purp);
- if (intended_purpose == CIRCUIT_PURPOSE_UNKNOWN) {
- connection_printf_to_buf(conn, "552 Unknown purpose \"%s\"\r\n", purp);
- SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
- smartlist_free(args);
- goto done;
- }
- }
SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
smartlist_free(args);
if (!zero_circ && !circ) {