summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordzwdz2022-08-05 14:01:42 +0200
committerdzwdz2022-08-05 14:01:42 +0200
commit27124aab29d54ba9f228dee18a48e903e222812a (patch)
tree7e4848516eca5ad581cd2d5282d28797eae0472b /src
parent749a150e37fbfdaf33a8d6738e95306e6d95e8b5 (diff)
move path_simplify to shared code, move its tests to userland
Diffstat (limited to 'src')
-rw-r--r--src/kernel/syscalls.c2
-rw-r--r--src/kernel/tests/vfs.c63
-rw-r--r--src/kernel/vfs/path.h9
-rw-r--r--src/shared/include/camellia/path.h7
-rw-r--r--src/shared/path.c (renamed from src/kernel/vfs/path.c)7
-rw-r--r--src/user/app/tests/kernel/path.c66
-rw-r--r--src/user/app/tests/tests.c1
-rw-r--r--src/user/app/tests/tests.h1
8 files changed, 81 insertions, 75 deletions
diff --git a/src/kernel/syscalls.c b/src/kernel/syscalls.c
index 0ab6106..3096c42 100644
--- a/src/kernel/syscalls.c
+++ b/src/kernel/syscalls.c
@@ -1,3 +1,4 @@
+#include <camellia/path.h>
#include <camellia/errno.h>
#include <camellia/execbuf.h>
#include <camellia/flags.h>
@@ -8,7 +9,6 @@
#include <kernel/panic.h>
#include <kernel/pipe.h>
#include <kernel/proc.h>
-#include <kernel/vfs/path.h>
#include <shared/mem.h>
#include <stdint.h>
diff --git a/src/kernel/tests/vfs.c b/src/kernel/tests/vfs.c
index 7b353e8..9f7c6da 100644
--- a/src/kernel/tests/vfs.c
+++ b/src/kernel/tests/vfs.c
@@ -2,70 +2,8 @@
#include <kernel/tests/base.h>
#include <kernel/tests/tests.h>
#include <kernel/vfs/mount.h>
-#include <kernel/vfs/path.h>
#include <shared/mem.h>
-TEST(path_simplify) {
-#define TEST_WRAPPER(argument, result) do { \
- int len = path_simplify(argument, buf, sizeof(argument) - 1); \
- if (result == NULL) { \
- TEST_COND(len < 0); \
- } else { \
- if (len == sizeof(result) - 1) { \
- TEST_COND(0 == memcmp(result, buf, len)); \
- } else { \
- TEST_COND(false); \
- } \
- } \
- } while (0)
-
- char buf[256];
-
- // some easy cases first
- TEST_WRAPPER("/", "/");
- TEST_WRAPPER("/.", "/");
- TEST_WRAPPER("//", "/");
- TEST_WRAPPER("/asdf", "/asdf");
- TEST_WRAPPER("/asdf/", "/asdf/");
- TEST_WRAPPER("/asdf//", "/asdf/");
- TEST_WRAPPER("/asdf/./", "/asdf/");
- TEST_WRAPPER("/a/./b", "/a/b");
- TEST_WRAPPER("/a/./b/", "/a/b/");
-
- // some slightly less easy cases
- TEST_WRAPPER("/asdf/..", "/");
- TEST_WRAPPER("/asdf/../", "/");
- TEST_WRAPPER("/asdf/.", "/asdf/");
- TEST_WRAPPER("/asdf//.", "/asdf/");
-
- TEST_WRAPPER("/foo/bar/..", "/foo/");
- TEST_WRAPPER("/foo/bar/../baz", "/foo/baz");
- TEST_WRAPPER("/foo/bar/../baz/", "/foo/baz/");
- TEST_WRAPPER("/foo/bar/xyz/..", "/foo/bar/");
- TEST_WRAPPER("/foo/bar/xyz/../", "/foo/bar/");
-
- // going under the root or close to it
- TEST_WRAPPER("/..", NULL);
- TEST_WRAPPER("/../asdf", NULL);
- TEST_WRAPPER("/../asdf/", NULL);
- TEST_WRAPPER("/./a/../..", NULL);
- TEST_WRAPPER("/a/a/../..", "/");
- TEST_WRAPPER("/a/../a/..", "/");
- TEST_WRAPPER("/a/../../a", NULL);
- TEST_WRAPPER("/../a/../a", NULL);
- TEST_WRAPPER("/../../a/a", NULL);
- TEST_WRAPPER("/////../..", NULL);
- TEST_WRAPPER("//a//../..", NULL);
-
- // relative paths aren't allowed
- TEST_WRAPPER("relative", NULL);
- TEST_WRAPPER("some/stuff", NULL);
- TEST_WRAPPER("./stuff", NULL);
- TEST_WRAPPER("../stuff", NULL);
- TEST_WRAPPER("", NULL);
-#undef TEST_WRAPPER
-}
-
TEST(vfs_mount_resolve) {
struct vfs_mount *mount = NULL;
@@ -107,6 +45,5 @@ TEST(vfs_mount_resolve) {
}
void tests_vfs(void) {
- TEST_RUN(path_simplify);
TEST_RUN(vfs_mount_resolve);
}
diff --git a/src/kernel/vfs/path.h b/src/kernel/vfs/path.h
deleted file mode 100644
index 7484619..0000000
--- a/src/kernel/vfs/path.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#pragma once
-#include <camellia/path.h>
-#include <stddef.h>
-
-/** Reduce a path to its simplest form.
- *
- * @return length of the string in *out, always less than len. Negative if the path was invalid.
- */
-int path_simplify(const char *in, char *out, size_t len);
diff --git a/src/shared/include/camellia/path.h b/src/shared/include/camellia/path.h
index ba6bccf..8efa0d4 100644
--- a/src/shared/include/camellia/path.h
+++ b/src/shared/include/camellia/path.h
@@ -1,3 +1,10 @@
#pragma once
+#include <stddef.h>
#define PATH_MAX 512
+
+/** Reduce a path to its simplest form.
+ *
+ * @return length of the string in *out, always less than len. Negative if the path was invalid.
+ */
+int path_simplify(const char *in, char *out, size_t len);
diff --git a/src/kernel/vfs/path.c b/src/shared/path.c
index e8ce49c..9d2eda3 100644
--- a/src/kernel/vfs/path.c
+++ b/src/shared/path.c
@@ -1,6 +1,9 @@
-#include <kernel/panic.h>
-#include <kernel/vfs/path.h>
+#include <camellia/path.h>
#include <shared/mem.h>
+#include <stdbool.h>
+
+// TODO shared assert
+#define assert(...)
int path_simplify(const char *in, char *out, size_t len) {
if (len == 0) return -1; // empty paths are invalid
diff --git a/src/user/app/tests/kernel/path.c b/src/user/app/tests/kernel/path.c
new file mode 100644
index 0000000..bc87881
--- /dev/null
+++ b/src/user/app/tests/kernel/path.c
@@ -0,0 +1,66 @@
+#include "../tests.h"
+#include <camellia/path.h>
+#include <string.h>
+
+static void test_path_simplify(void) {
+ const char *testcases[][2] = {
+ {"/", "/"},
+ {"/.", "/"},
+ {"//", "/"},
+ {"/asdf", "/asdf"},
+ {"/asdf/", "/asdf/"},
+ {"/asdf//", "/asdf/"},
+ {"/asdf/./", "/asdf/"},
+ {"/a/./b", "/a/b"},
+ {"/a/./b/", "/a/b/"},
+
+ // some slightly less easy cases
+ {"/asdf/..", "/"},
+ {"/asdf/../", "/"},
+ {"/asdf/.", "/asdf/"},
+ {"/asdf//.", "/asdf/"},
+
+ {"/foo/bar/..", "/foo/"},
+ {"/foo/bar/../baz", "/foo/baz"},
+ {"/foo/bar/../baz/", "/foo/baz/"},
+ {"/foo/bar/xyz/..", "/foo/bar/"},
+ {"/foo/bar/xyz/../", "/foo/bar/"},
+
+ // going under the root or close to it
+ {"/..", NULL},
+ {"/../asdf", NULL},
+ {"/../asdf/", NULL},
+ {"/./a/../..", NULL},
+ {"/a/a/../..", "/"},
+ {"/a/../a/..", "/"},
+ {"/a/../../a", NULL},
+ {"/../a/../a", NULL},
+ {"/../../a/a", NULL},
+ {"/////../..", NULL},
+ {"//a//../..", NULL},
+
+ // relative paths aren't allowed
+ {"relative", NULL},
+ {"some/stuff", NULL},
+ {"./stuff", NULL},
+ {"../stuff", NULL},
+ {"", NULL},
+ };
+
+ char buf[256];
+ for (size_t i = 0; i < sizeof(testcases) / sizeof(testcases[0]); i++) {
+ const char *input = testcases[i][0];
+ const char *expected = testcases[i][1];
+ int len = path_simplify(input, buf, strlen(input));
+ if (expected == NULL) {
+ test(len < 0);
+ } else {
+ // TODO an argument for printing info on test failure
+ test(len == (int)strlen(expected) && !memcmp(expected, buf, len));
+ }
+ }
+}
+
+void r_k_path(void) {
+ run_test(test_path_simplify);
+}
diff --git a/src/user/app/tests/tests.c b/src/user/app/tests/tests.c
index 9cdf81c..2157e60 100644
--- a/src/user/app/tests/tests.c
+++ b/src/user/app/tests/tests.c
@@ -16,6 +16,7 @@ int main(void) {
r_k_fs();
r_k_misc();
r_k_miscsyscall();
+ r_k_path();
r_libc_esemaphore();
r_libc_string();
r_s_printf();
diff --git a/src/user/app/tests/tests.h b/src/user/app/tests/tests.h
index fadbc60..79169c9 100644
--- a/src/user/app/tests/tests.h
+++ b/src/user/app/tests/tests.h
@@ -10,6 +10,7 @@ void run_test(void (*fn)());
void r_k_fs(void);
void r_k_misc(void);
void r_k_miscsyscall(void);
+void r_k_path(void);
void r_libc_esemaphore(void);
void r_libc_string(void);
void r_s_printf(void);