]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - net_dgrm.c
corrected call to Image_HasAlpha to be Image_CheckAlpha
[xonotic/darkplaces.git] / net_dgrm.c
index ede9580642c12dc2e95e66f22598d5850c816714..b3f7fae2c4d67a41bc63a311506051ef0e4ab17a 100644 (file)
@@ -136,7 +136,7 @@ void NET_Ban_f (void)
                        break;
 
                case 2:
-                       if (Q_strcasecmp(Cmd_Argv(1), "off") == 0)
+                       if (strcasecmp(Cmd_Argv(1), "off") == 0)
                                banAddr = 0x00000000;
                        else
                                banAddr = inet_addr(Cmd_Argv(1));
@@ -330,7 +330,7 @@ int Datagram_GetMessage (qsocket_t *sock)
                if (length == 0)
                        break;
 
-               if (length == -1)
+               if ((int)length == -1)
                {
                        Con_Printf("Read error\n");
                        return -1;
@@ -338,11 +338,9 @@ int        Datagram_GetMessage (qsocket_t *sock)
 
                if (sfunc.AddrCompare(&readaddr, &sock->addr) != 0)
                {
-#ifdef DEBUG
                        Con_DPrintf("Forged packet received\n");
                        Con_DPrintf("Expected: %s\n", StrAddr (&sock->addr));
                        Con_DPrintf("Received: %s\n", StrAddr (&readaddr));
-#endif
                        continue;
                }
 
@@ -491,7 +489,7 @@ void NET_Stats_f (void)
        else
        {
                for (s = net_activeSockets; s; s = s->next)
-                       if (Q_strcasecmp(Cmd_Argv(1), s->address) == 0)
+                       if (strcasecmp(Cmd_Argv(1), s->address) == 0)
                                break;
                if (s == NULL)
                        return;
@@ -526,7 +524,7 @@ static void Test_Poll(void)
        while (1)
        {
                len = dfunc.Read (testSocket, net_message.data, net_message.maxsize, &clientaddr);
-               if (len < sizeof(int))
+               if (len < (int)sizeof(int))
                        break;
 
                net_message.cursize = len;
@@ -536,7 +534,7 @@ static void Test_Poll(void)
                MSG_ReadLong();
                if (control == -1)
                        break;
-               if ((control & (~NETFLAG_LENGTH_MASK)) !=  NETFLAG_CTL)
+               if ((control & (~NETFLAG_LENGTH_MASK)) != (int)NETFLAG_CTL)
                        break;
                if ((control & NETFLAG_LENGTH_MASK) != len)
                        break;
@@ -581,7 +579,7 @@ static void Test_f (void)
        if (host && hostCacheCount)
        {
                for (n = 0; n < hostCacheCount; n++)
-                       if (Q_strcasecmp (host, hostcache[n].name) == 0)
+                       if (strcasecmp (host, hostcache[n].name) == 0)
                        {
                                if (hostcache[n].driver != myDriverLevel)
                                        continue;
@@ -650,7 +648,7 @@ static void Test2_Poll(void)
        name[0] = 0;
 
        len = dfunc.Read (test2Socket, net_message.data, net_message.maxsize, &clientaddr);
-       if (len < sizeof(int))
+       if (len < (int)sizeof(int))
                goto Reschedule;
 
        net_message.cursize = len;
@@ -660,7 +658,7 @@ static void Test2_Poll(void)
        MSG_ReadLong();
        if (control == -1)
                goto Error;
-       if ((control & (~NETFLAG_LENGTH_MASK)) !=  NETFLAG_CTL)
+       if ((control & (~NETFLAG_LENGTH_MASK)) != (int)NETFLAG_CTL)
                goto Error;
        if ((control & NETFLAG_LENGTH_MASK) != len)
                goto Error;
@@ -711,7 +709,7 @@ static void Test2_f (void)
        if (host && hostCacheCount)
        {
                for (n = 0; n < hostCacheCount; n++)
-                       if (Q_strcasecmp (host, hostcache[n].name) == 0)
+                       if (strcasecmp (host, hostcache[n].name) == 0)
                        {
                                if (hostcache[n].driver != myDriverLevel)
                                        continue;
@@ -841,16 +839,16 @@ static qsocket_t *_Datagram_CheckNewConnections (void)
        SZ_Clear(&net_message);
 
        len = dfunc.Read (acceptsock, net_message.data, net_message.maxsize, &clientaddr);
-       if (len < sizeof(int))
+       if (len < (int)sizeof(int))
                return NULL;
        net_message.cursize = len;
 
        MSG_BeginReading ();
        control = BigLong(*((int *)net_message.data));
        MSG_ReadLong();
-       
+
        // Messages starting by 0xFFFFFFFF are master server messages
-       if (control == 0xFFFFFFFF)
+       if ((unsigned int)control == 0xFFFFFFFF)
        {
                int responsesize = Master_HandleMessage();
                if (responsesize > 0)
@@ -860,7 +858,7 @@ static qsocket_t *_Datagram_CheckNewConnections (void)
                }
                return NULL;
        }
-       if ((control & (~NETFLAG_LENGTH_MASK)) !=  NETFLAG_CTL)
+       if ((control & (~NETFLAG_LENGTH_MASK)) != (int)NETFLAG_CTL)
                return NULL;
        if ((control & NETFLAG_LENGTH_MASK) != len)
                return NULL;
@@ -918,7 +916,7 @@ static qsocket_t *_Datagram_CheckNewConnections (void)
                MSG_WriteByte(&net_message, playerNumber);
                MSG_WriteString(&net_message, client->name);
                MSG_WriteLong(&net_message, client->colors);
-               MSG_WriteLong(&net_message, (int)client->edict->v.frags);
+               MSG_WriteLong(&net_message, (int)client->edict->v->frags);
                MSG_WriteLong(&net_message, (int)(net_time - client->netconnection->connecttime));
                MSG_WriteString(&net_message, client->netconnection->address);
                *((int *)net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK));
@@ -1004,7 +1002,7 @@ static qsocket_t *_Datagram_CheckNewConnections (void)
                ret = dfunc.AddrCompare(&clientaddr, &s->addr);
                if (ret >= 0)
                {
-                       // is this a duplicate connection reqeust?
+                       // is this a duplicate connection request?
                        if (ret == 0 && net_time - s->connecttime < 2.0)
                        {
                                // yes, so send a duplicate reply
@@ -1015,6 +1013,13 @@ static qsocket_t *_Datagram_CheckNewConnections (void)
                                dfunc.GetSocketAddr(s->socket, &newaddr);
                                MSG_WriteLong(&net_message, dfunc.GetSocketPort(&newaddr));
                                *((int *)net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK));
+                               // LordHavoc: send from s->socket instead of acceptsock, this
+                               // way routers usually identify the connection correctly
+                               // (thanks to faded for provoking me to recite a lengthy
+                               // explanation of NAT nightmares, and realize this easy
+                               // workaround for quake)
+                               dfunc.Write (s->socket, net_message.data, net_message.cursize, &clientaddr);
+                               // LordHavoc: also send from acceptsock, for good measure
                                dfunc.Write (acceptsock, net_message.data, net_message.cursize, &clientaddr);
                                SZ_Clear(&net_message);
                                return NULL;
@@ -1072,6 +1077,12 @@ static qsocket_t *_Datagram_CheckNewConnections (void)
        dfunc.GetSocketAddr(newsock, &newaddr);
        MSG_WriteLong(&net_message, dfunc.GetSocketPort(&newaddr));
        *((int *)net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK));
+       // LordHavoc: send from sock->socket instead of acceptsock, this way routers
+       // usually identify the connection correctly (thanks to faded for provoking
+       // me to recite a lengthy explanation of NAT nightmares, and realize this
+       // easy workaround for quake)
+       dfunc.Write (sock->socket, net_message.data, net_message.cursize, &clientaddr);
+       // LordHavoc: also send from acceptsock, for good measure
        dfunc.Write (acceptsock, net_message.data, net_message.cursize, &clientaddr);
        SZ_Clear(&net_message);
 
@@ -1092,15 +1103,15 @@ qsocket_t *Datagram_CheckNewConnections (void)
 
 static qboolean Datagram_HandleServerInfo (struct qsockaddr *readaddr)
 {
-       struct qsockaddr myaddr;
+       //struct qsockaddr myaddr;
        int control;
        int c, n, i;
 
-       if (net_message.cursize < sizeof(int))
+       if (net_message.cursize < (int)sizeof(int))
                return false;
 
        // don't answer our own query
-       dfunc.GetSocketAddr (dfunc.controlSock, &myaddr);
+       //dfunc.GetSocketAddr (dfunc.controlSock, &myaddr);
        //if (dfunc.AddrCompare(readaddr, &myaddr) >= 0)
        //      return false;
 
@@ -1113,7 +1124,7 @@ static qboolean Datagram_HandleServerInfo (struct qsockaddr *readaddr)
        MSG_ReadLong();
        if (control == -1)
                return false;
-       if ((control & (~NETFLAG_LENGTH_MASK)) !=  NETFLAG_CTL)
+       if ((control & (~NETFLAG_LENGTH_MASK)) != (int)NETFLAG_CTL)
                return false;
        if ((control & NETFLAG_LENGTH_MASK) != net_message.cursize)
                return false;
@@ -1156,7 +1167,7 @@ static qboolean Datagram_HandleServerInfo (struct qsockaddr *readaddr)
        {
                if (i == n)
                        continue;
-               if (Q_strcasecmp (hostcache[n].name, hostcache[i].name) == 0)
+               if (strcasecmp (hostcache[n].name, hostcache[i].name) == 0)
                {
                        i = strlen(hostcache[n].name);
                        if (i < 15 && hostcache[n].name[i-1] > '8')
@@ -1228,25 +1239,20 @@ static qboolean _Datagram_SearchForInetHosts (const char *master)
                                portnum = atoi (port + 1);
                        if (!portnum)
                                portnum = MASTER_PORT;
-                       Con_DPrintf("Datagram_SearchForInetHosts: sending %d byte message to master %s\n", net_message.cursize, master);
+                       Con_DPrintf("Datagram_SearchForInetHosts: sending %d byte message to master %s port %i\n", net_message.cursize, master, portnum);
                        dfunc.SetSocketPort (&masteraddr, portnum);
-                       dfunc.Send (net_message.data, net_message.cursize, &masteraddr);
+                       dfunc.Write (dfunc.controlSock, net_message.data, net_message.cursize, &masteraddr);
                }
        }
 
-       while ((ret = dfunc.Recv (net_message.data, net_message.maxsize, &readaddr)) > 0)
-       {
-               net_message.cursize = ret;
-               Con_DPrintf("Datagram_SearchForInetHosts: Recv received %d byte message\n", net_message.cursize);
-               Master_ParseServerList (&dfunc);
-       }
-       
        while ((ret = dfunc.Read (dfunc.controlSock, net_message.data, net_message.maxsize, &readaddr)) > 0)
        {
                net_message.cursize = ret;
                Con_DPrintf("Datagram_SearchForInetHosts: Read received %d byte message\n", net_message.cursize);
                if (Datagram_HandleServerInfo (&readaddr))
                        result = true;
+               else
+                       Master_ParseServerList (&dfunc);
        }
 
        return result;
@@ -1264,7 +1270,7 @@ qboolean Datagram_SearchForInetHosts (const char *master)
                        if (_Datagram_SearchForInetHosts (master))
                                result = true;
        }
-       
+
        return result;
 }
 
@@ -1273,6 +1279,7 @@ static qsocket_t *_Datagram_Connect (const char *host)
 {
        struct qsockaddr sendaddr;
        struct qsockaddr readaddr;
+       struct qsockaddr testaddr;
        qsocket_t       *sock;
        int                     newsock;
        int                     ret;
@@ -1321,17 +1328,22 @@ static qsocket_t *_Datagram_Connect (const char *host)
                        if (ret > 0)
                        {
                                // is it from the right place?
-                               if (sfunc.AddrCompare(&readaddr, &sendaddr) != 0)
+                               // we don't care if the port matches (this adds support for
+                               // the NAT fix in the server inspired by faded)
+                               memcpy(&testaddr, &sendaddr, sizeof(struct qsockaddr));
+                               dfunc.SetSocketPort (&testaddr, dfunc.GetSocketPort(&readaddr));
+                               if (sfunc.AddrCompare(&readaddr, &testaddr) != 0)
                                {
-                                       Con_DPrintf("wrong reply address\n");
-                                       Con_DPrintf("Expected: %s\n", StrAddr (&sendaddr));
-                                       Con_DPrintf("Received: %s\n", StrAddr (&readaddr));
+                                       Con_Printf("wrong reply address\n");
+                                       Con_Printf("Expected: %s\n", StrAddr (&sendaddr));
+                                       Con_Printf("Received: %s\n", StrAddr (&readaddr));
+                                       CL_UpdateScreen ();
                                        CL_UpdateScreen ();
                                        ret = 0;
                                        continue;
                                }
 
-                               if (ret < sizeof(int))
+                               if (ret < (int)sizeof(int))
                                {
                                        ret = 0;
                                        continue;
@@ -1347,7 +1359,7 @@ static qsocket_t *_Datagram_Connect (const char *host)
                                        ret = 0;
                                        continue;
                                }
-                               if ((control & (~NETFLAG_LENGTH_MASK)) !=  NETFLAG_CTL)
+                               if ((control & (~NETFLAG_LENGTH_MASK)) != (int)NETFLAG_CTL)
                                {
                                        ret = 0;
                                        continue;
@@ -1462,6 +1474,7 @@ static void _Datagram_Heartbeat (const char *master)
                portnum = MASTER_PORT;
        dfunc.SetSocketPort (&masteraddr, portnum);
 
+       // FIXME: this is the only use of UDP_Send in the entire engine, add a dfunc.acceptSock to get rid of this function!
        dfunc.Send (net_message.data, net_message.cursize, &masteraddr);
 }