summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2017-07-28 08:42:42 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-07-28 08:46:20 +0200
commit17ab62cbdde0e6a559b9c5f7ed966779615fc04e (patch)
tree76aefd686f3ccf9c797350a496815675b25a3aea
parentSOCKET(2): Add missing file handler (diff)
downloadrtems-libbsd-17ab62cbdde0e6a559b9c5f7ed966779615fc04e.tar.bz2
PIPE(2): Add missing file handler
-rwxr-xr-xfreebsd/sys/kern/sys_pipe.c84
1 files 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 */