diff options
author | Anton Kling <anton@kling.gg> | 2023-11-15 02:44:45 +0100 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2023-11-15 21:40:13 +0100 |
commit | e22e493940266e0aa9be2bf58df1821a3539e19b (patch) | |
tree | 64d3516642fae984b5f801db3348d884f661731d /kernel/fs/vfs.c | |
parent | 6747f9407a061684c2fba837541c254f48bfcff0 (diff) |
Kernel/LibC: Add chdir function and syscall
Diffstat (limited to 'kernel/fs/vfs.c')
-rw-r--r-- | kernel/fs/vfs.c | 21 |
1 files changed, 21 insertions, 0 deletions
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; |