aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2005-02-07 21:46:43 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2005-02-07 21:46:43 +0000
commitfee4a6af3a1e9b23b56f74a0e018b9c9f9d69fe4 (patch)
tree8c6a2a777387d07a00bc6d49209eb44568944332 /sys
parent5e85ac176f42b50a6ce833ac281416850a9f93f7 (diff)
downloadsrc-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.c18
-rw-r--r--sys/kern/vfs_syscalls.c18
-rw-r--r--sys/sys/syscallsubr.h2
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,