From 17ab62cbdde0e6a559b9c5f7ed966779615fc04e Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 28 Jul 2017 08:42:42 +0200 Subject: PIPE(2): Add missing file handler --- freebsd/sys/kern/sys_pipe.c | 84 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 78 insertions(+), 6 deletions(-) diff --git a/freebsd/sys/kern/sys_pipe.c b/freebsd/sys/kern/sys_pipe.c index 8f010aa9..1636280f 100755 --- a/freebsd/sys/kern/sys_pipe.c +++ b/freebsd/sys/kern/sys_pipe.c @@ -179,12 +179,21 @@ struct fileops pipeops = { #define PIPE_NODIRECT #define PRIBIO (0) -static int rtems_bsd_pipe_open(rtems_libio_t *iop, const char *path, int oflag, mode_t mode); +static int rtems_bsd_pipe_open(rtems_libio_t *iop, const char *path, + int oflag, mode_t mode); static int rtems_bsd_pipe_close(rtems_libio_t *iop); -static ssize_t rtems_bsd_pipe_read(rtems_libio_t *iop, void *buffer, size_t count); -static ssize_t rtems_bsd_pipe_write(rtems_libio_t *iop, const void *buffer, size_t count); -static int rtems_bsd_pipe_ioctl(rtems_libio_t *iop, ioctl_command_t request, void *buffer); -static int rtems_bsd_pipe_stat(const rtems_filesystem_location_info_t *loc, struct stat *buf); +static ssize_t rtems_bsd_pipe_read(rtems_libio_t *iop, void *buffer, + size_t count); +static ssize_t rtems_bsd_pipe_readv(rtems_libio_t *iop, + const struct iovec *iov, int iovcnt, ssize_t total); +static ssize_t rtems_bsd_pipe_write(rtems_libio_t *iop, const void *buffer, + size_t count); +static ssize_t rtems_bsd_pipe_writev(rtems_libio_t *iop, + const struct iovec *iov, int iovcnt, ssize_t total); +static int rtems_bsd_pipe_ioctl(rtems_libio_t *iop, ioctl_command_t request, + void *buffer); +static int rtems_bsd_pipe_stat(const rtems_filesystem_location_info_t *loc, + struct stat *buf); static int rtems_bsd_pipe_fcntl(rtems_libio_t *iop, int cmd); static int rtems_bsd_pipe_poll(rtems_libio_t *iop, int events); int rtems_bsd_pipe_kqfilter(rtems_libio_t *iop, struct knote *kn); @@ -202,7 +211,10 @@ static const rtems_filesystem_file_handlers_r pipeops = { .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fcntl_h = rtems_bsd_pipe_fcntl, .poll_h = rtems_bsd_pipe_poll, - .kqfilter_h = rtems_bsd_pipe_kqfilter + .kqfilter_h = rtems_bsd_pipe_kqfilter, + .readv_h = rtems_bsd_pipe_readv, + .writev_h = rtems_bsd_pipe_writev, + .mmap_h = rtems_filesystem_default_mmap }; long maxpipekva; /* Limit on pipe KVA */ @@ -939,6 +951,36 @@ rtems_bsd_pipe_read(rtems_libio_t *iop, void *buffer, size_t count) rtems_set_errno_and_return_minus_one(error); } } + +static ssize_t +rtems_bsd_pipe_readv(rtems_libio_t *iop, const struct iovec *iov, + int iovcnt, ssize_t total) +{ + struct thread *td = rtems_bsd_get_curthread_or_null(); + struct file *fp = rtems_bsd_iop_to_fp(iop); + struct uio auio = { + .uio_iov = __DECONST(struct iovec *, iov), + .uio_iovcnt = iovcnt, + .uio_offset = 0, + .uio_resid = total, + .uio_segflg = UIO_USERSPACE, + .uio_rw = UIO_READ, + .uio_td = td + }; + int error; + + if (td != NULL) { + error = pipe_read(fp, &auio, NULL, 0, NULL); + } else { + error = ENOMEM; + } + + if (error == 0) { + return (total - auio.uio_resid); + } else { + rtems_set_errno_and_return_minus_one(error); + } +} #endif /* __rtems__ */ #ifndef PIPE_NODIRECT @@ -1470,6 +1512,36 @@ rtems_bsd_pipe_write(rtems_libio_t *iop, const void *buffer, size_t count) rtems_set_errno_and_return_minus_one(error); } } + +static ssize_t +rtems_bsd_pipe_writev(rtems_libio_t *iop, const struct iovec *iov, + int iovcnt, ssize_t total) +{ + struct thread *td = rtems_bsd_get_curthread_or_null(); + struct file *fp = rtems_bsd_iop_to_fp(iop); + struct uio auio = { + .uio_iov = __DECONST(struct iovec *, iov), + .uio_iovcnt = iovcnt, + .uio_offset = 0, + .uio_resid = total, + .uio_segflg = UIO_USERSPACE, + .uio_rw = UIO_WRITE, + .uio_td = td + }; + int error; + + if (td != NULL) { + error = pipe_write(fp, &auio, NULL, 0, NULL); + } else { + error = ENOMEM; + } + + if (error == 0) { + return (total - auio.uio_resid); + } else { + rtems_set_errno_and_return_minus_one(error); + } +} #endif /* __rtems__ */ /* ARGSUSED */ -- cgit v1.2.3