VFS: implement pipe2

Change-Id: Iedc8042dd73a903456b25ba665d12577f5589ca2
This commit is contained in:
Thomas Veerman 2013-02-25 14:45:22 +00:00
parent fa78dc389f
commit 473547c777
14 changed files with 91 additions and 110 deletions

View file

@ -1476,6 +1476,7 @@
./usr/man/man2/open.2 minix-sys ./usr/man/man2/open.2 minix-sys
./usr/man/man2/pause.2 minix-sys ./usr/man/man2/pause.2 minix-sys
./usr/man/man2/pipe.2 minix-sys ./usr/man/man2/pipe.2 minix-sys
./usr/man/man2/pipe2.2 minix-sys
./usr/man/man2/ptrace.2 minix-sys ./usr/man/man2/ptrace.2 minix-sys
./usr/man/man2/read.2 minix-sys ./usr/man/man2/read.2 minix-sys
./usr/man/man2/readlink.2 minix-sys ./usr/man/man2/readlink.2 minix-sys

View file

@ -55,6 +55,7 @@
#define IOCTL 54 #define IOCTL 54
#define FCNTL 55 #define FCNTL 55
#define FS_READY 57 #define FS_READY 57
#define PIPE2 58
#define EXEC 59 #define EXEC 59
#define UMASK 60 #define UMASK 60
#define CHROOT 61 #define CHROOT 61

View file

@ -377,8 +377,8 @@ int initgroups(const char *, gid_t);
int iruserok(uint32_t, int, const char *, const char *); int iruserok(uint32_t, int, const char *, const char *);
int issetugid(void); int issetugid(void);
int nfssvc(int, void *); int nfssvc(int, void *);
#ifndef __minix
int pipe2(int *, int); int pipe2(int *, int);
#ifndef __minix
int profil(char *, size_t, u_long, u_int); int profil(char *, size_t, u_long, u_int);
#endif /* !__minix */ #endif /* !__minix */
#ifndef __PSIGNAL_DECLARED #ifndef __PSIGNAL_DECLARED

View file

@ -106,8 +106,8 @@ SUBDIR+= pkgconfig
.include "${.CURDIR}/sys-minix/Makefile.inc" .include "${.CURDIR}/sys-minix/Makefile.inc"
.else .else
.include "${.CURDIR}/tls/Makefile.inc" .include "${.CURDIR}/tls/Makefile.inc"
.include "${.CURDIR}/sys/Makefile.inc"
.endif .endif
.include "${.CURDIR}/sys/Makefile.inc"
.include "${.CURDIR}/uuid/Makefile.inc" .include "${.CURDIR}/uuid/Makefile.inc"
.if (${MKYP} != "no") .if (${MKYP} != "no")
.include "${.CURDIR}/yp/Makefile.inc" .include "${.CURDIR}/yp/Makefile.inc"

View file

@ -57,6 +57,7 @@
#define inet_aton _inet_aton #define inet_aton _inet_aton
#define inet_pton _inet_pton #define inet_pton _inet_pton
#define pipe _pipe #define pipe _pipe
#define pipe2 _pipe2
#define sbrk _sbrk #define sbrk _sbrk
#define strerror_r _strerror_r #define strerror_r _strerror_r
#define strlcat _strlcat #define strlcat _strlcat

View file

@ -6,15 +6,29 @@
#ifdef __weak_alias #ifdef __weak_alias
__weak_alias(pipe, _pipe) __weak_alias(pipe, _pipe)
__weak_alias(pipe2, _pipe2)
#endif #endif
int pipe(fild) int
int fild[2]; pipe(int fild[2])
{ {
message m; message m;
if (_syscall(VFS_PROC_NR, PIPE, &m) < 0) return(-1); if (_syscall(VFS_PROC_NR, PIPE, &m) < 0) return(-1);
fild[0] = m.m1_i1; fild[0] = m.m1_i1;
fild[1] = m.m1_i2; fild[1] = m.m1_i2;
return(0); return(0);
}
int
pipe2(int fild[2], int flags)
{
message m;
m.m1_i3 = flags;
if (_syscall(VFS_PROC_NR, PIPE2, &m) < 0) return(-1);
fild[0] = m.m1_i1;
fild[1] = m.m1_i2;
return(0);
} }

View file

