]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - lhnet.c
don't spam joy_active notices with developer_extra
[xonotic/darkplaces.git] / lhnet.c
diff --git a/lhnet.c b/lhnet.c
index 3ee6267d729802dc65bbd973adf7445ae89a52ed..7f9664c05da90dc410509fd7b983224af87579a7 100644 (file)
--- a/lhnet.c
+++ b/lhnet.c
@@ -1,17 +1,20 @@
 
 // Written by Forest Hale 2003-06-15 and placed into public domain.
 
-#ifdef SUPPORTIPV6
 #ifdef WIN32
+#ifdef _MSC_VER
+#pragma comment(lib, "ws2_32.lib")
+#endif
+# ifdef SUPPORTIPV6
 // Windows XP or higher is required for getaddrinfo, but the inclusion of wspiapi provides fallbacks for older versions
 # define _WIN32_WINNT 0x0501
+# endif
 # include <winsock2.h>
 # include <ws2tcpip.h>
 # ifdef USE_WSPIAPI_H
 #  include <wspiapi.h>
 # endif
 #endif
-#endif
 
 #ifndef STANDALONETEST
 #include "quakedef.h"
 #include <stdio.h>
 #include <time.h>
 #include <string.h>
-#ifdef WIN32
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#else
+#ifndef WIN32
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -124,7 +124,7 @@ int LHNETADDRESS_FromPort(lhnetaddress_t *vaddress, lhnetaddresstype_t addressty
        switch(addresstype)
        {
        default:
-               return 0;
+               break;
        case LHNETADDRESSTYPE_LOOP:
                // local:port  (loopback)
                memset(address, 0, sizeof(*address));
@@ -389,8 +389,12 @@ int LHNETADDRESS_FromString(lhnetaddress_t *vaddress, const char *string, int de
        address->addresstype = LHNETADDRESSTYPE_NONE;
        port = 0;
        colon = strrchr(string, ':');
-       if (colon)
+       if (colon && (colon == strchr(string, ':') || (string[0] == '[' && colon - string > 0 && colon[-1] == ']')))
+       //           EITHER: colon is the ONLY colon  OR: colon comes after [...] delimited IPv6 address
+       //           fixes misparsing of IPv6 addresses without port
+       {
                port = atoi(colon + 1);
+       }
        else
                colon = string + strlen(string);
        if (port == 0)
@@ -839,7 +843,11 @@ void LHNET_SleepUntilPacket_Microseconds(int microseconds)
                {
                        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;
@@ -1088,7 +1096,7 @@ int LHNET_Read(lhnetsocket_t *lhnetsocket, void *content, int maxcontentlength,
                        address->port = ntohs(address->addr.in.sin_port);
                        return value;
                }
-               else if (value == -1)
+               else if (value < 0)
                {
                        int e = SOCKETERRNO;
                        if (e == EWOULDBLOCK)
@@ -1099,7 +1107,7 @@ int LHNET_Read(lhnetsocket_t *lhnetsocket, void *content, int maxcontentlength,
                                        Con_Print("Connection refused\n");
                                        return 0;
                        }
-                       Con_Printf("LHNET_Read: recvfrom returned error: %s\n", LHNETPRIVATE_StrError());
+                       Con_DPrintf("LHNET_Read: recvfrom returned error: %s\n", LHNETPRIVATE_StrError());
                }
        }
 #ifdef SUPPORTIPV6
@@ -1108,7 +1116,7 @@ int LHNET_Read(lhnetsocket_t *lhnetsocket, void *content, int maxcontentlength,
                SOCKLEN_T inetaddresslength;
                address->addresstype = LHNETADDRESSTYPE_NONE;
                inetaddresslength = sizeof(address->addr.in6);
-               value = recvfrom(lhnetsocket->inetsocket, (char *)content, maxcontentlength, 0, &address->addr.sock, &inetaddresslength);
+               value = recvfrom(lhnetsocket->inetsocket, (char *)content, maxcontentlength, LHNET_RECVFROM_FLAGS, &address->addr.sock, &inetaddresslength);
                if (value > 0)
                {
                        address->addresstype = LHNETADDRESSTYPE_INET6;
@@ -1126,7 +1134,7 @@ int LHNET_Read(lhnetsocket_t *lhnetsocket, void *content, int maxcontentlength,
                                        Con_Print("Connection refused\n");
                                        return 0;
                        }
-                       Con_Printf("LHNET_Read: recvfrom returned error: %s\n", LHNETPRIVATE_StrError());
+                       Con_DPrintf("LHNET_Read: recvfrom returned error: %s\n", LHNETPRIVATE_StrError());
                }
        }
 #endif
@@ -1167,7 +1175,7 @@ int LHNET_Write(lhnetsocket_t *lhnetsocket, const void *content, int contentleng
                {
                        if (SOCKETERRNO == EWOULDBLOCK)
                                return 0;
-                       Con_Printf("LHNET_Write: sendto returned error: %s\n", LHNETPRIVATE_StrError());
+                       Con_DPrintf("LHNET_Write: sendto returned error: %s\n", LHNETPRIVATE_StrError());
                }
        }
 #ifdef SUPPORTIPV6
@@ -1178,7 +1186,7 @@ int LHNET_Write(lhnetsocket_t *lhnetsocket, const void *content, int contentleng
                {
                        if (SOCKETERRNO == EWOULDBLOCK)
                                return 0;
-                       Con_Printf("LHNET_Write: sendto returned error: %s\n", LHNETPRIVATE_StrError());
+                       Con_DPrintf("LHNET_Write: sendto returned error: %s\n", LHNETPRIVATE_StrError());
                }
        }
 #endif