From c76397ed098b28cafca09f0400e5c4958297a890 Mon Sep 17 00:00:00 2001 From: dfr Date: Mon, 5 Apr 2004 10:15:53 +0000 Subject: Add lgetfh(2) which is like getfh(2) but doesn't follow symlinks. --- sys/kern/vfs_extattr.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'sys/kern/vfs_extattr.c') diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c index 98e2b69..cf8e2a7 100644 --- a/sys/kern/vfs_extattr.c +++ b/sys/kern/vfs_extattr.c @@ -3824,6 +3824,44 @@ getvnode(fdp, fd, fpp) * Get (NFS) file handle */ #ifndef _SYS_SYSPROTO_H_ +struct lgetfh_args { + char *fname; + fhandle_t *fhp; +}; +#endif +int +lgetfh(td, uap) + struct thread *td; + register struct lgetfh_args *uap; +{ + struct nameidata nd; + fhandle_t fh; + register struct vnode *vp; + int error; + + /* + * Must be super user + */ + error = suser(td); + if (error) + return (error); + NDINIT(&nd, LOOKUP, NOFOLLOW | LOCKLEAF, UIO_USERSPACE, uap->fname, td); + error = namei(&nd); + if (error) + return (error); + NDFREE(&nd, NDF_ONLY_PNBUF); + vp = nd.ni_vp; + bzero(&fh, sizeof(fh)); + fh.fh_fsid = vp->v_mount->mnt_stat.f_fsid; + error = VFS_VPTOFH(vp, &fh.fh_fid); + vput(vp); + if (error) + return (error); + error = copyout(&fh, uap->fhp, sizeof (fh)); + return (error); +} + +#ifndef _SYS_SYSPROTO_H_ struct getfh_args { char *fname; fhandle_t *fhp; -- cgit v1.1