summaryrefslogtreecommitdiff
path: root/kernel/fs/vfs.c
diff options
context:
space:
mode:
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;