@ -1,6 +1,9 @@
# $NetBSD: Makefile.inc,v 1.217 2012/10/02 01:46:40 christos Exp $ # $NetBSD: Makefile.inc,v 1.217 2012/10/02 01:46:40 christos Exp $
# @(#)Makefile.inc 8.3 (Berkeley) 10/24/94 # @(#)Makefile.inc 8.3 (Berkeley) 10/24/94
.if defined(__MINIX)
.PATH: ${.CURDIR}/sys
.else
# sys sources # sys sources
.PATH: ${ARCHDIR}/sys ${.CURDIR}/sys .PATH: ${ARCHDIR}/sys ${.CURDIR}/sys
@ -215,7 +218,9 @@ LintSysPseudoNoerr.c: ${LIBCDIR}/sys/makelintstub \
${_MKTARGET_CREATE} ${_MKTARGET_CREATE}
CPP=${CPP:Q} ${HOST_SH} ${LIBCDIR}/sys/makelintstub -o ${.TARGET} -p \ CPP=${CPP:Q} ${HOST_SH} ${LIBCDIR}/sys/makelintstub -o ${.TARGET} -p \
-s ${DESTDIR}/usr/include/sys/syscall.h ${PSEUDONOERR} -s ${DESTDIR}/usr/include/sys/syscall.h ${PSEUDONOERR}
.endif # !defined(__MINIX)
.if !defined(__MINIX)
MAN+= accept.2 access.2 acct.2 adjtime.2 bind.2 brk.2 chdir.2 \ MAN+= accept.2 access.2 acct.2 adjtime.2 bind.2 brk.2 chdir.2 \
chflags.2 chmod.2 chown.2 chroot.2 clock_settime.2 clone.2 close.2 \ chflags.2 chmod.2 chown.2 chroot.2 clock_settime.2 clone.2 close.2 \
connect.2 dup.2 execve.2 _exit.2 extattr_get_file.2 \ connect.2 dup.2 execve.2 _exit.2 extattr_get_file.2 \
@ -237,8 +242,12 @@ MAN+= accept.2 access.2 acct.2 adjtime.2 bind.2 brk.2 chdir.2 \
madvise.2 mincore.2 minherit.2 mlock.2 mlockall.2 mmap.2 modctl.2 \ madvise.2 mincore.2 minherit.2 mlock.2 mlockall.2 mmap.2 modctl.2 \
mount.2 \ mount.2 \
mprotect.2 mremap.2 msgctl.2 msgget.2 msgrcv.2 msgsnd.2 msync.2 \ mprotect.2 mremap.2 msgctl.2 msgget.2 msgrcv.2 msgsnd.2 msync.2 \
munmap.2 nanosleep.2 nfssvc.2 ntp_adjtime.2 open.2 pathconf.2 pipe.2 \ munmap.2 nanosleep.2 nfssvc.2 ntp_adjtime.2 open.2 pathconf.2 pipe.2
pmc_control.2 poll.2 posix_fadvise.2 profil.2 ptrace.2 __quotactl.2 \ .else
MAN+= pipe.2
.endif # !defined(__MINIX)
.if !defined(__MINIX)
MAN+= pmc_control.2 poll.2 posix_fadvise.2 profil.2 ptrace.2 __quotactl.2 \
rasctl.2 read.2 readlink.2 \ rasctl.2 read.2 readlink.2 \
reboot.2 recv.2 rename.2 revoke.2 rmdir.2 \ reboot.2 recv.2 rename.2 revoke.2 rmdir.2 \
select.2 semctl.2 \ select.2 semctl.2 \
@ -325,6 +334,10 @@ MLINKS+=utimes.2 futimes.2 utimes.2 lutimes.2
MLINKS+=utimes.2 futimens.2 utimes.2 utimensat.2 MLINKS+=utimes.2 futimens.2 utimes.2 utimensat.2
MLINKS+=wait.2 wait3.2 wait.2 wait4.2 wait.2 waitpid.2 MLINKS+=wait.2 wait3.2 wait.2 wait4.2 wait.2 waitpid.2
MLINKS+=write.2 writev.2 write.2 pwrite.2 write.2 pwritev.2 MLINKS+=write.2 writev.2 write.2 pwrite.2 write.2 pwritev.2
.else
MLINKS+=pipe.2 pipe2.2 MLINKS+=pipe.2 pipe2.2
.endif # !defined(__MINIX)
.if !defined(__MINIX)
MLINKS+=accept.2 paccept.2 MLINKS+=accept.2 paccept.2
MLINKS+=nanosleep.2 clock_nanosleep.2 MLINKS+=nanosleep.2 clock_nanosleep.2
.endif # !defined(__MINIX)

View file

