openmohaa/code/gamespy/common/nitro/gsSocketNitro.c
2023-02-04 21:00:01 +01:00

194 lines
No EOL
4.7 KiB
C

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#if defined(_NITRO)
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// static variables
static int GSINitroErrno;
// prototypes of static functions
static int CheckRcode(int rcode, int errCode);
#define NITRO_SOCKET_ERROR -1
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
static int CheckRcode(int rcode, int errCode)
{
if(rcode >= 0)
return rcode;
GSINitroErrno = rcode;
return errCode;
}
int socket(int pf, int type, int protocol)
{
int rcode = SOC_Socket(pf, type, protocol);
return CheckRcode(rcode, INVALID_SOCKET);
}
int closesocket(SOCKET sock)
{
int rcode = SOC_Close(sock);
return CheckRcode(rcode, NITRO_SOCKET_ERROR);
}
int shutdown(SOCKET sock, int how)
{
int rcode = SOC_Shutdown(sock, how);
return CheckRcode(rcode, NITRO_SOCKET_ERROR);
}
int bind(SOCKET sock, const SOCKADDR* addr, int len)
{
SOCKADDR localAddr;
int rcode;
// with nitro, 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 = SOC_Bind(sock, &localAddr);
return CheckRcode(rcode, NITRO_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 = SOC_Connect(sock, &remoteAddr);
return CheckRcode(rcode, NITRO_SOCKET_ERROR);
}
int listen(SOCKET sock, int backlog)
{
int rcode = SOC_Listen(sock, backlog);
return CheckRcode(rcode, NITRO_SOCKET_ERROR);
}
SOCKET accept(SOCKET sock, SOCKADDR* addr, int* len)
{
int rcode;
addr->len = (u8)*len;
rcode = SOC_Accept(sock, addr);
*len = addr->len;
return CheckRcode(rcode, NITRO_SOCKET_ERROR);
}
int recv(SOCKET sock, char* buf, int len, int flags)
{
int rcode = SOC_Recv(sock, buf, len, flags);
return CheckRcode(rcode, NITRO_SOCKET_ERROR);
}
int recvfrom(SOCKET sock, char* buf, int len, int flags, SOCKADDR* addr, int* fromlen)
{
int rcode;
addr->len = (u8)*fromlen;
rcode = SOC_RecvFrom(sock, buf, len, flags, addr);
*fromlen = addr->len;
return CheckRcode(rcode, NITRO_SOCKET_ERROR);
}
SOCKET send(SOCKET sock, const char* buf, int len, int flags)
{
int rcode = SOC_Send(sock, buf, len, flags);
return CheckRcode(rcode, NITRO_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 = SOC_SendTo(sock, buf, len, flags, &remoteAddr);
return CheckRcode(rcode, NITRO_SOCKET_ERROR);
}
int getsockopt(SOCKET sock, int level, int optname, char* optval, int* optlen)
{
int rcode = SOC_GetSockOpt(sock, level, optname, optval, optlen);
return CheckRcode(rcode, NITRO_SOCKET_ERROR);
}
SOCKET setsockopt(SOCKET sock, int level, int optname, const char* optval, int optlen)
{
int rcode = SOC_SetSockOpt(sock, level, optname, optval, optlen);
return CheckRcode(rcode, NITRO_SOCKET_ERROR);
}
int getsockname(SOCKET sock, SOCKADDR* addr, int* len)
{
int rcode;
addr->len = (u8)*len;
rcode = SOC_GetSockName(sock, addr);
*len = addr->len;
return CheckRcode(rcode, NITRO_SOCKET_ERROR);
}
unsigned long inet_addr(const char* name)
{
int rcode;
SOInAddr addr;
rcode = SOC_InetAtoN(name, &addr);
if(rcode == FALSE)
return INADDR_NONE;
return addr.addr;
}
int GOAGetLastError(SOCKET sock)
{
GSI_UNUSED(sock);
return GSINitroErrno;
}
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 |= SOC_POLLRDNORM;
if(theWriteFlag != NULL)
pollFD.events |= SOC_POLLWRNORM;
pollFD.revents = 0;
rcode = SOC_Poll(&pollFD, 1, 0);
if(rcode < 0)
return NITRO_SOCKET_ERROR;
if(theReadFlag != NULL)
{
if((rcode > 0) && (pollFD.revents & (SOC_POLLRDNORM|SOC_POLLHUP)))
*theReadFlag = 1;
else
*theReadFlag = 0;
}
if(theWriteFlag != NULL)
{
if((rcode > 0) && (pollFD.revents & SOC_POLLWRNORM))
*theWriteFlag = 1;
else
*theWriteFlag = 0;
}
if(theExceptFlag != NULL)
{
if((rcode > 0) && (pollFD.revents & SOC_POLLERR))
*theExceptFlag = 1;
else
*theExceptFlag = 0;
}
return rcode;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#endif // _NITRO