X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=lhnet.c;h=05fd9802a971edc6daa1ad4840291ef3e0f279b9;hb=4dcdfb3370a11f338014164eec075b7fd7bb57b5;hp=71b9cef5d5e26cca3ed7e1a4260c42b0be2e24a5;hpb=d1c3f1065fde02ed39b7eecc2d9b9a637388d091;p=xonotic%2Fdarkplaces.git diff --git a/lhnet.c b/lhnet.c index 71b9cef5..05fd9802 100644 --- a/lhnet.c +++ b/lhnet.c @@ -2,13 +2,16 @@ // Written by Ashley Rose Hale (LadyHavoc) 2003-06-15 and placed into public domain. #ifdef WIN32 -#ifdef _MSC_VER -#pragma comment(lib, "ws2_32.lib") -#endif +# ifdef _MSC_VER +# pragma comment(lib, "ws2_32.lib") +# endif # ifndef NOSUPPORTIPV6 // Windows XP or higher is required for getaddrinfo, but the inclusion of wspiapi provides fallbacks for older versions -# define _WIN32_WINNT 0x0501 +# define _WIN32_WINNT 0x0501 # endif +// To increase FD_SETSIZE (defaults to 64 on Windows) +// it must be defined before the first inclusion of winsock2.h +# define FD_SETSIZE 1024 // Matches Linux and BSD defaults # include # include # ifdef USE_WSPIAPI_H @@ -17,7 +20,7 @@ #endif #ifndef STANDALONETEST -#include "quakedef.h" +#include "darkplaces.h" #endif #include @@ -607,14 +610,6 @@ int LHNETADDRESS_ToString(const lhnetaddress_t *vaddress, char *string, int stri return 0; } -int LHNETADDRESS_GetAddressType(const lhnetaddress_t *address) -{ - if (address) - return address->addresstype; - else - return LHNETADDRESSTYPE_NONE; -} - const char *LHNETADDRESS_GetInterfaceName(const lhnetaddress_t *vaddress, char *ifname, size_t ifnamelength) { #ifndef NOSUPPORTIPV6 @@ -719,12 +714,12 @@ typedef struct lhnetpacket_s #ifndef STANDALONETEST double sentdoubletime; #endif - struct lhnetpacket_s *next, *prev; + llist_t list; } lhnetpacket_t; static int lhnet_active; -static lhnetsocket_t lhnet_socketlist; +lhnetsocket_t lhnet_socketlist; static lhnetpacket_t lhnet_packetlist; static int lhnet_default_dscp = 0; #ifdef WIN32 @@ -736,8 +731,8 @@ void LHNET_Init(void) { if (lhnet_active) return; - lhnet_socketlist.next = lhnet_socketlist.prev = &lhnet_socketlist; - lhnet_packetlist.next = lhnet_packetlist.prev = &lhnet_packetlist; + List_Create(&lhnet_socketlist.list); + List_Create(&lhnet_packetlist.list); lhnet_active = 1; #ifdef WIN32 lhnet_didWSAStartup = !WSAStartup(MAKEWORD(1, 1), &lhnet_winsockdata); @@ -760,16 +755,15 @@ int LHNET_DefaultDSCP(int dscp) void LHNET_Shutdown(void) { - lhnetpacket_t *p; + lhnetsocket_t *s, *snext; + lhnetpacket_t *p, *pnext; if (!lhnet_active) return; - while (lhnet_socketlist.next != &lhnet_socketlist) - LHNET_CloseSocket(lhnet_socketlist.next); - while (lhnet_packetlist.next != &lhnet_packetlist) + List_For_Each_Entry_Safe(s, snext, &lhnet_socketlist.list, lhnetsocket_t, list) + LHNET_CloseSocket(s); + List_For_Each_Entry_Safe(p, pnext, &lhnet_packetlist.list, lhnetpacket_t, list) { - p = lhnet_packetlist.next; - p->prev->next = p->next; - p->next->prev = p->prev; + List_Delete(&p->list); Z_Free(p); } #ifdef WIN32 @@ -840,36 +834,6 @@ static const char *LHNETPRIVATE_StrError(void) #endif } -void LHNET_SleepUntilPacket_Microseconds(int microseconds) -{ -#ifdef FD_SET - fd_set fdreadset; - struct timeval tv; - int lastfd; - lhnetsocket_t *s; - FD_ZERO(&fdreadset); - lastfd = 0; - for (s = lhnet_socketlist.next;s != &lhnet_socketlist;s = s->next) - { - if (s->address.addresstype == LHNETADDRESSTYPE_INET4 || s->address.addresstype == LHNETADDRESSTYPE_INET6) - { - if (lastfd < s->inetsocket) - lastfd = s->inetsocket; -#if defined(WIN32) && !defined(_MSC_VER) - FD_SET((int)s->inetsocket, &fdreadset); -#else - FD_SET((unsigned int)s->inetsocket, &fdreadset); -#endif - } - } - tv.tv_sec = microseconds / 1000000; - tv.tv_usec = microseconds % 1000000; - select(lastfd + 1, &fdreadset, NULL, NULL, &tv); -#else - Sys_Sleep(microseconds); -#endif -} - lhnetsocket_t *LHNET_OpenSocket_Connectionless(lhnetaddress_t *address) { lhnetsocket_t *lhnetsocket, *s; @@ -893,7 +857,7 @@ lhnetsocket_t *LHNET_OpenSocket_Connectionless(lhnetaddress_t *address) lhnetsocket->address.port = 1024; for (;;) { - for (s = lhnet_socketlist.next;s != &lhnet_socketlist;s = s->next) + List_For_Each_Entry(s, &lhnet_socketlist.list, lhnetsocket_t, list) if (s->address.addresstype == lhnetsocket->address.addresstype && s->address.port == lhnetsocket->address.port) break; if (s == &lhnet_socketlist) @@ -902,15 +866,12 @@ lhnetsocket_t *LHNET_OpenSocket_Connectionless(lhnetaddress_t *address) } } // check if the port is available - for (s = lhnet_socketlist.next;s != &lhnet_socketlist;s = s->next) + List_For_Each_Entry(s, &lhnet_socketlist.list, lhnetsocket_t, list) if (s->address.addresstype == lhnetsocket->address.addresstype && s->address.port == lhnetsocket->address.port) break; if (s == &lhnet_socketlist && lhnetsocket->address.port != 0) { - lhnetsocket->next = &lhnet_socketlist; - lhnetsocket->prev = lhnetsocket->next->prev; - lhnetsocket->next->prev = lhnetsocket; - lhnetsocket->prev->next = lhnetsocket; + List_Add_Tail(&lhnetsocket->list, &lhnet_socketlist.list); return lhnetsocket; } break; @@ -1018,10 +979,7 @@ lhnetsocket_t *LHNET_OpenSocket_Connectionless(lhnetaddress_t *address) } } #endif - lhnetsocket->next = &lhnet_socketlist; - lhnetsocket->prev = lhnetsocket->next->prev; - lhnetsocket->next->prev = lhnetsocket; - lhnetsocket->prev->next = lhnetsocket; + List_Add_Tail(&lhnetsocket->list, &lhnet_socketlist.list); #ifdef WIN32 if (ioctlsocket(lhnetsocket->inetsocket, SIO_UDP_CONNRESET, &_false) == -1) Con_DPrintf("LHNET_OpenSocket_Connectionless: ioctlsocket SIO_UDP_CONNRESET returned error: %s\n", LHNETPRIVATE_StrError()); @@ -1060,14 +1018,7 @@ void LHNET_CloseSocket(lhnetsocket_t *lhnetsocket) { if (lhnetsocket) { - // unlink from socket list - if (lhnetsocket->next == NULL) - return; // invalid! - lhnetsocket->next->prev = lhnetsocket->prev; - lhnetsocket->prev->next = lhnetsocket->next; - lhnetsocket->next = NULL; - lhnetsocket->prev = NULL; - + List_Delete(&lhnetsocket->list); // no special close code for loopback, just inet if (lhnetsocket->address.addresstype == LHNETADDRESSTYPE_INET4 || lhnetsocket->address.addresstype == LHNETADDRESSTYPE_INET6) { @@ -1098,14 +1049,12 @@ int LHNET_Read(lhnetsocket_t *lhnetsocket, void *content, int maxcontentlength, // scan for any old packets to timeout while searching for a packet // that is waiting to be delivered to this socket currenttime = time(NULL); - for (p = lhnet_packetlist.next;p != &lhnet_packetlist;p = pnext) + List_For_Each_Entry_Safe(p, pnext, &lhnet_packetlist.list, lhnetpacket_t, list) { - pnext = p->next; if (p->timeout < currenttime) { // unlink and free - p->next->prev = p->prev; - p->prev->next = p->next; + List_Delete(&p->list); Z_Free(p); continue; } @@ -1126,8 +1075,7 @@ int LHNET_Read(lhnetsocket_t *lhnetsocket, void *content, int maxcontentlength, else value = -1; // unlink and free - p->next->prev = p->prev; - p->prev->next = p->next; + List_Delete(&p->list); Z_Free(p); } } @@ -1207,10 +1155,8 @@ int LHNET_Write(lhnetsocket_t *lhnetsocket, const void *content, int contentleng p->sourceport = lhnetsocket->address.port; p->destinationport = address->port; p->timeout = time(NULL) + 10; - p->next = &lhnet_packetlist; - p->prev = p->next->prev; - p->next->prev = p; - p->prev->next = p; + List_Add_Tail(&p->list, &lhnet_packetlist.list); + #ifndef STANDALONETEST p->sentdoubletime = host.realtime; #endif