@ -3,7 +3,7 @@ MAN= accept.2 access.2 alarm.2 bind.2 brk.2 chdir.2 chmod.2 chown.2 \
fork.2 getgid.2 getitimer.2 getnucred.2 getpeereid.2 \ fork.2 getgid.2 getitimer.2 getnucred.2 getpeereid.2 \
getpeername.2 getpid.2 getpriority.2 getsockname.2 getsockopt.2 \ getpeername.2 getpid.2 getpriority.2 getsockname.2 getsockopt.2 \
gettimeofday.2 getuid.2 intro.2 ioctl.2 kill.2 link.2 listen.2 \ gettimeofday.2 getuid.2 intro.2 ioctl.2 kill.2 link.2 listen.2 \
lseek.2 mkdir.2 mknod.2 mount.2 open.2 pause.2 pipe.2 ptrace.2 \ lseek.2 mkdir.2 mknod.2 mount.2 open.2 pause.2 ptrace.2 \
read.2 readlink.2 reboot.2 recv.2 recvfrom.2 recvmsg.2 rename.2 \ read.2 readlink.2 reboot.2 recv.2 recvfrom.2 recvmsg.2 rename.2 \
rmdir.2 select.2 send.2 sendmsg.2 sendto.2 setsid.2 \ rmdir.2 select.2 send.2 sendmsg.2 sendto.2 setsid.2 \
setsockopt.2 setuid.2 shutdown.2 sigaction.2 sigpending.2 \ setsockopt.2 setuid.2 shutdown.2 sigaction.2 sigpending.2 \

View file

@ -1,89 +0,0 @@
.\" Copyright (c) 1980 Regents of the University of California.
.\" All rights reserved. The Berkeley software License Agreement
.\" specifies the terms and conditions for redistribution.
.\"
.\" @(#)pipe.2 6.2 (Berkeley) 8/26/85
.\"
.TH PIPE 2 "August 26, 1985"
.UC 4
.SH NAME
pipe \- create an interprocess communication channel
.SH SYNOPSIS
.nf
.ft B
#include <unistd.h>
int pipe(int \fIfildes\fP[2])
.fi
.ft R
.SH DESCRIPTION
The
.B pipe
system call
creates an I/O mechanism called a pipe.
The file descriptors returned can
be used in read and write operations.
When the pipe is written using the descriptor
.IR fildes [1]
up to PIPE_MAX bytes of data are buffered
before the writing process is suspended.
A read using the descriptor
.IR fildes [0]
will pick up the data.
.PP
PIPE_MAX equals 7168 under MINIX 3, but note that most systems use 4096.
.PP
It is assumed that after the
pipe has been set up,
two (or more)
cooperating processes
(created by subsequent
.B fork
calls)
will pass data through the
pipe with
.B read
and
.B write
calls.
.PP
The shell has a syntax
to set up a linear array of processes
connected by pipes.
.PP
Read calls on an empty
pipe (no buffered data) with only one end
(all write file descriptors closed)
returns an end-of-file.
.PP
The signal SIGPIPE is generated if a write on a pipe with only one end
is attempted.
.SH "RETURN VALUE
The function value zero is returned if the
pipe was created; \-1 if an error occurred.
.SH ERRORS
The \fBpipe\fP call will fail if:
.TP 15
[EMFILE]
Too many descriptors are active.
.TP 15
[ENFILE]
The system file table is full.
.TP 15
[ENOSPC]
The pipe file system (usually the root file system) has no free inodes.
.TP 15
[EFAULT]
The \fIfildes\fP buffer is in an invalid area of the process's address
space.
.SH "SEE ALSO"
.BR sh (1),
.BR read (2),
.BR write (2),
.BR fork (2).
.SH NOTES
Writes may return ENOSPC errors if no pipe data can be buffered, because
the pipe file system is full.
.SH BUGS
Should more than PIPE_MAX bytes be necessary in any
pipe among a loop of processes, deadlock will occur.

View file

@ -538,7 +538,7 @@ the filp, the vnode remains locked, the soft lock is removed, and the filp
mutex is released. Note that this scheme does not violate the locking order; mutex is released. Note that this scheme does not violate the locking order;
the vnode is (already) locked before the filp. the vnode is (already) locked before the filp.
A similar problem arises with do_pipe. In this case we obtain a new vnode A similar problem arises with create_pipe. In this case we obtain a new vnode
object, lock it, and obtain two new, locked, filp objects. If everything works object, lock it, and obtain two new, locked, filp objects. If everything works
out and the filp objects are linked to the same vnode, we run into trouble out and the filp objects are linked to the same vnode, we run into trouble
when unlocking both filps. The first filp being unlocked would work; the when unlocking both filps. The first filp being unlocked would work; the

