diff options
Diffstat (limited to 'freebsd')
-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__ |