summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_extattr.c
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>2004-04-05 10:15:53 +0000
committerdfr <dfr@FreeBSD.org>2004-04-05 10:15:53 +0000
commitc76397ed098b28cafca09f0400e5c4958297a890 (patch)
tree1051507c0ec6945698068c5fd9ac6e1d184eb71d /sys/kern/vfs_extattr.c
parent3a50c46d729158f8652e2a482db54076202dab4e (diff)
downloadFreeBSD-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.c38
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;
OpenPOWER on IntegriCloud