From 0876ffb05e6973601ef1e930f1ed8d939666132a Mon Sep 17 00:00:00 2001 From: dzwdz Date: Thu, 26 Aug 2021 22:05:06 +0200 Subject: separate mount resolving into vfs_mount_resolve --- src/kernel/syscalls.c | 18 ++---------------- src/kernel/vfs/mount.c | 13 +++++++++++++ src/kernel/vfs/mount.h | 3 +++ 3 files changed, 18 insertions(+), 16 deletions(-) (limited to 'src/kernel') diff --git a/src/kernel/syscalls.c b/src/kernel/syscalls.c index 1c0a687..19499d1 100644 --- a/src/kernel/syscalls.c +++ b/src/kernel/syscalls.c @@ -68,7 +68,7 @@ int _syscall_fork(void) { fd_t _syscall_fs_open(const user_ptr path, int len) { struct virt_iter iter; - struct vfs_mount *mount = process_current->mount; + struct vfs_mount *mount; static char buffer[PATH_MAX]; // holds the path int fd, res; @@ -90,21 +90,7 @@ fd_t _syscall_fs_open(const user_ptr path, int len) { len = path_simplify(buffer, buffer, len); if (len < 0) return -1; - // find mount - for (mount = process_current->mount; mount; mount = mount->prev) { - if (mount->prefix_len > len) - continue; - if (memcmp(mount->prefix, buffer, mount->prefix_len) == 0) - break; - } - - tty_write(buffer + mount->prefix_len, len - mount->prefix_len); - tty_const(" from mount "); - if (mount) - tty_write(mount->prefix, mount->prefix_len); - else - tty_const("[none]"); - + mount = vfs_mount_resolve(process_current->mount, buffer, len); if (!mount) return -1; res = fdop_dispatch((struct fdop_args){ diff --git a/src/kernel/vfs/mount.c b/src/kernel/vfs/mount.c index be33b6b..bf98957 100644 --- a/src/kernel/vfs/mount.c +++ b/src/kernel/vfs/mount.c @@ -1,4 +1,5 @@ #include +#include #include struct vfs_mount *vfs_mount_seed(void) { @@ -13,3 +14,15 @@ struct vfs_mount *vfs_mount_seed(void) { }; return mount; } + +struct vfs_mount *vfs_mount_resolve( + struct vfs_mount *top, const char *path, size_t path_len) +{ + for (; top; top = top->prev) { + if (top->prefix_len > path_len) + continue; + if (memcmp(top->prefix, path, top->prefix_len) == 0) + break; + } + return top; +} diff --git a/src/kernel/vfs/mount.h b/src/kernel/vfs/mount.h index 982f951..51990a1 100644 --- a/src/kernel/vfs/mount.h +++ b/src/kernel/vfs/mount.h @@ -10,3 +10,6 @@ struct vfs_mount { // prepares init's filesystem view struct vfs_mount *vfs_mount_seed(void); +struct vfs_mount *vfs_mount_resolve( + struct vfs_mount *top, const char *path, size_t path_len); + -- cgit v1.2.3