summaryrefslogtreecommitdiffstats
path: root/freebsd/lib/libc/net/recv.c
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/lib/libc/net/recv.c')
-rw-r--r--freebsd/lib/libc/net/recv.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/freebsd/lib/libc/net/recv.c b/freebsd/lib/libc/net/recv.c
index 168cb85e..71c531c8 100644
--- a/freebsd/lib/libc/net/recv.c
+++ b/freebsd/lib/libc/net/recv.c
@@ -35,18 +35,25 @@ static char sccsid[] = "@(#)recv.c 8.2 (Berkeley) 2/21/94";
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include "namespace.h"
#include <sys/types.h>
#include <sys/socket.h>
+#include "libc_private.h"
#include <stddef.h>
-#include "un-namespace.h"
ssize_t
-recv(s, buf, len, flags)
- int s, flags;
- size_t len;
- void *buf;
+recv(int s, void *buf, size_t len, int flags)
{
- return (_recvfrom(s, buf, len, flags, NULL, 0));
+ /*
+ * POSIX says recv() shall be a cancellation point, so call the
+ * cancellation-enabled recvfrom() and not _recvfrom().
+ */
+#ifndef __rtems__
+ return (((ssize_t (*)(int, void *, size_t, int,
+ struct sockaddr *, socklen_t *))
+ __libc_interposing[INTERPOS_recvfrom])(s, buf, len, flags,
+ NULL, NULL));
+#else /* __rtems__ */
+ return (recvfrom(s, buf, len, flags, NULL, 0));
+#endif /* __rtems__ */
}