From e22e493940266e0aa9be2bf58df1821a3539e19b Mon Sep 17 00:00:00 2001 From: Anton Kling Date: Wed, 15 Nov 2023 02:44:45 +0100 Subject: Kernel/LibC: Add chdir function and syscall --- kernel/fs/vfs.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'kernel/fs/vfs.c') diff --git a/kernel/fs/vfs.c b/kernel/fs/vfs.c index 0911c95..8c9e08d 100644 --- a/kernel/fs/vfs.c +++ b/kernel/fs/vfs.c @@ -168,6 +168,27 @@ int vfs_fstat(int fd, struct stat *buf) { return fd_ptr->inode->stat(fd_ptr, buf); } +int vfs_chdir(const char *path) { + char tmp_path[256]; + char *resolved_path = vfs_resolve_path(path, tmp_path); + { + int tmp_fd = vfs_open(resolved_path, O_READ, 0); + if (0 > tmp_fd) + return tmp_fd; + struct stat stat_result; + vfs_fstat(tmp_fd, &stat_result); + if (STAT_DIR != stat_result.st_mode) { + kprintf("vfs_chdir: -ENOTDIR\n"); + return -ENOTDIR; + } + vfs_close(tmp_fd); + } + strcpy(get_current_task()->current_working_directory, resolved_path); + if ('/' != resolved_path[strlen(resolved_path)]) + strcat(get_current_task()->current_working_directory, "/"); + return 0; +} + int vfs_mkdir(const char *path, int mode) { vfs_mounts_t *file_mount = 0; int length = 0; -- cgit v1.2.3