X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=lhnet.c;h=bbab448016a81956574319ac063294575ed755c3;hb=aa150f38ef79b17d32b520bebb5fe5125c7b3ced;hp=89b47df48075874255fb358863215b64f4128115;hpb=aa33d8f8642530f7f266d6cde1422f95aa74b2be;p=xonotic%2Fdarkplaces.git diff --git a/lhnet.c b/lhnet.c index 89b47df4..bbab4480 100644 --- a/lhnet.c +++ b/lhnet.c @@ -17,6 +17,10 @@ #include #endif +#ifdef __MORPHOS__ +#include +#endif + // for Z_Malloc/Z_Free in quake #ifndef STANDALONETEST #include "quakedef.h" @@ -32,11 +36,33 @@ #include "lhnet.h" +#if defined(WIN32) +#define EWOULDBLOCK WSAEWOULDBLOCK +#define ECONNREFUSED WSAECONNREFUSED + +#define SOCKETERRNO WSAGetLastError() + +#define SOCKLEN_T int +#elif defined(__MORPHOS__) +#define ioctlsocket IoctlSocket +#define closesocket CloseSocket +#define SOCKETERRNO Errno() + +#define SOCKLEN_T int +#else +#define ioctlsocket ioctl +#define closesocket close +#define SOCKETERRNO errno + +#define SOCKLEN_T socklen_t +#endif + // to make LHNETADDRESS_FromString resolve repeated hostnames faster, cache them #define MAX_NAMECACHE 64 static struct namecache_s { lhnetaddress_t address; + double expirationtime; char name[64]; } namecache[MAX_NAMECACHE]; @@ -126,7 +152,7 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def for (i = 0;i < MAX_NAMECACHE;i++) if (!strcmp(namecache[i].name, name)) break; - if (i < MAX_NAMECACHE) + if (i < MAX_NAMECACHE && Sys_DoubleTime() < namecache[i].expirationtime) { *address = namecache[i].address; if (address->addresstype == LHNETADDRESSTYPE_INET6) @@ -155,6 +181,7 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def for (i = 0;i < (int)sizeof(namecache[namecacheposition].name)-1 && name[i];i++) namecache[namecacheposition].name[i] = name[i]; namecache[namecacheposition].name[i] = 0; + namecache[namecacheposition].expirationtime = Sys_DoubleTime() + 12 * 3600; // 12 hours namecache[namecacheposition].address = *address; namecacheposition = (namecacheposition + 1) % MAX_NAMECACHE; #ifdef STANDALONETEST @@ -172,6 +199,7 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def for (i = 0;i < (int)sizeof(namecache[namecacheposition].name)-1 && name[i];i++) namecache[namecacheposition].name[i] = name[i]; namecache[namecacheposition].name[i] = 0; + namecache[namecacheposition].expirationtime = Sys_DoubleTime() + 12 * 3600; // 12 hours namecache[namecacheposition].address = *address; namecacheposition = (namecacheposition + 1) % MAX_NAMECACHE; #ifdef STANDALONETEST @@ -186,6 +214,7 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def for (i = 0;i < (int)sizeof(namecache[namecacheposition].name)-1 && name[i];i++) namecache[namecacheposition].name[i] = name[i]; namecache[namecacheposition].name[i] = 0; + namecache[namecacheposition].expirationtime = Sys_DoubleTime() + 12 * 3600; // 12 hours namecache[namecacheposition].address.addresstype = LHNETADDRESSTYPE_NONE; namecacheposition = (namecacheposition + 1) % MAX_NAMECACHE; return 0; @@ -496,17 +525,12 @@ lhnetsocket_t *LHNET_OpenSocket_Connectionless(lhnetaddress_t *address) { #ifdef WIN32 u_long _true = 1; - if (ioctlsocket(lhnetsocket->inetsocket, FIONBIO, &_true) != -1) #else char _true = 1; - if (ioctl(lhnetsocket->inetsocket, FIONBIO, &_true) != -1) #endif + if (ioctlsocket(lhnetsocket->inetsocket, FIONBIO, &_true) != -1) { -#ifdef WIN32 - int namelen; -#else - socklen_t namelen; -#endif + SOCKLEN_T namelen; namelen = address->addresstype == LHNETADDRESSTYPE_INET6 ? sizeof(lhnetsocket->address.addressdata.inet6) : sizeof(lhnetsocket->address.addressdata.inet4); if (bind(lhnetsocket->inetsocket, (struct sockaddr *)&lhnetsocket->address.addressdata, namelen) != -1) { @@ -525,11 +549,7 @@ lhnetsocket_t *LHNET_OpenSocket_Connectionless(lhnetaddress_t *address) } else Con_Printf("LHNET_OpenSocket_Connectionless: ioctlsocket returned error: %s\n", LHNETPRIVATE_StrError()); -#ifdef WIN32 closesocket(lhnetsocket->inetsocket); -#else - close(lhnetsocket->inetsocket); -#endif } else Con_Printf("LHNET_OpenSocket_Connectionless: socket returned error: %s\n", LHNETPRIVATE_StrError()); @@ -562,11 +582,7 @@ void LHNET_CloseSocket(lhnetsocket_t *lhnetsocket) // no special close code for loopback, just inet if (lhnetsocket->address.addresstype == LHNETADDRESSTYPE_INET4 || lhnetsocket->address.addresstype == LHNETADDRESSTYPE_INET6) { -#ifdef WIN32 closesocket(lhnetsocket->inetsocket); -#else - close(lhnetsocket->inetsocket); -#endif } #ifdef WIN32 if (lhnet_socketlist.next == &lhnet_socketlist && lhnet_didWSAStartup) @@ -645,26 +661,15 @@ int LHNET_Read(lhnetsocket_t *lhnetsocket, void *content, int maxcontentlength, } else if (value == -1) { -#ifdef WIN32 - int e = WSAGetLastError(); - if (e == WSAEWOULDBLOCK) + int e = SOCKETERRNO; + if (e == EWOULDBLOCK) return 0; switch (e) - { - case WSAECONNREFUSED: - Con_Print("Connection refused\n"); - return 0; - } -#else - if (errno == EWOULDBLOCK) - return 0; - switch (errno) { case ECONNREFUSED: Con_Print("Connection refused\n"); return 0; } -#endif } } else if (lhnetsocket->address.addresstype == LHNETADDRESSTYPE_INET6) @@ -680,26 +685,15 @@ int LHNET_Read(lhnetsocket_t *lhnetsocket, void *content, int maxcontentlength, } else if (value == -1) { -#ifdef WIN32 - int e = WSAGetLastError(); - if (e == WSAEWOULDBLOCK) + int e = SOCKETERRNO; + if (e == EWOULDBLOCK) return 0; switch (e) - { - case WSAECONNREFUSED: - Con_Print("Connection refused\n"); - return 0; - } -#else - if (errno == EWOULDBLOCK) - return 0; - switch (errno) { case ECONNREFUSED: Con_Print("Connection refused\n"); return 0; } -#endif } } return value; @@ -736,14 +730,8 @@ int LHNET_Write(lhnetsocket_t *lhnetsocket, const void *content, int contentleng value = sendto(lhnetsocket->inetsocket, content, contentlength, 0, (struct sockaddr *)&address->addressdata.inet4, sizeof(address->addressdata.inet4)); if (value == -1) { -#ifdef WIN32 - int e = WSAGetLastError(); - if (e == WSAEWOULDBLOCK) - return 0; -#else - if (errno == EWOULDBLOCK) + if (SOCKETERRNO == EWOULDBLOCK) return 0; -#endif } } else if (lhnetsocket->address.addresstype == LHNETADDRESSTYPE_INET6) @@ -751,14 +739,8 @@ int LHNET_Write(lhnetsocket_t *lhnetsocket, const void *content, int contentleng value = sendto(lhnetsocket->inetsocket, content, contentlength, 0, (struct sockaddr *)&address->addressdata.inet6, sizeof(address->addressdata.inet6)); if (value == -1) { -#ifdef WIN32 - int e = WSAGetLastError(); - if (e == WSAEWOULDBLOCK) + if (SOCKETERRNO == EWOULDBLOCK) return 0; -#else - if (errno == EWOULDBLOCK) - return 0; -#endif } } return value;