diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1999-06-07 07:17:57 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1999-06-07 07:17:57 +0000 |
commit | 4e96377228ca04c54bdc4aec8116d85f74e15834 (patch) | |
tree | 2bc8d849fde3727add9392d8f2a95f71c02fed16 /sys/kern | |
parent | a7879e1dacba108b617cc911081400e53cca0155 (diff) |
replacement pipe() system call; copies data into place inside kernel, so
that EFAULT return value is possible
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/sys_pipe.c | 4 | ||||
-rw-r--r-- | sys/kern/syscalls.master | 5 | ||||
-rw-r--r-- | sys/kern/uipc_syscalls.c | 30 |
3 files changed, 33 insertions, 6 deletions
diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c index ebc661bb095..f14e55a005f 100644 --- a/sys/kern/sys_pipe.c +++ b/sys/kern/sys_pipe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sys_pipe.c,v 1.12 1999/06/07 01:41:01 deraadt Exp $ */ +/* $OpenBSD: sys_pipe.c,v 1.13 1999/06/07 07:17:42 deraadt Exp $ */ /* * Copyright (c) 1996 John S. Dyson @@ -156,7 +156,7 @@ int #if defined(__FreeBSD__) pipe(p, uap, retval) #else /* (__NetBSD__) || (__OpenBSD__) */ -sys_pipe(p, v, retval) +sys_opipe(p, v, retval) #endif struct proc *p; void *v; diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index 58e865bef0f..f3bbc850c38 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -1,4 +1,4 @@ -; $OpenBSD: syscalls.master,v 1.36 1999/05/31 17:34:47 millert Exp $ +; $OpenBSD: syscalls.master,v 1.37 1999/06/07 07:17:42 deraadt Exp $ ; $NetBSD: syscalls.master,v 1.32 1996/04/23 10:24:21 mycroft Exp $ ; @(#)syscalls.master 8.2 (Berkeley) 1/13/94 @@ -107,7 +107,7 @@ 40 COMPAT_43 { int sys_lstat(char *path, \ struct ostat *ub); } olstat 41 STD { int sys_dup(int fd); } -42 STD { int sys_pipe(void); } +42 STD { int sys_opipe(void); } 43 STD { gid_t sys_getegid(void); } 44 STD { int sys_profil(caddr_t samples, size_t size, \ u_long offset, u_int scale); } @@ -519,3 +519,4 @@ 261 STD { int sys_statfs(const char *path, \ struct statfs *buf); } 262 STD { int sys_fstatfs(int fd, struct statfs *buf); } +263 STD { int sys_pipe(int *fdp); } diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index cff7ebce68b..99a511eaf34 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uipc_syscalls.c,v 1.21 1999/06/07 01:40:01 deraadt Exp $ */ +/* $OpenBSD: uipc_syscalls.c,v 1.22 1999/06/07 07:17:42 deraadt Exp $ */ /* $NetBSD: uipc_syscalls.c,v 1.19 1996/02/09 19:00:48 christos Exp $ */ /* @@ -835,10 +835,36 @@ sys_getsockopt(p, v, retval) return (error); } +int +sys_pipe(p, v, retval) + struct proc *p; + void *v; + register_t *retval; +{ + register struct filedesc *fdp = p->p_fd; + register struct sys_pipe_args /* { + syscallarg(int *) fdp; + } */ *uap = v; + int error; + + if ((error = sys_opipe(p, v, retval)) == -1) + return (error); + + error = copyout((caddr_t)retval, (caddr_t)SCARG(uap, fdp), + 2 * sizeof (int)); + if (error) { + ffree(fdp->fd_ofiles[retval[0]]); + fdp->fd_ofiles[retval[0]] = NULL; + ffree(fdp->fd_ofiles[retval[1]]); + fdp->fd_ofiles[retval[1]] = NULL; + } + return (error); +} + #ifdef OLD_PIPE /* ARGSUSED */ int -sys_pipe(p, v, retval) +sys_opipe(p, v, retval) struct proc *p; void *v; register_t *retval; |