blob: 3e38822d30a8a56429393d2e27e599b412659bbc (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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;
}
|