]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - lhnet.c
colormod values above 1 1 1 should work properly with r_glsl now
[xonotic/darkplaces.git] / lhnet.c
diff --git a/lhnet.c b/lhnet.c
index 5beafc77a41c6a2ea5a1d759e7353f7e2b9cd680..2546ff3b83fffa9ff4808e1a96fb71c417b67838 100644 (file)
--- a/lhnet.c
+++ b/lhnet.c
@@ -1,6 +1,10 @@
 
 // Written by Forest Hale 2003-06-15 and placed into public domain.
 
+#ifndef STANDALONETEST
+#include "quakedef.h"
+#endif
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <time.h>
@@ -23,7 +27,6 @@
 
 // for Z_Malloc/Z_Free in quake
 #ifndef STANDALONETEST
-#include "quakedef.h"
 #include "zone.h"
 #include "sys.h"
 #include "netconn.h"
 
 #define SOCKETERRNO WSAGetLastError()
 
+#define IOC_VENDOR 0x18000000
+#define _WSAIOW(x,y) (IOC_IN|(x)|(y))
+#define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12)
+
 #define SOCKLEN_T int
 #elif defined(__MORPHOS__)
 #define ioctlsocket IoctlSocket
@@ -104,7 +111,7 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def
        struct hostent *hostentry;
        const char *colon;
        char name[128];
-       if (!address || !string)
+       if (!address || !string || !*string)
                return 0;
        memset(address, 0, sizeof(*address));
        address->addresstype = LHNETADDRESSTYPE_NONE;
@@ -134,7 +141,9 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def
                return 1;
        }
        // try to parse as dotted decimal ipv4 address first
