diff options
author | Ian Moffett <ian@osmora.org> | 2025-06-11 16:52:37 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-06-11 16:52:37 -0400 |
commit | 7c97679b9f1e688e43907674b269b1bda72db3be (patch) | |
tree | 7b4398f100381820bd20de7b610c380739e97941 /sys/kern | |
parent | 98633fce13d437eacf9245c34687551b38548481 (diff) |
kernel: filedesc: Add fd_seek() as kernel lseek()
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_descrip.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index 1992d46..1737b53 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -296,3 +296,38 @@ fd_dup(int fd) new_desc->vp = tmp->vp; return new_desc->fdno; } + +off_t +fd_seek(int fildes, off_t offset, int whence) +{ + struct filedesc *tmp; + struct vattr attr; + struct vop_getattr_args getattr_args; + + tmp = fd_get(fildes); + if (tmp == NULL) { + return -EBADF; + } + + getattr_args.vp = tmp->vp; + getattr_args.res = &attr; + if ((vfs_vop_getattr(tmp->vp, &getattr_args)) < 0) { + return -EPIPE; + } + + switch (whence) { + case SEEK_SET: + tmp->offset = offset; + break; + case SEEK_CUR: + tmp->offset += offset; + break; + case SEEK_END: + tmp->offset = attr.size + offset; + break; + default: + return -EINVAL; + } + + return 0; +} |