diff options
author | John Baldwin <jhb@FreeBSD.org> | 2005-02-07 21:46:43 +0000 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2005-02-07 21:46:43 +0000 |
commit | fee4a6af3a1e9b23b56f74a0e018b9c9f9d69fe4 (patch) | |
tree | 8c6a2a777387d07a00bc6d49209eb44568944332 /sys | |
parent | 5e85ac176f42b50a6ce833ac281416850a9f93f7 (diff) | |
download | src-fee4a6af3a1e9b23b56f74a0e018b9c9f9d69fe4.tar.gz src-fee4a6af3a1e9b23b56f74a0e018b9c9f9d69fe4.zip |
Implement a kern_pathconf() wrapper for pathconf() which can take the
filename from either a user space or a kernel space pointer.
Notes
Notes:
svn path=/head/; revision=141484
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/vfs_extattr.c | 18 | ||||
-rw-r--r-- | sys/kern/vfs_syscalls.c | 18 | ||||
-rw-r--r-- | sys/sys/syscallsubr.h | 2 |
3 files changed, 26 insertions, 12 deletions
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c index cfefd08d97ef..81a3235f3421 100644 --- a/sys/kern/vfs_extattr.c +++ b/sys/kern/vfs_extattr.c @@ -2223,22 +2223,28 @@ pathconf(td, uap) int name; } */ *uap; { - int error; + + return (kern_pathconf(td, uap->path, UIO_USERSPACE, uap->name)); +} + +int +kern_pathconf(struct thread *td, char *path, enum uio_seg pathseg, int name) +{ struct nameidata nd; - int vfslocked; + int error, vfslocked; - NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | NOOBJ | MPSAFE, UIO_USERSPACE, - uap->path, td); + NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | NOOBJ | MPSAFE, pathseg, path, + td); if ((error = namei(&nd)) != 0) return (error); vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); /* If asynchronous I/O is available, it works for all files. */ - if (uap->name == _PC_ASYNC_IO) + if (name == _PC_ASYNC_IO) td->td_retval[0] = async_io_version; else - error = VOP_PATHCONF(nd.ni_vp, uap->name, td->td_retval); + error = VOP_PATHCONF(nd.ni_vp, name, td->td_retval); vput(nd.ni_vp); VFS_UNLOCK_GIANT(vfslocked); return (error); diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index cfefd08d97ef..81a3235f3421 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -2223,22 +2223,28 @@ pathconf(td, uap) int name; } */ *uap; { - int error; + + return (kern_pathconf(td, uap->path, UIO_USERSPACE, uap->name)); +} + +int +kern_pathconf(struct thread *td, char *path, enum uio_seg pathseg, int name) +{ struct nameidata nd; - int vfslocked; + int error, vfslocked; - NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | NOOBJ | MPSAFE, UIO_USERSPACE, - uap->path, td); + NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | NOOBJ | MPSAFE, pathseg, path, + td); if ((error = namei(&nd)) != 0) return (error); vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); /* If asynchronous I/O is available, it works for all files. */ - if (uap->name == _PC_ASYNC_IO) + if (name == _PC_ASYNC_IO) td->td_retval[0] = async_io_version; else - error = VOP_PATHCONF(nd.ni_vp, uap->name, td->td_retval); + error = VOP_PATHCONF(nd.ni_vp, name, td->td_retval); vput(nd.ni_vp); VFS_UNLOCK_GIANT(vfslocked); return (error); diff --git a/sys/sys/syscallsubr.h b/sys/sys/syscallsubr.h index 74ee11eb21a3..a996ba718066 100644 --- a/sys/sys/syscallsubr.h +++ b/sys/sys/syscallsubr.h @@ -88,6 +88,8 @@ int kern_nanosleep(struct thread *td, struct timespec *rqt, struct timespec *rmt); int kern_open(struct thread *td, char *path, enum uio_seg pathseg, int flags, int mode); +int kern_pathconf(struct thread *td, char *path, enum uio_seg pathseg, + int name); int kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data); int kern_readlink(struct thread *td, char *path, enum uio_seg pathseg, |