[or-cvs] [tor/master 1/6] Support mutli-line torrc options via the usual backslash syntax

nickm at torproject.org nickm at torproject.org
Fri Sep 24 17:48:50 UTC 2010


Author: Nick Mathewson <nickm at torproject.org>
Date: Fri, 10 Sep 2010 09:19:10 -0400
Subject: Support mutli-line torrc options via the usual backslash syntax
Commit: 07049b3d25cbc397dd39c71d32422bfd7c39d814

---
 changes/torrc_continuation |    5 +++++
 src/common/util.c          |   22 +++++++++++++++++++++-
 src/test/test_util.c       |   20 ++++++++++++++++++++
 3 files changed, 46 insertions(+), 1 deletions(-)
 create mode 100644 changes/torrc_continuation

diff --git a/changes/torrc_continuation b/changes/torrc_continuation
new file mode 100644
index 0000000..f40e970
--- /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 1d77045..6b9455d 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 8a13597..84bb5a6 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);
-- 
1.7.1




More information about the tor-commits mailing list