allow hierachic filenames, this changes the FETCH syntax, the listname now has to...
authorChristian Thaeter <ct@pipapo.org>
Mon, 29 Oct 2007 13:29:49 +0000 (14:29 +0100)
committerChristian Thaeter <ct@pipapo.org>
Mon, 29 Oct 2007 13:29:49 +0000 (14:29 +0100)
src/rxpd.h
src/rxpd_connection_cmd.c
src/rxpd_file.c
tests/30listmanipulation.tests
tests/50listsyncronization.tests

index 5c51138..69e2889 100644 (file)
@@ -73,7 +73,7 @@ enum rxpd_cmd_e {RXPD_COMMANDS};
  * for finer control use policies, note that this are arbitary
  * decisions also reserving some chars for later extension
  */
-#define RXPD_FILE_ILG_CHARS "@&?<>|/: \t\n\r*?\\"
+#define RXPD_FILE_ILG_CHARS "&?<>|: \t\n\r*?\\"
 
 /*
  * Call a cooperative pth_yield every this much expensive interations
index f88f7e3..3ef7c92 100644 (file)
@@ -270,7 +270,7 @@ rxpd_connection_cmd_FETCH (struct rxpd_connection* self)
     {
       /* parse line */
 
-      char* list = strrchr (line, '/');
+      char* list = strrchr (line, ':');
       if (!list)
         goto esyntax;
 
index 1b04086..daa6435 100644 (file)
@@ -27,8 +27,13 @@ rxpd_file_new (struct rxpd_base* base, const char* filename)
   char buf[4096];
   struct rxpd_file* self = NULL;
 
