summaryrefslogtreecommitdiffstats
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
parent3a50c46d729158f8652e2a482db54076202dab4e (diff)
downloadFreeBSD-src-c76397ed098b28cafca09f0400e5c4958297a890.zip
FreeBSD-src-c76397ed098b28cafca09f0400e5c4958297a890.tar.gz
Add lgetfh(2) which is like getfh(2) but doesn't follow symlinks.
-rw-r--r--sys/kern/syscalls.master2
-rw-r--r--sys/kern/vfs_extattr.c38
-rw-r--r--sys/kern/vfs_syscalls.c38
3 files changed, 77 insertions, 1 deletions
diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master
index a5380b6..3f7ac04 100644
--- a/sys/kern/syscalls.master
+++ b/sys/kern/syscalls.master
@@ -247,7 +247,7 @@
157 COMPAT4 { int statfs(char *path, struct ostatfs *buf); }
158 COMPAT4 { int fstatfs(int fd, struct ostatfs *buf); }
159 UNIMPL nosys
-160 UNIMPL nosys
+160 STD { int lgetfh(char *fname, struct fhandle *fhp); }
161 STD { int getfh(char *fname, struct fhandle *fhp); }
162 MSTD { int getdomainname(char *domainname, int len); }
163 MSTD { int setdomainname(char *domainname, int len); }
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;
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 98e2b69..cf8e2a7 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.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