diff options
author | Anton Kling <anton@kling.gg> | 2024-04-29 22:00:55 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-04-29 22:00:55 +0200 |
commit | 231301a6190605bd3ced4d961ee0d5d3fcd49d65 (patch) | |
tree | 8af67c28f9b638393f700fbaf2c9e33fd97a8b46 /kernel/syscalls/lseek.c | |
parent | 7d2ab3a71f4bda9d8ee997764d98b29e13a902c5 (diff) |
Kernel/IRC: Add setsockopt and move IRC client to use new socket interface
Diffstat (limited to 'kernel/syscalls/lseek.c')
-rw-r--r-- | kernel/syscalls/lseek.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/kernel/syscalls/lseek.c b/kernel/syscalls/lseek.c new file mode 100644 index 0000000..3e38822 --- /dev/null +++ b/kernel/syscalls/lseek.c @@ -0,0 +1,34 @@ +#include <assert.h> +#include <errno.h> +#include <fs/vfs.h> + +// FIXME: These should be in a shared header file with libc +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 + +off_t syscall_lseek(int fd, off_t offset, int whence) { + vfs_fd_t *fd_ptr = get_vfs_fd(fd, NULL); + if (!fd_ptr) { + return -EBADF; + } + + off_t ret_offset = fd_ptr->offset; + switch (whence) { + case SEEK_SET: + ret_offset = offset; + break; + case SEEK_CUR: + ret_offset += offset; + break; + case SEEK_END: + assert(fd_ptr->inode); + ret_offset = fd_ptr->inode->file_size + offset; + break; + default: + return -EINVAL; + break; + } + fd_ptr->offset = ret_offset; + return ret_offset; +} |