+  while (*filename == '/')
+    ++filename;
+
   if (!filename ||
       strcspn(filename, RXPD_FILE_ILG_CHARS) != strlen (filename) ||
+      strstr (filename, "../") ||
+      strstr (filename, "/./") ||
       strlen (filename) + strlen (base->basedir) > 4095)
     {
       rxpd_log (base, LOG_ERR, "illegal filename: '%s'\n", filename?filename:"");
@@ -44,12 +49,7 @@ rxpd_file_new (struct rxpd_base* base, const char* filename)
   self->base = base;
   pth_rwlock_init (&self->lock);
 
-  const char* basename = strrchr (filename, '/');
-  if (basename)
-    ++basename;
-  else
-    basename = filename;
-  psplay_init (&self->node, basename);
+  psplay_init (&self->node, filename + strlen (base->basedir));
   llist_init (&self->rules);
 
   psplay_insert (&base->files, &self->node);
@@ -138,7 +138,18 @@ rxpd_file_load (struct rxpd_file* self)
 int
 rxpd_file_save (struct rxpd_file* self)
 {
-  FILE* f = fopen (self->filename, "w");
+  char* filename = strdupa (self->filename);
+
+  char* slash = filename;
+
+  while ((slash = strchr (slash+1, '/')))
+    {
+      *slash = '\0';
+      mkdir(filename, 0777);
+      *slash = '/';
+    }
+
+  FILE* f = fopen (filename, "w");
   // TODO error handling
   if (f)
     {
@@ -157,12 +168,12 @@ rxpd_file_save (struct rxpd_file* self)
 
       pth_rwlock_release (&self->lock);
       fclose (f);
-      rxpd_log (self->base, LOG_NOTICE, "saved '%s'\n", self->filename);
+      rxpd_log (self->base, LOG_NOTICE, "saved '%s'\n", filename);
       return 1;
     }
   else
     {
-      rxpd_log (self->base, LOG_ERR, "failed saving '%s'\n", self->filename);
+      rxpd_log (self->base, LOG_ERR, "failed saving '%s'\n", filename);
       return 0;
     }
 }
index aad3be1..cbf92ef 100644 (file)
@@ -14,8 +14,13 @@ function rxpd_client()
 TESTING "list manipulation tests" rxpd_client
 
 
+TEST "illegal filename" <<END
+in: APPEND:dir/../test
+out: #ERROR: illegal filename
+END
+
 TEST "append to list 1" <<END
-in: APPEND:test
+in: APPEND:dir/test
 in: # test list line 1
 in: # test list line 2
 in: #EXIT:
@@ -23,14 +28,14 @@ out: #OK:
 END
 
 TEST "append to list 1, check" <<END
-in: DUMP:test
+in: DUMP:dir/test
 out: # test list line 1
 out: # test list line 2
 END
 
 
 TEST "append to list 2" <<END
-in: APPEND:test
+in: APPEND:dir/test
 in: # test list line 3
 in: # test list line 4
 in: #EXIT:
@@ -38,7 +43,7 @@ out: #OK:
 END
 
 TEST "append to list 2, check" <<END
-in: DUMP:test
+in: DUMP:dir/test
 out: # test list line 1
 out: # test list line 2
 out: # test list line 3
@@ -47,7 +52,7 @@ END
 
 
 TEST "prepend to list 1" <<END
-in: PREPEND:test
+in: PREPEND:dir/test
 in: # test list line -2
 in: # test list line -1
 in: #EXIT:
@@ -55,7 +60,7 @@ out: #OK:
 END
 
 TEST "prepend to list 1, check" <<END
-in: DUMP:test
+in: DUMP:dir/test
 out: # test list line -2
 out: # test list line -1
 out: # test list line 1
@@ -66,7 +71,7 @@ END
 
 
 TEST "prepend to list 2" <<END
-in: PREPEND:test
+in: PREPEND:dir/test
 in: # test list line -4
 in: # test list line -3
 in: #EXIT:
@@ -74,7 +79,7 @@ out: #OK:
 END
 
 TEST "prepend to list 2, check" <<END
-in: DUMP:test
+in: DUMP:dir/test
 out: # test list line -4
 out: # test list line -3
 out: # test list line -2
@@ -87,7 +92,7 @@ END
 
 
 TEST "remove lines" <<END
-in: REMOVE:test
+in: REMOVE:dir/test
 in: # test list line -2
 in: # test list line 2
 in: #EXIT:
@@ -96,7 +101,7 @@ out: #OK:
 END
 
 TEST "remove lines, check" <<END
-in: DUMP:test
+in: DUMP:dir/test
 out: # test list line -4
 out: # test list line -3
 out: # test list line -1
@@ -107,14 +112,14 @@ END
 
 
 TEST "remove nonexisting line" <<END
-in: REMOVE:test
+in: REMOVE:dir/test
 in: # test list line 2
 in: #EXIT:
 out: #ERROR: line not found
 END
 
 TEST "replace nonexisting line" <<END
-in: REPLACE:test
+in: REPLACE:dir/test
 in: # test list line 2
 in: # test list line new
 in: #EXIT:
@@ -123,7 +128,7 @@ END
 
 
 TEST "replace lines" <<END
-in: REPLACE:test
+in: REPLACE:dir/test
 in: # test list line -3
 in: # test list line -3
 in: # test list line -2
@@ -132,7 +137,7 @@ out: #OK:
 END
 
 TEST "replace lines, check" <<END
-in: DUMP:test
+in: DUMP:dir/test
 out: # test list line -4
 out: # test list line -3
 out: # test list line -2
@@ -144,27 +149,27 @@ END
 
 
 TEST "save file" <<END
-in: SAVE:test
+in: SAVE:dir/test
 out: #OK:
 END
 
 TEST "delete list" <<END
-in: DELETE:test
+in: DELETE:dir/test
 out: #OK:
 END
 
 TEST "delete list, check" <<END
-in: DUMP:test
+in: DUMP:dir/test
 out: #OK:
 END
 
 TEST "load file" <<END
-in: LOAD:test
+in: LOAD:dir/test
 out: #OK:
 END
 
 TEST "load file, check" <<END
-in: DUMP:test
+in: DUMP:dir/test
 out: # test list line -4
 out: # test list line -3
 out: # test list line -2
@@ -175,7 +180,7 @@ out: # test list line 4
 END
 
 TEST "filter, add activateable rule" <<END
-in: APPEND:test
+in: APPEND:dir/test
 in: #something: # test list line 5
 in: #EXIT:
 out: #OK:
@@ -191,14 +196,14 @@ out: #OK:
 END
 
 TEST "filter, run" <<END
-in: FILTER:test
+in: FILTER:dir/test
 in: filter
 in: #EXIT:
 out: #OK:
 END
 
 TEST "filter, check" <<END
-in: DUMP:test
+in: DUMP:dir/test
 out: # test list line -4
 out: # test list line -3
 out: # test list line -2
index 421ec5e..dc47b7b 100644 (file)
@@ -15,7 +15,7 @@ TESTING "list syncronization tests" rxpd_client
 
 TEST "copy a list" <<END
 in: FETCH:test
-in: 127.0.0.1:$port/policy
+in: 127.0.0.1:$port:policy
 out: #OK:
 END
 
@@ -40,7 +40,7 @@ END
 
 TEST "copy a list for syncing" <<END
 in: FETCH:test
-in: 127.0.0.1:$port/example
+in: 127.0.0.1:$port:example
 out: #OK:
 END