summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/kern/uipc_syscalls.c
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/sys/kern/uipc_syscalls.c')
-rw-r--r--freebsd/sys/kern/uipc_syscalls.c25
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__