1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
|
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#if defined(_REVOLUTION)
// include the revolution socket header
#include "../gsPlatform.h"
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// static variables
static int GSIRevolutionErrno;
// prototypes of static functions
static int CheckRcode(int rcode, int errCode);
#define REVOlUTION_SOCKET_ERROR -1
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// parses rcode into a generic -1 error if an error has occured
static int CheckRcode(int rcode, int errCode)
{
if(rcode >= 0)
return rcode;
GSIRevolutionErrno = rcode;
return errCode;
}
int socket(int pf, int type, int protocol)
{
int rcode = SOSocket(pf, type, 0);
GSI_UNUSED(protocol);
return CheckRcode(rcode, INVALID_SOCKET);
}
int closesocket(SOCKET sock)
{
int rcode = SOClose(sock);
return CheckRcode(rcode, REVOlUTION_SOCKET_ERROR);
}
int shutdown(SOCKET sock, int how)
{
int rcode = SOShutdown(sock, how);
return CheckRcode(rcode, REVOlUTION_SOCKET_ERROR);
}
int bind(SOCKET sock, const SOCKADDR* addr, int len)
{
SOCKADDR localAddr;
int rcode;
// with Revolution, don't bind to 0, just start using the port
if(((const SOCKADDR_IN*)addr)->port == 0)
return 0;
memcpy(&localAddr, addr, sizeof(SOCKADDR));
localAddr.len = (u8)len;
rcode = SOBind(sock, &localAddr);
return CheckRcode(rcode, REVOlUTION_SOCKET_ERROR);
}
int connect(SOCKET sock, const SOCKADDR* addr, int len)
{
SOCKADDR remoteAddr;
int rcode;
memcpy(&remoteAddr, addr, sizeof(SOCKADDR));
remoteAddr.len = (u8)len;
rcode = SOConnect(sock, &remoteAddr);
return CheckRcode(rcode, REVOlUTION_SOCKET_ERROR);
}
int listen(SOCKET sock, int backlog)
{
int rcode = SOListen(sock, backlog);
return CheckRcode(rcode, REVOlUTION_SOCKET_ERROR);
}
SOCKET accept(SOCKET sock, SOCKADDR* addr, int* len)
{
int rcode;
addr->len = (u8)*len;
rcode = SOAccept(sock, addr);
*len = addr->len;
return CheckRcode(rcode, REVOlUTION_SOCKET_ERROR);
}
int recv(SOCKET sock, char* buf, int len, int flags)
{
int rcode = SORecv(sock, buf, len, flags);
return CheckRcode(rcode, REVOlUTION_SOCKET_ERROR);
}
int recvfrom(SOCKET sock, char* buf, int len, int flags, SOCKADDR* addr, int* fromlen)
{
int rcode;
addr->len = (u8)*fromlen;
rcode = SORecvFrom(sock, buf, len, flags, addr);
*fromlen = addr->len;
return CheckRcode(rcode, REVOlUTION_SOCKET_ERROR);
}
SOCKET send(SOCKET sock, const char* buf, int len, int flags)
{
int rcode = SOSend(sock, buf, len, flags);
return CheckRcode(rcode, REVOlUTION_SOCKET_ERROR);
}
SOCKET sendto(SOCKET sock, const char* buf, int len, int flags, const SOCKADDR* addr, int tolen)
{
SOCKADDR remoteAddr;
int rcode;
memcpy(&remoteAddr, addr, sizeof(SOCKADDR));
remoteAddr.len = (u8)tolen;
rcode = SOSendTo(sock, buf, len, flags, &remoteAddr);
return CheckRcode(rcode, REVOlUTION_SOCKET_ERROR);
}
int getsockopt(SOCKET sock, int level, int optname, char* optval, int* optlen)
{
int rcode = SOGetSockOpt(sock, level, optname, optval, optlen);
return CheckRcode(rcode, REVOlUTION_SOCKET_ERROR);
}
SOCKET setsockopt(SOCKET sock, int level, int optname, const char* optval, int optlen)
{
int rcode = SOSetSockOpt(sock, level, optname, optval, optlen);
return CheckRcode(rcode, REVOlUTION_SOCKET_ERROR);
}
int getsockname(SOCKET sock, SOCKADDR* addr, int* len)
{
int rcode;
addr->len = (u8)*len;
rcode = SOGetSockName(sock, addr);
*len = addr->len;
return CheckRcode(rcode, REVOlUTION_SOCKET_ERROR);
}
unsigned long inet_addr(const char* name)
{
int rcode;
SOInAddr addr;
rcode = SOInetAtoN(name, &addr);
if(rcode == FALSE)
return INADDR_NONE;
return addr.addr;
}
int GOAGetLastError(SOCKET sock)
{
GSI_UNUSED(sock);
return GSIRevolutionErrno;
}
int GSISocketSelect(SOCKET theSocket, int* theReadFlag, int* theWriteFlag, int* theExceptFlag)
{
SOPollFD pollFD;
int rcode;
pollFD.fd = theSocket;
pollFD.events = 0;
if(theReadFlag != NULL)
pollFD.events |= SO_POLLRDNORM;
if(theWriteFlag != NULL)
pollFD.events |= SO_POLLWRNORM;
pollFD.revents = 0;
rcode = SOPoll(&pollFD, 1, 0);
if(rcode < 0)
return REVOlUTION_SOCKET_ERROR;
if(theReadFlag != NULL)
{
if((rcode > 0) && (pollFD.revents & (SO_POLLRDNORM|SO_POLLHUP)))
*theReadFlag = 1;
else
*theReadFlag = 0;
}
if(theWriteFlag != NULL)
{
if((rcode > 0) && (pollFD.revents & SO_POLLWRNORM))
*theWriteFlag = 1;
else
*theWriteFlag = 0;
}
if(theExceptFlag != NULL)
{
if((rcode > 0) && (pollFD.revents & SO_POLLERR))
*theExceptFlag = 1;
else
*theExceptFlag = 0;
}
return rcode;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#endif // _REVOLUTION
|