diff --git a/sys/compat/cloudabi/cloudabi_fd.c b/sys/compat/cloudabi/cloudabi_fd.c index 5500e39..2f2725e 100644 --- a/sys/compat/cloudabi/cloudabi_fd.c +++ b/sys/compat/cloudabi/cloudabi_fd.c @@ -456,32 +456,19 @@ cloudabi_sys_fd_stat_get(struct thread *td, struct cloudabi_sys_fd_stat_get_args *uap) { cloudabi_fdstat_t fsb = {}; - struct filedesc *fdp; struct file *fp; - seq_t seq; cap_rights_t rights; + struct filecaps fcaps; int error, oflags; - bool modified; /* Obtain file descriptor properties. */ - fdp = td->td_proc->p_fd; - do { - error = fget_unlocked(fdp, uap->fd, cap_rights_init(&rights), - &fp, &seq); - if (error != 0) - return (error); - if (fp->f_ops == &badfileops) { - fdrop(fp, td); - return (EBADF); - } - - rights = *cap_rights(fdp, uap->fd); - oflags = OFLAGS(fp->f_flag); - fsb.fs_filetype = cloudabi_convert_filetype(fp); - - modified = fd_modified(fdp, uap->fd, seq); - fdrop(fp, td); - } while (modified); + error = fget_cap(td, uap->fd, cap_rights_init(&rights), &fp, + &fcaps); + if (error != 0) + return (error); + oflags = OFLAGS(fp->f_flag); + fsb.fs_filetype = cloudabi_convert_filetype(fp); + fdrop(fp, td); /* Convert file descriptor flags. */ if (oflags & O_APPEND) @@ -492,8 +479,9 @@ cloudabi_sys_fd_stat_get(struct thread *td, fsb.fs_flags |= CLOUDABI_FDFLAG_SYNC; /* Convert capabilities to CloudABI rights. */ - convert_capabilities(&rights, fsb.fs_filetype, + convert_capabilities(&fcaps.fc_rights, fsb.fs_filetype, &fsb.fs_rights_base, &fsb.fs_rights_inheriting); + filecaps_free(&fcaps); return (copyout(&fsb, (void *)uap->buf, sizeof(fsb))); }