diff options
author | Anton Kling <anton@kling.gg> | 2023-10-24 14:10:07 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2023-10-24 14:10:07 +0200 |
commit | 2292b11e82a3d6d70e7bb932c512155dc13c5025 (patch) | |
tree | da7d90e778495bc9a67ee0e09b32813c11dc6fe5 /fs/vfs.c | |
parent | e93a49d1eadf4a4b36369e67f112f8c45a0d567e (diff) |
VFS/LibC: Create ftruncate function and corresponding syscall and libc implementation
Previously this function was only used for shared memory region created
by shm_open because I was lazy. Now exists for all files.
Diffstat (limited to 'fs/vfs.c')
-rw-r--r-- | fs/vfs.c | 19 |
1 files changed, 18 insertions, 1 deletions
@@ -32,7 +32,8 @@ vfs_inode_t *vfs_create_inode( void (*close)(vfs_fd_t *fd), int (*create_directory)(const char *path, int mode), vfs_vm_object_t *(*get_vm_object)(uint64_t length, uint64_t offset, - vfs_fd_t *fd)) { + vfs_fd_t *fd), + int (*truncate)(vfs_fd_t *fd, size_t length)) { vfs_inode_t *r = kmalloc(sizeof(inode_t)); r->inode_num = inode_num; r->type = type; @@ -48,6 +49,7 @@ vfs_inode_t *vfs_create_inode( r->close = close; r->create_directory = create_directory; r->get_vm_object = get_vm_object; + r->truncate = truncate; return r; } @@ -291,6 +293,21 @@ int vfs_dup2(int org_fd, int new_fd) { return 1; } +int vfs_ftruncate(int fd, size_t length) { + vfs_fd_t *fd_ptr = get_vfs_fd(fd); + if (!fd_ptr) + return -EBADF; + if (!(fd_ptr->flags & O_READ)) + return -EINVAL; + vfs_inode_t *inode = fd_ptr->inode; + if (!inode) + return -EINVAL; + if (!inode->truncate) + return -EINVAL; + + return inode->truncate(fd_ptr, length); +} + void vfs_mount(char *path, vfs_inode_t *local_root) { int len = strlen(path); mounts[num_mounts].path = kmalloc_eternal(len + 1); |