#ifdef _MSC_VER
#pragma comment(lib, "ws2_32.lib")
#endif
-# ifdef SUPPORTIPV6
+# ifndef NOSUPPORTIPV6
// Windows XP or higher is required for getaddrinfo, but the inclusion of wspiapi provides fallbacks for older versions
# define _WIN32_WINNT 0x0501
# endif
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
#include <net/if.h>
#endif
#endif
{
struct sockaddr sock;
struct sockaddr_in in;
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
struct sockaddr_in6 in6;
#endif
}
address->addr.in.sin_family = AF_INET;
address->addr.in.sin_port = htons((unsigned short)port);
return 1;
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
case LHNETADDRESSTYPE_INET6:
// [0:0:0:0:0:0:0:0]:port (IN6ADDR_ANY, binds to all interfaces)
memset(address, 0, sizeof(*address));
return 0;
}
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
static int LHNETADDRESS_Resolve(lhnetaddressnative_t *address, const char *name, int port)
{
char port_buff [16];
address->port = port;
if (address->addresstype == LHNETADDRESSTYPE_INET6)
{
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
address->addr.in6.sin6_port = htons((unsigned short)port);
return 1;
#endif
{
if (hostentry->h_addrtype == AF_INET6)
{
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
// great it worked
address->addresstype = LHNETADDRESSTYPE_INET6;
address->port = port;
{
lhnetaddressnative_t *address = (lhnetaddressnative_t *)vaddress;
const unsigned char *a;
- *string = 0;
if (!address || !string || stringbuffersize < 1)
return 0;
+ *string = 0;
switch(address->addresstype)
{
default:
}
}
break;
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
case LHNETADDRESSTYPE_INET6:
a = (const unsigned char *)(&address->addr.in6.sin6_addr);
if (includeport)
const char *LHNETADDRESS_GetInterfaceName(const lhnetaddress_t *vaddress, char *ifname, size_t ifnamelength)
{
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
lhnetaddressnative_t *address = (lhnetaddressnative_t *)vaddress;
if (address && address->addresstype == LHNETADDRESSTYPE_INET6)
case LHNETADDRESSTYPE_INET4:
address->addr.in.sin_port = htons((unsigned short)port);
return 1;
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
case LHNETADDRESSTYPE_INET6:
address->addr.in6.sin6_port = htons((unsigned short)port);
return 1;
if (address1->port != address2->port)
return -1;
return 0;
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
case LHNETADDRESSTYPE_INET6:
if (address1->addr.in6.sin6_family != address2->addr.in6.sin6_family)
return 1;
}
break;
case LHNETADDRESSTYPE_INET4:
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
case LHNETADDRESSTYPE_INET6:
#endif
#ifdef WIN32
if (lhnet_didWSAStartup)
{
#endif
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
if ((lhnetsocket->inetsocket = socket(address->addresstype == LHNETADDRESSTYPE_INET6 ? PF_INET6 : PF_INET, SOCK_DGRAM, IPPROTO_UDP)) != -1)
#else
if ((lhnetsocket->inetsocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) != -1)
}
#endif
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
if (address->addresstype == LHNETADDRESSTYPE_INET6)
{
namelen = sizeof(localaddress->addr.in6);
bindresult = bind(lhnetsocket->inetsocket, &localaddress->addr.sock, namelen);
if (bindresult != -1)
- getsockname(lhnetsocket->inetsocket, &localaddress->addr.sock, &namelen);
+ {
+ if (getsockname(lhnetsocket->inetsocket, &localaddress->addr.sock, &namelen))
+ {
+ // If getsockname failed, we can assume the bound socket is useless.
+ bindresult = -1;
+ }
+ }
}
else
#endif
namelen = sizeof(localaddress->addr.in);
bindresult = bind(lhnetsocket->inetsocket, &localaddress->addr.sock, namelen);
if (bindresult != -1)
- getsockname(lhnetsocket->inetsocket, &localaddress->addr.sock, &namelen);
+ {
+ if (getsockname(lhnetsocket->inetsocket, &localaddress->addr.sock, &namelen))
+ {
+ // If getsockname failed, we can assume the bound socket is useless.
+ bindresult = -1;
+ }
+ }
}
if (bindresult != -1)
{
{
// enable DSCP for ToS support
int tos = lhnet_default_dscp << 2;
- setsockopt(lhnetsocket->inetsocket, IPPROTO_IP, IP_TOS, (char *) &tos, sizeof(tos));
+ if (setsockopt(lhnetsocket->inetsocket, IPPROTO_IP, IP_TOS, (char *) &tos, sizeof(tos)))
+ {
+ // Error in setsockopt - fine, we'll simply set no TOS then.
+ }
}
#endif
lhnetsocket->next = &lhnet_socketlist;
Con_DPrintf("LHNET_Read: recvfrom returned error: %s\n", LHNETPRIVATE_StrError());
}
}
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
else if (lhnetsocket->address.addresstype == LHNETADDRESSTYPE_INET6)
{
SOCKLEN_T inetaddresslength;
Con_DPrintf("LHNET_Write: sendto returned error: %s\n", LHNETPRIVATE_StrError());
}
}
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
else if (lhnetsocket->address.addresstype == LHNETADDRESSTYPE_INET6)
{
value = sendto(lhnetsocket->inetsocket, (char *)content, contentlength, 0, (struct sockaddr *)&address->addr.in6, sizeof(struct sockaddr_in6));