#include "../file.h" #include #include #include #include #include extern kern_status_t fs_msg_seek( xpc_context_t *xpc, const xpc_endpoint_t *sender, off_t rel_offset, int origin, int *out_err, off_t *out_new_pos, void *arg) { struct fs_context *ctx = arg; struct fs_file *f = fs_context_get_file(ctx, sender->e_port); if (!f) { *out_err = EBADF; return KERN_OK; } off_t new_offset = 0; switch (origin) { case SEEK_SET: new_offset = rel_offset; break; case SEEK_CUR: new_offset = f->f_seek + rel_offset; break; case SEEK_END: new_offset = f->f_inode->i_size + rel_offset; break; default: *out_err = EINVAL; return KERN_OK; } if (new_offset > f->f_inode->i_size) { *out_err = EINVAL; return KERN_OK; } f->f_seek = new_offset; *out_err = SUCCESS; *out_new_pos = new_offset; return KERN_OK; }