From e3e0db1051e60e496d2959503343e88f94644c44 Mon Sep 17 00:00:00 2001 From: Pete Delaney Date: Fri, 5 Oct 2012 00:23:50 -0700 Subject: [PATCH] [MIPS] Updated support for socket and added support for socket_pair. Socket type can also contain SOCK_NONBLOCK and SOCK_CLOEXEC flags. NDK headers do not export these values but they seem to be aliases of O_NONBLOCK and O_CLOEXEC. NDK headers do not define O_CLOEXEC. Change-Id: If97fcb9f1ff130ea11a0da6452454a256f769809 Signed-off-by: Chris Dearman Signed-off-by: Pete Delaney --- .../android/libportable/arch-mips/socket.c | 55 ++++++++++++++++--- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/ndk/sources/android/libportable/arch-mips/socket.c b/ndk/sources/android/libportable/arch-mips/socket.c index 51b8db028..8008fb9cf 100644 --- a/ndk/sources/android/libportable/arch-mips/socket.c +++ b/ndk/sources/android/libportable/arch-mips/socket.c @@ -16,25 +16,58 @@ #include #include -#include +#include + #include +#include #if SOCK_STREAM==SOCK_STREAM_PORTABLE #error Bad build environment #endif +/* LTP defaults to using O_NONBLOCK if SOCK_NONBLOCK is not defined. */ +#ifndef SOCK_NONBLOCK_PORTABLE +# define SOCK_NONBLOCK_PORTABLE O_NONBLOCK_PORTABLE +#endif +#ifndef SOCK_NONBLOCK +# define SOCK_NONBLOCK O_NONBLOCK +#endif + +/* Current NDK headers do not define SOCK_CLOEXEC or O_CLOEXEC */ +#if !defined(SOCK_CLOEXEC_PORTABLE) && defined(O_CLOEXEC_PORTABLE) +# define SOCK_CLOEXEC_PORTABLE O_CLOEXEC_PORTABLE +#endif +#if !defined(SOCK_CLOEXEC) && defined(O_CLOEXEC) +# define SOCK_CLOEXEC O_CLOEXEC +#endif + static inline int mips_change_type(int type) { - switch (type) { - case SOCK_STREAM_PORTABLE: return SOCK_STREAM; - case SOCK_DGRAM_PORTABLE: return SOCK_DGRAM; - case SOCK_RAW_PORTABLE: return SOCK_RAW; - case SOCK_RDM_PORTABLE: return SOCK_RDM; - case SOCK_SEQPACKET_PORTABLE: return SOCK_SEQPACKET; - case SOCK_PACKET_PORTABLE: return SOCK_PACKET; + int mipstype = 0; + + if (type & SOCK_NONBLOCK_PORTABLE) { + mipstype |= SOCK_NONBLOCK; + type &= ~SOCK_NONBLOCK_PORTABLE; } - return type; + +#if defined(SOCK_CLOEXEC_PORTABLE) && defined(SOCK_CLOEXEC) + if (type & SOCK_CLOEXEC_PORTABLE) { + mipstype |= SOCK_CLOEXEC; + type &= ~SOCK_CLOEXEC_PORTABLE; + } +#endif + + switch (type) { + case SOCK_STREAM_PORTABLE: mipstype |= SOCK_STREAM; break; + case SOCK_DGRAM_PORTABLE: mipstype |= SOCK_DGRAM; break; + case SOCK_RAW_PORTABLE: mipstype |= SOCK_RAW; break; + case SOCK_RDM_PORTABLE: mipstype |= SOCK_RDM; break; + case SOCK_SEQPACKET_PORTABLE: mipstype |= SOCK_SEQPACKET; break; + case SOCK_PACKET_PORTABLE: mipstype |= SOCK_PACKET; break; + default: mipstype |= type; + } + return mipstype; } extern int socket(int, int, int); @@ -42,3 +75,7 @@ extern int socket(int, int, int); int socket_portable(int domain, int type, int protocol) { return socket(domain, mips_change_type(type), protocol); } + +int socketpair_portable(int domain, int type, int protocol, int sv[2]) { + return socketpair(domain, mips_change_type(type), protocol, sv); +}