summaryrefslogtreecommitdiff
path: root/kernel/fs
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/fs')
-rw-r--r--kernel/fs/vfs.c13
-rw-r--r--kernel/fs/vfs.h1
2 files changed, 14 insertions, 0 deletions
diff --git a/kernel/fs/vfs.c b/kernel/fs/vfs.c
index 9684a18..1f28f13 100644
--- a/kernel/fs/vfs.c
+++ b/kernel/fs/vfs.c
@@ -395,6 +395,19 @@ vfs_vm_object_t *vfs_get_vm_object(int fd, u64 length, u64 offset) {
return r;
}
+int vfs_dup(int fd) {
+ vfs_fd_t *ptr = get_vfs_fd(fd, NULL);
+ if (!ptr) {
+ return -EBADF;
+ }
+ int index;
+ if (!relist_add(&current_task->file_descriptors, ptr, &index)) {
+ return -EMFILE;
+ }
+ ptr->reference_count++;
+ return index;
+}
+
int vfs_dup2(int org_fd, int new_fd) {
if (org_fd == new_fd) {
return -EINVAL;
diff --git a/kernel/fs/vfs.h b/kernel/fs/vfs.h
index 396802b..e22897e 100644
--- a/kernel/fs/vfs.h
+++ b/kernel/fs/vfs.h
@@ -77,6 +77,7 @@ 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, u64 count, u64 offset);
vfs_vm_object_t *vfs_get_vm_object(int fd, u64 length, u64 offset);
+int vfs_dup(int fd);
int vfs_dup2(int org_fd, int new_fd);
vfs_inode_t *vfs_internal_open(const char *file);
int vfs_mkdir(const char *path, int mode);