diff options
-rw-r--r-- | sys/kern/syscalls.master | 2 | ||||
-rw-r--r-- | sys/kern/vfs_extattr.c | 38 | ||||
-rw-r--r-- | sys/kern/vfs_syscalls.c | 38 |
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; |