summaryrefslogtreecommitdiff
path: root/kernel/fs/vfs.c
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2023-11-15 02:44:45 +0100
committerAnton Kling <anton@kling.gg>2023-11-15 21:40:13 +0100
commite22e493940266e0aa9be2bf58df1821a3539e19b (patch)
tree64d3516642fae984b5f801db3348d884f661731d /kernel/fs/vfs.c
parent6747f9407a061684c2fba837541c254f48bfcff0 (diff)
Kernel/LibC: Add chdir function and syscall
Diffstat (limited to 'kernel/fs/vfs.c')
-rw-r--r--kernel/fs/vfs.c21
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;