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 +++++++++++++++++++++ kernel/fs/vfs.h | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) (limited to 'kernel/fs') 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; diff --git a/kernel/fs/vfs.h b/kernel/fs/vfs.h index 3e3e1ff..b6a3401 100644 --- a/kernel/fs/vfs.h +++ b/kernel/fs/vfs.h @@ -79,7 +79,7 @@ void vfs_mount(char *path, vfs_inode_t *local_root); int vfs_pwrite(int fd, void *buf, u64 count, u64 offset); int raw_vfs_pwrite(vfs_fd_t *vfs_fd, void *buf, u64 count, u64 offset); int raw_vfs_pread(vfs_fd_t *vfs_fd, void *buf, u64 count, u64 offset); -int vfs_pread(int fd, void *buf, u32 count, u32 offset); +int vfs_pread(int fd, void *buf, u64 count, u64 offset); vfs_vm_object_t *vfs_get_vm_object(int fd, u64 length, u64 offset); int vfs_dup2(int org_fd, int new_fd); vfs_inode_t *vfs_internal_open(const char *file); -- cgit v1.2.3