diff options
author | Nick Mathewson <nickm@torproject.org> | 2010-09-10 09:19:10 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2010-09-10 09:19:10 -0400 |
commit | 07049b3d25cbc397dd39c71d32422bfd7c39d814 (patch) | |
tree | c037b87814aac248cbbe9533a51f0bbdc599ea65 | |
parent | c05c8dbd78f13bff79cda8fda1579aba51e30b0c (diff) | |
download | tor-07049b3d25cbc397dd39c71d32422bfd7c39d814.tar tor-07049b3d25cbc397dd39c71d32422bfd7c39d814.tar.gz |
Support mutli-line torrc options via the usual backslash syntax
-rw-r--r-- | changes/torrc_continuation | 5 | ||||
-rw-r--r-- | src/common/util.c | 22 | ||||
-rw-r--r-- | src/test/test_util.c | 20 |
3 files changed, 46 insertions, 1 deletions
diff --git a/changes/torrc_continuation b/changes/torrc_continuation new file mode 100644 index 000000000..f40e970c0 --- /dev/null +++ b/changes/torrc_continuation @@ -0,0 +1,5 @@ + o Minor features: + - Support line continuations in torrc. If a line ends with a + single backslash character, the newline is ignored, and the + configuration value is treated as continuing on the next line. + diff --git a/src/common/util.c b/src/common/util.c index 1d770458f..6b9455ddd 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -2285,6 +2285,7 @@ const char * parse_config_line_from_str(const char *line, char **key_out, char **value_out) { const char *key, *val, *cp; + int continuation = 0; tor_assert(key_out); tor_assert(value_out); @@ -2329,8 +2330,13 @@ parse_config_line_from_str(const char *line, char **key_out, char **value_out) if (*line && *line != '#' && *line != '\n') return NULL; } else { - while (*line && *line != '\n' && *line != '#') + while (*line && *line != '\n' && *line != '#') { + if (*line == '\\' && line[1] == '\n') { + continuation = 1; + ++line; + } ++line; + } if (*line == '\n') { cp = line++; } else { @@ -2340,7 +2346,21 @@ parse_config_line_from_str(const char *line, char **key_out, char **value_out) --cp; tor_assert(cp >= val); + *value_out = tor_strndup(val, cp-val); + if (continuation) { + char *v_out, *v_in; + v_out = v_in = *value_out; + while (*v_in) { + if (v_in[0] == '\\' && v_in[1] == '\n') { + v_in += 2; + } else { + *v_out++ = *v_in++; + } + } + *v_out = '\0'; + } + } if (*line == '#') { diff --git a/src/test/test_util.c b/src/test/test_util.c index 8a1359797..84bb5a67f 100644 --- a/src/test/test_util.c +++ b/src/test/test_util.c @@ -100,6 +100,9 @@ test_util_config_line(void) "k4#a\n" "k5#abc\n" "k6 val #with comment\n" "kseven \"a quoted 'string\"\n" "k8 \"a \\x71uoted\\n\\\"str\\\\ing\\t\\001\\01\\1\\\"\"\n" + "k9 a line that\\\n spans two lines.\n\n" + "k10 more than\\\n one contin\\\nuation\n" + "k11 \\\ncontinuation at the start\n" , sizeof(buf)); str = buf; @@ -161,7 +164,24 @@ test_util_config_line(void) test_streq(k, "k8"); test_streq(v, "a quoted\n\"str\\ing\t\x01\x01\x01\""); tor_free(k); tor_free(v); + + str = parse_config_line_from_str(str, &k, &v); + test_streq(k, "k9"); + test_streq(v, "a line that spans two lines."); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str(str, &k, &v); + test_streq(k, "k10"); + test_streq(v, "more than one continuation"); + tor_free(k); tor_free(v); + + str = parse_config_line_from_str(str, &k, &v); + test_streq(k, "k11"); + test_streq(v, "continuation at the start"); + tor_free(k); tor_free(v); + test_streq(str, ""); + done: tor_free(k); tor_free(v); |