-       if (sscanf(name, "%d.%d.%d.%d", &d1, &d2, &d3, &d4) == 4 && (unsigned int)d1 < 256 && (unsigned int)d2 < 256 && (unsigned int)d3 < 256 && (unsigned int)d4 < 256)
+       // note this supports partial ip addresses
+       d1 = d2 = d3 = d4 = 0;
+       if (sscanf(name, "%d.%d.%d.%d", &d1, &d2, &d3, &d4) >= 1 && (unsigned int)d1 < 256 && (unsigned int)d2 < 256 && (unsigned int)d3 < 256 && (unsigned int)d4 < 256)
        {
                // parsed a valid ipv4 address
                address->addresstype = LHNETADDRESSTYPE_INET4;
@@ -155,7 +164,7 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def
 #ifdef STANDALONETEST
        if (i < MAX_NAMECACHE)
 #else
-       if (i < MAX_NAMECACHE && Sys_DoubleTime() < namecache[i].expirationtime)
+       if (i < MAX_NAMECACHE && realtime < namecache[i].expirationtime)
 #endif
        {
                *address = namecache[i].address;
@@ -186,7 +195,7 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def
                                namecache[namecacheposition].name[i] = name[i];
                        namecache[namecacheposition].name[i] = 0;
 #ifndef STANDALONETEST
-                       namecache[namecacheposition].expirationtime = Sys_DoubleTime() + 12 * 3600; // 12 hours
+                       namecache[namecacheposition].expirationtime = realtime + 12 * 3600; // 12 hours
 #endif
                        namecache[namecacheposition].address = *address;
                        namecacheposition = (namecacheposition + 1) % MAX_NAMECACHE;
@@ -206,7 +215,7 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def
                                namecache[namecacheposition].name[i] = name[i];
                        namecache[namecacheposition].name[i] = 0;
 #ifndef STANDALONETEST
-                       namecache[namecacheposition].expirationtime = Sys_DoubleTime() + 12 * 3600; // 12 hours
+                       namecache[namecacheposition].expirationtime = realtime + 12 * 3600; // 12 hours
 #endif
                        namecache[namecacheposition].address = *address;
                        namecacheposition = (namecacheposition + 1) % MAX_NAMECACHE;
@@ -223,7 +232,7 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def
                namecache[namecacheposition].name[i] = name[i];
        namecache[namecacheposition].name[i] = 0;
 #ifndef STANDALONETEST
-       namecache[namecacheposition].expirationtime = Sys_DoubleTime() + 12 * 3600; // 12 hours
+       namecache[namecacheposition].expirationtime = realtime + 12 * 3600; // 12 hours
 #endif
        namecache[namecacheposition].address.addresstype = LHNETADDRESSTYPE_NONE;
        namecacheposition = (namecacheposition + 1) % MAX_NAMECACHE;
@@ -252,7 +261,7 @@ int LHNETADDRESS_ToString(const lhnetaddress_t *address, char *string, int strin
                {
                        if (stringbuffersize >= 6)
                        {
-                               strcpy(string, "local");
+                               memcpy(string, "local", 6);
                                return 1;
                        }
                }
@@ -493,6 +502,28 @@ static const char *LHNETPRIVATE_StrError(void)
 #endif
 }
 
+void LHNET_SleepUntilPacket_Microseconds(int microseconds)
+{
+       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;
+                       FD_SET((unsigned int)s->inetsocket, &fdreadset);
+               }
+       }
+       tv.tv_sec = microseconds / 1000000;
+       tv.tv_usec = microseconds % 1000000;
+       select(lastfd + 1, &fdreadset, NULL, NULL, &tv);
+}
+
 lhnetsocket_t *LHNET_OpenSocket_Connectionless(lhnetaddress_t *address)
 {
        lhnetsocket_t *lhnetsocket, *s;
@@ -547,6 +578,7 @@ lhnetsocket_t *LHNET_OpenSocket_Connectionless(lhnetaddress_t *address)
                                {
 #ifdef WIN32
                                        u_long _true = 1;
+                                       u_long _false = 0;
 #else
                                        char _true = 1;
 #endif
@@ -564,6 +596,10 @@ lhnetsocket_t *LHNET_OpenSocket_Connectionless(lhnetaddress_t *address)
                                                        lhnetsocket->prev = lhnetsocket->next->prev;
                                                        lhnetsocket->next->prev = lhnetsocket;
                                                        lhnetsocket->prev->next = lhnetsocket;
+#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());
+#endif
                                                        return lhnetsocket;
                                                }
                                                else
@@ -642,7 +678,7 @@ int LHNET_Read(lhnetsocket_t *lhnetsocket, void *content, int maxcontentlength,
                                continue;
                        }
 #ifndef STANDALONETEST
-                       if (cl_netlocalping.value && (Sys_DoubleTime() - cl_netlocalping.value * (1.0 / 2000.0)) < p->sentdoubletime)
+                       if (cl_netlocalping.value && (realtime - cl_netlocalping.value * (1.0 / 2000.0)) < p->sentdoubletime)
                                continue;
 #endif
                        if (value == 0 && p->destinationport == lhnetsocket->address.addressdata.loop.port)
@@ -738,7 +774,7 @@ int LHNET_Write(lhnetsocket_t *lhnetsocket, const void *content, int contentleng
                p->next->prev = p;
                p->prev->next = p;
 #ifndef STANDALONETEST
-               p->sentdoubletime = Sys_DoubleTime();
+               p->sentdoubletime = realtime;
 #endif
                value = contentlength;
        }
@@ -749,7 +785,7 @@ int LHNET_Write(lhnetsocket_t *lhnetsocket, const void *content, int contentleng
                {
                        if (SOCKETERRNO == EWOULDBLOCK)
                                return 0;
-                       Con_Printf("LHNET_Read: sendto returned error: %s\n", LHNETPRIVATE_StrError());
+                       Con_Printf("LHNET_Write: sendto returned error: %s\n", LHNETPRIVATE_StrError());
                }
        }
        else if (lhnetsocket->address.addresstype == LHNETADDRESSTYPE_INET6)
@@ -759,7 +795,7 @@ int LHNET_Write(lhnetsocket_t *lhnetsocket, const void *content, int contentleng
                {
                        if (SOCKETERRNO == EWOULDBLOCK)
                                return 0;
-                       Con_Printf("LHNET_Read: sendto returned error: %s\n", LHNETPRIVATE_StrError());
+                       Con_Printf("LHNET_Write: sendto returned error: %s\n", LHNETPRIVATE_StrError());
                }
        }
        return value;
@@ -769,7 +805,7 @@ int LHNET_Write(lhnetsocket_t *lhnetsocket, const void *content, int contentleng
 int main(int argc, char **argv)
 {
 #if 1
-       char *buffer = "socket to socket test successful", buffer2[1024];
+       char *buffer = "test", buffer2[1024];
        int blen = strlen(buffer);
        int b2len = 1024;
        lhnetsocket_t *sock1;
@@ -777,24 +813,26 @@ int main(int argc, char **argv)
        lhnetaddress_t myaddy1;
        lhnetaddress_t myaddy2;
        lhnetaddress_t myaddy3;
+       lhnetaddress_t localhostaddy1;
+       lhnetaddress_t localhostaddy2;
        int test1;
        int test2;
 
-       strcpy(buffer2, "socket to socket test failed");
-
        printf("calling LHNET_Init\n");
        LHNET_Init();
 
        printf("calling LHNET_FromPort twice to create two local addresses\n");
        LHNETADDRESS_FromPort(&myaddy1, LHNETADDRESSTYPE_INET4, 4000);
        LHNETADDRESS_FromPort(&myaddy2, LHNETADDRESSTYPE_INET4, 4001);
+       LHNETADDRESS_FromString(&localhostaddy1, "127.0.0.1", 4000);
+       LHNETADDRESS_FromString(&localhostaddy2, "127.0.0.1", 4001);
 
        printf("calling LHNET_OpenSocket_Connectionless twice to create two local sockets\n");
        sock1 = LHNET_OpenSocket_Connectionless(&myaddy1);
        sock2 = LHNET_OpenSocket_Connectionless(&myaddy2);
 
        printf("calling LHNET_Write to send a packet from the first socket to the second socket\n");
-       test1 = LHNET_Write(sock1, buffer, blen, &myaddy2);
+       test1 = LHNET_Write(sock1, buffer, blen, &localhostaddy2);
        printf("sleeping briefly\n");
 #ifdef WIN32
        Sleep (100);
@@ -802,8 +840,12 @@ int main(int argc, char **argv)
        usleep (100000);
 #endif
        printf("calling LHNET_Read on the second socket to read the packet sent from the first socket\n");
-       test2 = LHNET_Read(sock2, buffer2, b2len, &myaddy3);
-       Con_Printf("%s\n", buffer2);
+       test2 = LHNET_Read(sock2, buffer2, b2len - 1, &myaddy3);
+       if (test2 > 0)
+               Con_Printf("socket to socket test succeeded\n");
+       else
+               Con_Printf("socket to socket test failed\n");
+
 #ifdef WIN32
        printf("press any key to exit\n");
        getchar();