View file

@ -31,6 +31,7 @@
#define offset_high m2_l2 #define offset_high m2_l2
#define ctl_req m4_l1 #define ctl_req m4_l1
#define mount_flags m1_i3 #define mount_flags m1_i3
#define pipe_flags m1_i3
#define request m1_i2 #define request m1_i2
#define sig m1_i2 #define sig m1_i2
#define endpt1 m1_i1 #define endpt1 m1_i1

View file

@ -34,18 +34,55 @@
#include "vnode.h" #include "vnode.h"
#include "vmnt.h" #include "vmnt.h"
static int create_pipe(int fil_des[2], int flags);
/*===========================================================================* /*===========================================================================*
* do_pipe * * do_pipe *
*===========================================================================*/ *===========================================================================*/
int do_pipe() int do_pipe()
{ {
/* Perform the pipe(fil_des) system call. */ /* Perform the pipe(fil_des[2]) system call. */
int r;
int fil_des[2]; /* reply goes here */
r = create_pipe(fil_des, 0 /* no flags */);
if (r == OK) {
m_out.reply_i1 = fil_des[0];
m_out.reply_i2 = fil_des[1];
}
return r;
}
/*===========================================================================*
* do_pipe2 *
*===========================================================================*/
int do_pipe2()
{
/* Perform the pipe2(fil_des[2], flags) system call. */
int r, flags;
int fil_des[2]; /* reply goes here */
flags = job_m_in.pipe_flags;
r = create_pipe(fil_des, flags);
if (r == OK) {
m_out.reply_i1 = fil_des[0];
m_out.reply_i2 = fil_des[1];
}
return r;
}
/*===========================================================================*
* create_pipe *
*===========================================================================*/
static int create_pipe(int fil_des[2], int flags)
{
register struct fproc *rfp; register struct fproc *rfp;
int r; int r;
struct filp *fil_ptr0, *fil_ptr1; struct filp *fil_ptr0, *fil_ptr1;
int fil_des[2]; /* reply goes here */
struct vnode *vp; struct vnode *vp;
struct vmnt *vmp; struct vmnt *vmp;
struct node_details res; struct node_details res;
@ -119,11 +156,12 @@ int do_pipe()
fil_ptr0->filp_vno = vp; fil_ptr0->filp_vno = vp;
dup_vnode(vp); dup_vnode(vp);
fil_ptr1->filp_vno = vp; fil_ptr1->filp_vno = vp;
fil_ptr0->filp_flags = O_RDONLY; fil_ptr0->filp_flags = O_RDONLY | (flags & ~O_ACCMODE);
fil_ptr1->filp_flags = O_WRONLY; fil_ptr1->filp_flags = O_WRONLY | (flags & ~O_ACCMODE);
if (flags & O_CLOEXEC) {
m_out.reply_i1 = fil_des[0]; FD_SET(fil_des[0], &rfp->fp_cloexec_set);
m_out.reply_i2 = fil_des[1]; FD_SET(fil_des[1], &rfp->fp_cloexec_set);
}
unlock_filps(fil_ptr0, fil_ptr1); unlock_filps(fil_ptr0, fil_ptr1);
unlock_vmnt(vmp); unlock_vmnt(vmp);

View file

@ -184,6 +184,7 @@ int do_check_perms(void);
/* pipe.c */ /* pipe.c */
int do_pipe(void); int do_pipe(void);
int do_pipe2(void);
int map_vnode(struct vnode *vp, endpoint_t fs_e); int map_vnode(struct vnode *vp, endpoint_t fs_e);
void unpause(endpoint_t proc_e); void unpause(endpoint_t proc_e);
int pipe_check(struct filp *filp, int rw_flag, int oflags, int bytes, int pipe_check(struct filp *filp, int rw_flag, int oflags, int bytes,

View file

@ -73,7 +73,7 @@ int (*call_vec[])(void) = {
do_fcntl, /* 55 = fcntl */ do_fcntl, /* 55 = fcntl */
no_sys, /* 56 = (mpx) */ no_sys, /* 56 = (mpx) */
do_fsready, /* 57 = FS proc ready */ do_fsready, /* 57 = FS proc ready */
no_sys, /* 58 = unused */ do_pipe2, /* 58 = pipe2 */
no_sys, /* 59 = (execve)*/ no_sys, /* 59 = (execve)*/
do_umask, /* 60 = umask */ do_umask, /* 60 = umask */
do_chroot, /* 61 = chroot */ do_chroot, /* 61 = chroot */