int __compat_fhstat(const struct compat_30_fhandle *fh, struct stat13 *ost) { struct stat nst; int ret; if ((ret = __fhstat50((const void *)fh, /* FHANDLE_SIZE_COMPAT */28, &nst)) == -1) return ret; cvtstat(ost, &nst); return ret; }
int __compat___stat13(const char *file, struct stat13 *ost) { struct stat nst; int ret; if ((ret = __stat50(file, &nst)) == -1) return ret; cvtstat(ost, &nst); return ret; }
int __compat___fstat13(int f, struct stat13 *ost) { struct stat nst; int ret; if ((ret = __fstat50(f, &nst)) == -1) return ret; cvtstat(ost, &nst); return ret; }
/* * dfbsd12_fstat_args(int fd, struct dfbsd12_stat *sb) * * MPALMOSTSAFE */ int sys_dfbsd12_fstat(struct dfbsd12_fstat_args *uap) { struct dfbsd12_stat ost; struct stat st; int error; get_mplock(); error = kern_fstat(uap->fd, &st); rel_mplock(); if (error == 0) { cvtstat(&ost, &st); error = copyout(&ost, uap->sb, sizeof(ost)); } return (error); }
/* ARGSUSED */ int compat_43_sys_stat(struct lwp *l, const struct compat_43_sys_stat_args *uap, register_t *retval) { /* { syscallarg(char *) path; syscallarg(struct stat43 *) ub; } */ struct stat sb; struct stat43 osb; int error; error = do_sys_stat(SCARG(uap, path), FOLLOW, &sb); if (error) return (error); cvtstat(&sb, &osb); error = copyout((void *)&osb, (void *)SCARG(uap, ub), sizeof (osb)); return (error); }
/* ARGSUSED */ int compat_43_sys_fstat(struct lwp *l, const struct compat_43_sys_fstat_args *uap, register_t *retval) { /* { syscallarg(int) fd; syscallarg(struct stat43 *) sb; } */ struct stat ub; struct stat43 oub; int error; error = do_sys_fstat(SCARG(uap, fd), &ub); if (error == 0) { cvtstat(&ub, &oub); error = copyout((void *)&oub, (void *)SCARG(uap, sb), sizeof (oub)); } return (error); }
/* * stat_args(char *path, struct dfbsd12_stat *ub) * * Get file status; this version follows links. * * MPALMOSTSAFE */ int sys_dfbsd12_stat(struct dfbsd12_stat_args *uap) { struct nlookupdata nd; struct dfbsd12_stat ost; struct stat st; int error; get_mplock(); error = nlookup_init(&nd, uap->path, UIO_USERSPACE, NLC_FOLLOW); if (error == 0) { error = kern_stat(&nd, &st); if (error == 0) { cvtstat(&ost, &st); error = copyout(&ost, uap->ub, sizeof(ost)); } } nlookup_done(&nd); rel_mplock(); return (error); }
/* * fhstat_args(struct fhandle *u_fhp, struct dfbsd12_stat *sb) * * MPALMOSTSAFE */ int sys_dfbsd12_fhstat(struct dfbsd12_fhstat_args *uap) { struct thread *td = curthread; struct dfbsd12_stat osb; struct stat sb; fhandle_t fh; struct mount *mp; struct vnode *vp; int error; /* * Must be super user */ error = priv_check(td, PRIV_ROOT); if (error) return (error); error = copyin(uap->u_fhp, &fh, sizeof(fhandle_t)); if (error) return (error); get_mplock(); if ((mp = vfs_getvfs(&fh.fh_fsid)) == NULL) { error = ESTALE; goto done; } if ((error = VFS_FHTOVP(mp, NULL, &fh.fh_fid, &vp))) goto done; error = vn_stat(vp, &sb, td->td_ucred); vput(vp); if (error) goto done; cvtstat(&osb, &sb); error = copyout(&osb, uap->sb, sizeof(osb)); done: rel_mplock(); return (error); }
/* ARGSUSED */ int compat_43_sys_lstat(struct lwp *l, const struct compat_43_sys_lstat_args *uap, register_t *retval) { /* { syscallarg(char *) path; syscallarg(struct ostat *) ub; } */ struct vnode *vp, *dvp; struct stat sb, sb1; struct stat43 osb; int error; struct pathbuf *pb; struct nameidata nd; int ndflags; error = pathbuf_copyin(SCARG(uap, path), &pb); if (error) { return error; } ndflags = NOFOLLOW | LOCKLEAF | LOCKPARENT | TRYEMULROOT; again: NDINIT(&nd, LOOKUP, ndflags, pb); if ((error = namei(&nd))) { if (error == EISDIR && (ndflags & LOCKPARENT) != 0) { /* * Should only happen on '/'. Retry without LOCKPARENT; * this is safe since the vnode won't be a VLNK. */ ndflags &= ~LOCKPARENT; goto again; } pathbuf_destroy(pb); return (error); } /* * For symbolic links, always return the attributes of its * containing directory, except for mode, size, and links. */ vp = nd.ni_vp; dvp = nd.ni_dvp; pathbuf_destroy(pb); if (vp->v_type != VLNK) { if ((ndflags & LOCKPARENT) != 0) { if (dvp == vp) vrele(dvp); else vput(dvp); } error = vn_stat(vp, &sb); vput(vp); if (error) return (error); } else { error = vn_stat(dvp, &sb); vput(dvp); if (error) { vput(vp); return (error); } error = vn_stat(vp, &sb1); vput(vp); if (error) return (error); sb.st_mode &= ~S_IFDIR; sb.st_mode |= S_IFLNK; sb.st_nlink = sb1.st_nlink; sb.st_size = sb1.st_size; sb.st_blocks = sb1.st_blocks; } cvtstat(&sb, &osb); error = copyout((void *)&osb, (void *)SCARG(uap, ub), sizeof (osb)); return (error); }