diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-02-12 13:34:09 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-02-13 10:34:20 +0100 |
commit | 5c0aa976d3d47f17471b609d19b749557716f2a0 (patch) | |
tree | ef933036c5c14578f60208b94a5e6417333bdf60 /freebsd/sys/kern/uipc_syscalls.c | |
parent | rtems_bsd_mutex: Add missing ISR enable (diff) | |
download | rtems-libbsd-5c0aa976d3d47f17471b609d19b749557716f2a0.tar.bz2 |
Add zerocopy sendto
Diffstat (limited to 'freebsd/sys/kern/uipc_syscalls.c')
-rw-r--r-- | freebsd/sys/kern/uipc_syscalls.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/freebsd/sys/kern/uipc_syscalls.c b/freebsd/sys/kern/uipc_syscalls.c index b0c83e60..44804b38 100644 --- a/freebsd/sys/kern/uipc_syscalls.c +++ b/freebsd/sys/kern/uipc_syscalls.c @@ -99,6 +99,7 @@ __FBSDID("$FreeBSD$"); #endif /* INET || INET6 */ #ifdef __rtems__ #include <machine/rtems-bsd-syscall-api.h> +#include <rtems/bsd/zerocopy.h> static int kern_bind(struct thread *, int, struct sockaddr *); @@ -1137,6 +1138,30 @@ sendto(int socket, const void *message, size_t length, int flags, rtems_set_errno_and_return_minus_one(error); } } + +int +rtems_bsd_sendto(int socket, struct mbuf *m, int flags, + const struct sockaddr *dest_addr) +{ + struct thread *td = rtems_bsd_get_curthread_or_null(); + struct file *fp; + struct socket *so; + int error; + + error = getsock_cap(td->td_proc->p_fd, socket, CAP_WRITE, &fp, NULL); + if (error) + return (error); + so = (struct socket *)fp->f_data; + + if (td != NULL) { + error = sosend(so, __DECONST(struct sockaddr *, dest_addr), + NULL, m, NULL, flags, td); + } else { + error = ENOMEM; + } + + return (error); +} #endif /* __rtems__ */ #ifndef __rtems__ |