C++程序  |  150行  |  3.91 KB


#include <sys/types.h>
#include <sys/socket.h>

/* Derived from android-3/arch-arm/include/asm/socket.h */

#define SOL_SOCKET_PORTABLE	1

#define SO_DEBUG_PORTABLE	1
#define SO_REUSEADDR_PORTABLE	2
#define SO_TYPE_PORTABLE	3
#define SO_ERROR_PORTABLE	4
#define SO_DONTROUTE_PORTABLE	5
#define SO_BROADCAST_PORTABLE	6
#define SO_SNDBUF_PORTABLE	7
#define SO_RCVBUF_PORTABLE	8
#define SO_SNDBUFFORCE_PORTABLE	32
#define SO_RCVBUFFORCE_PORTABLE	33
#define SO_KEEPALIVE_PORTABLE	9
#define SO_OOBINLINE_PORTABLE	10
#define SO_NO_CHECK_PORTABLE	11
#define SO_PRIORITY_PORTABLE	12
#define SO_LINGER_PORTABLE	13
#define SO_BSDCOMPAT_PORTABLE	14

#define SO_PASSCRED_PORTABLE	16
#define SO_PEERCRED_PORTABLE	17
#define SO_RCVLOWAT_PORTABLE	18
#define SO_SNDLOWAT_PORTABLE	19
#define SO_RCVTIMEO_PORTABLE	20
#define SO_SNDTIMEO_PORTABLE	21

#define SO_SECURITY_AUTHENTICATION_PORTABLE 22
#define SO_SECURITY_ENCRYPTION_TRANSPORT_PORTABLE 23
#define SO_SECURITY_ENCRYPTION_NETWORK_PORTABLE 24

#define SO_BINDTODEVICE_PORTABLE 25

#define SO_ATTACH_FILTER_PORTABLE 26
#define SO_DETACH_FILTER_PORTABLE 27

#define SO_PEERNAME_PORTABLE	28
#define SO_TIMESTAMP_PORTABLE	29
#define SCM_TIMESTAMP_PORTABLE SO_TIMESTAMP_PORTABLE

#define SO_ACCEPTCONN_PORTABLE	30

#define SO_PEERSEC_PORTABLE	31
#define SO_PASSSEC_PORTABLE	34

#if SOL_SOCKET_PORTABLE==SOL_SOCKET
#error Build environment
#endif

static inline int mips_change_level(int level)
{
    switch (level) {
    case SOL_SOCKET_PORTABLE:
	level = SOL_SOCKET;
	break;
    }
    return level;
}


static inline int mips_change_optname(int optname)
{
    switch (optname) {
    case SO_DEBUG_PORTABLE:
	return SO_DEBUG;
    case SO_REUSEADDR_PORTABLE:
	return SO_REUSEADDR;
    case SO_TYPE_PORTABLE:
	return SO_TYPE;
    case SO_ERROR_PORTABLE:
	return SO_ERROR;
    case SO_DONTROUTE_PORTABLE:
	return SO_DONTROUTE;
    case SO_BROADCAST_PORTABLE:
	return SO_BROADCAST;
    case SO_SNDBUF_PORTABLE:
	return SO_SNDBUF;
    case SO_RCVBUF_PORTABLE:
	return SO_RCVBUF;
    case SO_SNDBUFFORCE_PORTABLE:
	return SO_SNDBUFFORCE;
    case SO_RCVBUFFORCE_PORTABLE:
	return SO_RCVBUFFORCE;
    case SO_KEEPALIVE_PORTABLE:
	return SO_KEEPALIVE;
    case SO_OOBINLINE_PORTABLE:
	return SO_OOBINLINE;
    case SO_NO_CHECK_PORTABLE:
	return SO_NO_CHECK;
    case SO_PRIORITY_PORTABLE:
	return SO_PRIORITY;
    case SO_LINGER_PORTABLE:
	return SO_LINGER;
    case SO_BSDCOMPAT_PORTABLE:
	return SO_BSDCOMPAT;
    case SO_PASSCRED_PORTABLE:
	return SO_PASSCRED;
    case SO_PEERCRED_PORTABLE:
	return SO_PEERCRED;
    case SO_RCVLOWAT_PORTABLE:
	return SO_RCVLOWAT;
    case SO_SNDLOWAT_PORTABLE:
	return SO_SNDLOWAT;
    case SO_RCVTIMEO_PORTABLE:
	return SO_RCVTIMEO;
    case SO_SNDTIMEO_PORTABLE:
	return SO_SNDTIMEO;
    case SO_SECURITY_AUTHENTICATION_PORTABLE:
	return SO_SECURITY_AUTHENTICATION;
    case SO_SECURITY_ENCRYPTION_TRANSPORT_PORTABLE:
	return SO_SECURITY_ENCRYPTION_TRANSPORT;
    case SO_SECURITY_ENCRYPTION_NETWORK_PORTABLE:
	return SO_SECURITY_ENCRYPTION_NETWORK;
    case SO_BINDTODEVICE_PORTABLE:
	return SO_BINDTODEVICE;
    case SO_ATTACH_FILTER_PORTABLE:
	return SO_ATTACH_FILTER;
    case SO_DETACH_FILTER_PORTABLE:
	return SO_DETACH_FILTER;
    case SO_PEERNAME_PORTABLE:
	return SO_PEERNAME;
    case SO_TIMESTAMP_PORTABLE:
	return SO_TIMESTAMP;
    case SO_ACCEPTCONN_PORTABLE:
	return SO_ACCEPTCONN;
    case SO_PEERSEC_PORTABLE:
	return SO_PEERSEC;
    case SO_PASSSEC_PORTABLE:
	return SO_PASSSEC;
    }
    return optname;
}

extern int setsockopt(int, int, int, const void *, socklen_t);
int setsockopt_portable(int s, int level, int optname, const void *optval, socklen_t optlen)
{
    return setsockopt(s, mips_change_level(level), mips_change_optname(optname), optval, optlen);
}

extern int getsockopt (int, int, int, void *, socklen_t *);
int getsockopt_portable(int s, int level, int optname, void *optval, socklen_t *optlen)
{
    return getsockopt(s, mips_change_level(level), mips_change_optname(optname), optval, optlen);
}