Merge "[MIPS] Updated support for socket and added support for socket_pair."

This commit is contained in:
Andrew Hsieh
2012-10-05 02:16:39 -07:00
committed by Gerrit Code Review

View File

@@ -16,25 +16,58 @@
#include <unistd.h> #include <unistd.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/linux-syscalls.h> #include <fcntl.h>
#include <socket_portable.h> #include <socket_portable.h>
#include <fcntl_portable.h>
#if SOCK_STREAM==SOCK_STREAM_PORTABLE #if SOCK_STREAM==SOCK_STREAM_PORTABLE
#error Bad build environment #error Bad build environment
#endif #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) static inline int mips_change_type(int type)
{ {
switch (type) { int mipstype = 0;
case SOCK_STREAM_PORTABLE: return SOCK_STREAM;
case SOCK_DGRAM_PORTABLE: return SOCK_DGRAM; if (type & SOCK_NONBLOCK_PORTABLE) {
case SOCK_RAW_PORTABLE: return SOCK_RAW; mipstype |= SOCK_NONBLOCK;
case SOCK_RDM_PORTABLE: return SOCK_RDM; type &= ~SOCK_NONBLOCK_PORTABLE;
case SOCK_SEQPACKET_PORTABLE: return SOCK_SEQPACKET;
case SOCK_PACKET_PORTABLE: return SOCK_PACKET;
} }
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); 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) { int socket_portable(int domain, int type, int protocol) {
return socket(domain, mips_change_type(type), 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);
}