diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-10-14 14:55:04 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-10-31 13:18:48 +0100 |
commit | ec702abace937c0ead0d796e85fab69068e81958 (patch) | |
tree | 846f24b2b27a704b133dc6e814a464d0f221cbdc /freebsd/sys/kern | |
parent | Use getsockname() from FreeBSD (diff) | |
download | rtems-libbsd-ec702abace937c0ead0d796e85fab69068e81958.tar.bz2 |
Use socket read() and write() from FreeBSD
Diffstat (limited to 'freebsd/sys/kern')
-rw-r--r-- | freebsd/sys/kern/sys_socket.c | 96 |
1 files changed, 88 insertions, 8 deletions
diff --git a/freebsd/sys/kern/sys_socket.c b/freebsd/sys/kern/sys_socket.c index 5318c69a..a748d8b1 100644 --- a/freebsd/sys/kern/sys_socket.c +++ b/freebsd/sys/kern/sys_socket.c @@ -71,8 +71,10 @@ struct fileops socketops = { }; #endif /* __rtems__ */ -#ifndef __rtems__ /* ARGSUSED */ +#ifdef __rtems__ +static +#endif /* __rtems__ */ int soo_read(struct file *fp, struct uio *uio, struct ucred *active_cred, int flags, struct thread *td) @@ -90,8 +92,45 @@ soo_read(struct file *fp, struct uio *uio, struct ucred *active_cred, CURVNET_RESTORE(); return (error); } +#ifdef __rtems__ +static ssize_t +rtems_bsd_soo_read(rtems_libio_t *iop, void *buffer, size_t count) +{ + struct thread *td = rtems_bsd_get_curthread_or_null(); + struct file *fp = rtems_bsd_iop_to_fp(iop); + struct iovec iov = { + .iov_base = buffer, + .iov_len = count + }; + struct uio auio = { + .uio_iov = &iov, + .uio_iovcnt = 1, + .uio_offset = 0, + .uio_resid = count, + .uio_segflg = UIO_USERSPACE, + .uio_rw = UIO_READ, + .uio_td = td + }; + int error; + + if (td != NULL) { + error = soo_read(fp, &auio, NULL, 0, NULL); + } else { + error = ENOMEM; + } + + if (error == 0) { + return (count - auio.uio_resid); + } else { + rtems_set_errno_and_return_minus_one(error); + } +} +#endif /* __rtems__ */ /* ARGSUSED */ +#ifdef __rtems__ +static +#endif /* __rtems__ */ int soo_write(struct file *fp, struct uio *uio, struct ucred *active_cred, int flags, struct thread *td) @@ -106,13 +145,52 @@ soo_write(struct file *fp, struct uio *uio, struct ucred *active_cred, #endif error = sosend(so, 0, uio, 0, 0, 0, uio->uio_td); if (error == EPIPE && (so->so_options & SO_NOSIGPIPE) == 0) { +#ifndef __rtems__ PROC_LOCK(uio->uio_td->td_proc); tdksignal(uio->uio_td, SIGPIPE, NULL); PROC_UNLOCK(uio->uio_td->td_proc); +#else /* __rtems__ */ + /* FIXME: Determine if we really want to use signals */ +#endif /* __rtems__ */ } return (error); } +#ifdef __rtems__ +static ssize_t +rtems_bsd_soo_write(rtems_libio_t *iop, const void *buffer, size_t count) +{ + struct thread *td = rtems_bsd_get_curthread_or_null(); + struct file *fp = rtems_bsd_iop_to_fp(iop); + struct iovec iov = { + .iov_base = __DECONST(void *, buffer), + .iov_len = count + }; + struct uio auio = { + .uio_iov = &iov, + .uio_iovcnt = 1, + .uio_offset = 0, + .uio_resid = count, + .uio_segflg = UIO_USERSPACE, + .uio_rw = UIO_WRITE, + .uio_td = td + }; + int error; + if (td != NULL) { + error = soo_write(fp, &auio, NULL, 0, NULL); + } else { + error = ENOMEM; + } + + if (error == 0) { + return (count - auio.uio_resid); + } else { + rtems_set_errno_and_return_minus_one(error); + } +} +#endif /* __rtems__ */ + +#ifndef __rtems__ int soo_truncate(struct file *fp, off_t length, struct ucred *active_cred, struct thread *td) @@ -132,10 +210,6 @@ soo_ioctl(struct file *fp, u_long cmd, void *data, struct ucred *active_cred, struct socket *so = fp->f_data; int error = 0; -#ifdef __rtems__ - if (td == NULL) - return (ENOMEM); -#endif /* __rtems__ */ CURVNET_SET(so->so_vnet); switch (cmd) { case FIONBIO: @@ -239,7 +313,13 @@ rtems_bsd_soo_ioctl(rtems_libio_t *iop, ioctl_command_t request, void *buffer) { struct thread *td = rtems_bsd_get_curthread_or_null(); struct file *fp = rtems_bsd_iop_to_fp(iop); - int error = soo_ioctl(fp, request, buffer, NULL, td); + int error; + + if (td != NULL) { + error = soo_ioctl(fp, request, buffer, NULL, td); + } else { + error = ENOMEM; + } return rtems_bsd_error_to_status_and_errno(error); } @@ -363,8 +443,8 @@ rtems_bsd_soo_close(rtems_libio_t *iop) const rtems_filesystem_file_handlers_r socketops = { .open_h = rtems_filesystem_default_open, .close_h = rtems_bsd_soo_close, - .read_h = rtems_filesystem_default_read, - .write_h = rtems_filesystem_default_write, + .read_h = rtems_bsd_soo_read, + .write_h = rtems_bsd_soo_write, .ioctl_h = rtems_bsd_soo_ioctl, .lseek_h = rtems_filesystem_default_lseek, .fstat_h = rtems_bsd_soo_stat, |