From 3979dbd082855ff90201d7e2fcfa291096a9e160 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 17 Apr 2021 23:40:36 -0500 Subject: [PATCH] Allow compilation on OSes without IPv6 support --- enet | 2 +- src/AudioStream.c | 4 ++-- src/ConnectionTester.c | 2 +- src/PlatformSockets.c | 27 +++++++++++++++++++-------- src/PlatformSockets.h | 12 ++++++++++++ src/VideoStream.c | 4 ++-- 6 files changed, 37 insertions(+), 14 deletions(-) diff --git a/enet b/enet index d9e5619..d8976c4 160000 --- a/enet +++ b/enet @@ -1 +1 @@ -Subproject commit d9e561938fd9360cdbbd67d78b105ccbe4af0a65 +Subproject commit d8976c4fcc84a5446ee46eb8de6f23864a91e43e diff --git a/src/AudioStream.c b/src/AudioStream.c index a4f4156..65547d4 100644 --- a/src/AudioStream.c +++ b/src/AudioStream.c @@ -40,11 +40,11 @@ typedef struct _QUEUED_AUDIO_PACKET { static void UdpPingThreadProc(void* context) { // Ping in ASCII char pingData[] = { 0x50, 0x49, 0x4E, 0x47 }; - struct sockaddr_in6 saddr; + LC_SOCKADDR saddr; SOCK_RET err; memcpy(&saddr, &RemoteAddr, sizeof(saddr)); - saddr.sin6_port = htons(RTP_PORT); + SET_PORT(&saddr, RTP_PORT); // Send PING every second until we get data back then every 5 seconds after that. while (!PltIsThreadInterrupted(&udpPingThread)) { diff --git a/src/ConnectionTester.c b/src/ConnectionTester.c index 78f9382..d993834 100644 --- a/src/ConnectionTester.c +++ b/src/ConnectionTester.c @@ -151,7 +151,7 @@ unsigned int LiTestClientConnectivity(const char* testServer, unsigned short ref goto Exit; } - ((struct sockaddr_in6*)&address)->sin6_port = htons(LiGetPortFromPortFlagIndex(i)); + SET_PORT((LC_SOCKADDR*)&address, LiGetPortFromPortFlagIndex(i)); if (LiGetProtocolFromPortFlagIndex(i) == IPPROTO_TCP) { // Initiate an asynchronous connection err = connect(sockets[i], (struct sockaddr*)&address, address_length); diff --git a/src/PlatformSockets.c b/src/PlatformSockets.c index a19daf9..de9bfd4 100644 --- a/src/PlatformSockets.c +++ b/src/PlatformSockets.c @@ -23,8 +23,9 @@ DWORD (WINAPI *pfnWlanSetInterface)(HANDLE hClientHandle, CONST GUID *pInterface void addrToUrlSafeString(struct sockaddr_storage* addr, char* string) { - char addrstr[INET6_ADDRSTRLEN]; + char addrstr[URLSAFESTRING_LEN]; +#ifdef AF_INET6 if (addr->ss_family == AF_INET6) { struct sockaddr_in6* sin6 = (struct sockaddr_in6*)addr; inet_ntop(addr->ss_family, &sin6->sin6_addr, addrstr, sizeof(addrstr)); @@ -32,7 +33,9 @@ void addrToUrlSafeString(struct sockaddr_storage* addr, char* string) // IPv6 addresses need to be enclosed in brackets for URLs sprintf(string, "[%s]", addrstr); } - else { + else +#endif + { struct sockaddr_in* sin = (struct sockaddr_in*)addr; inet_ntop(addr->ss_family, &sin->sin_addr, addrstr, sizeof(addrstr)); @@ -204,8 +207,15 @@ SOCKET bindUdpSocket(int addrfamily, int bufferSize) { SOCKET s; struct sockaddr_storage addr; int err; + SOCKADDR_LEN addrLen; +#ifdef AF_INET6 LC_ASSERT(addrfamily == AF_INET || addrfamily == AF_INET6); + addrLen = (addrfamily == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6)); +#else + LC_ASSERT(addrfamily == AF_INET); + addrLen = sizeof(struct sockaddr_in); +#endif s = createSocket(addrfamily, SOCK_DGRAM, IPPROTO_UDP, false); if (s == INVALID_SOCKET) { @@ -214,10 +224,7 @@ SOCKET bindUdpSocket(int addrfamily, int bufferSize) { memset(&addr, 0, sizeof(addr)); addr.ss_family = addrfamily; - if (bind(s, (struct sockaddr*) &addr, - addrfamily == AF_INET ? - sizeof(struct sockaddr_in) : - sizeof(struct sockaddr_in6)) == SOCKET_ERROR) { + if (bind(s, (struct sockaddr*) &addr, addrLen) == SOCKET_ERROR) { err = LastSocketError(); Limelog("bind() failed: %d\n", err); closeSocket(s); @@ -305,7 +312,7 @@ SOCKET createSocket(int addressFamily, int socketType, int protocol, bool nonBlo SOCKET connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen, unsigned short port, int timeoutSec) { SOCKET s; - struct sockaddr_in6 addr; + LC_SOCKADDR addr; struct pollfd pfd; int err; int val; @@ -360,7 +367,7 @@ SOCKET connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen, // Start connection memcpy(&addr, dstaddr, addrlen); - addr.sin6_port = htons(port); + SET_PORT(&addr, port); err = connect(s, (struct sockaddr*) &addr, addrlen); if (err < 0) { err = (int)LastSocketError(); @@ -494,6 +501,7 @@ int resolveHostName(const char* host, int family, int tcpTestPort, struct sockad return -1; } +#ifdef AF_INET6 bool isInSubnetV6(struct sockaddr_in6* sin6, unsigned char* subnet, int prefixLength) { int i; @@ -506,6 +514,7 @@ bool isInSubnetV6(struct sockaddr_in6* sin6, unsigned char* subnet, int prefixLe return true; } +#endif bool isPrivateNetworkAddress(struct sockaddr_storage* address) { @@ -533,6 +542,7 @@ bool isPrivateNetworkAddress(struct sockaddr_storage* address) { return true; } } +#ifdef AF_INET6 else if (address->ss_family == AF_INET6) { struct sockaddr_in6* sin6 = (struct sockaddr_in6*)address; static unsigned char linkLocalPrefix[] = {0xfe, 0x80}; @@ -552,6 +562,7 @@ bool isPrivateNetworkAddress(struct sockaddr_storage* address) { return true; } } +#endif return false; } diff --git a/src/PlatformSockets.h b/src/PlatformSockets.h index ce65b52..b1c1251 100644 --- a/src/PlatformSockets.h +++ b/src/PlatformSockets.h @@ -86,10 +86,22 @@ typedef ssize_t SOCK_RET; typedef socklen_t SOCKADDR_LEN; #endif +#ifdef AF_INET +typedef struct sockaddr_in6 LC_SOCKADDR; +#define SET_PORT(addr, port) ((addr)->sin6_port = htons(port)) +#else +typedef struct sockaddr_in LC_SOCKADDR; +#define SET_PORT(addr, port) ((addr)->sin_port = htons(port)) +#endif + #define LastSocketFail() ((LastSocketError() != 0) ? LastSocketError() : -1) +#ifdef AF_INET // IPv6 addresses have 2 extra characters for URL escaping #define URLSAFESTRING_LEN (INET6_ADDRSTRLEN+2) +#else +#define URLSAFESTRING_LEN INET_ADDRSTRLEN +#endif void addrToUrlSafeString(struct sockaddr_storage* addr, char* string); SOCKET createSocket(int addressFamily, int socketType, int protocol, bool nonBlocking); diff --git a/src/VideoStream.c b/src/VideoStream.c index 1b170b9..d3e11e3 100644 --- a/src/VideoStream.c +++ b/src/VideoStream.c @@ -48,11 +48,11 @@ void destroyVideoStream(void) { // UDP Ping proc static void UdpPingThreadProc(void* context) { char pingData[] = { 0x50, 0x49, 0x4E, 0x47 }; - struct sockaddr_in6 saddr; + LC_SOCKADDR saddr; SOCK_RET err; memcpy(&saddr, &RemoteAddr, sizeof(saddr)); - saddr.sin6_port = htons(RTP_PORT); + SET_PORT(&saddr, RTP_PORT); while (!PltIsThreadInterrupted(&udpPingThread)) { err = sendto(rtpSocket, pingData, sizeof(pingData), 0, (struct sockaddr*)&saddr, RemoteAddrLen);