diff options
author | dfr <dfr@FreeBSD.org> | 2004-04-05 10:15:53 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 2004-04-05 10:15:53 +0000 |
commit | c76397ed098b28cafca09f0400e5c4958297a890 (patch) | |
tree | 1051507c0ec6945698068c5fd9ac6e1d184eb71d /sys/kern/vfs_extattr.c | |
parent | 3a50c46d729158f8652e2a482db54076202dab4e (diff) | |
download | FreeBSD-src-c76397ed098b28cafca09f0400e5c4958297a890.zip FreeBSD-src-c76397ed098b28cafca09f0400e5c4958297a890.tar.gz |
Add lgetfh(2) which is like getfh(2) but doesn't follow symlinks.
Diffstat (limited to 'sys/kern/vfs_extattr.c')
-rw-r--r-- | sys/kern/vfs_extattr.c | 38 |
1 files changed, 38 insertions, 0 deletions
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; |