From e268dbeb982d92188c6515b9571b17d864d40ef6 Mon Sep 17 00:00:00 2001 From: dec05eba <0xdec05eba@gmail.com> Date: Sun, 28 Oct 2018 02:15:56 +0200 Subject: Fix build for mingw --- include/env.hpp | 59 +++++++++++++ include/sibs/DirectConnection.hpp | 4 +- include/sibs/IpAddress.hpp | 16 ++-- src/BootstrapConnection.cpp | 6 +- src/DirectConnection.cpp | 18 ++-- src/IpAddress.cpp | 172 +++++++++++++++++++++++++++++++++++++- 6 files changed, 254 insertions(+), 21 deletions(-) create mode 100644 include/env.hpp diff --git a/include/env.hpp b/include/env.hpp new file mode 100644 index 0000000..57ae068 --- /dev/null +++ b/include/env.hpp @@ -0,0 +1,59 @@ +#pragma once + +#define OS_FAMILY_WINDOWS 0 +#define OS_FAMILY_POSIX 1 + +#define OS_TYPE_WINDOWS 0 +#define OS_TYPE_LINUX 1 + +#if defined(_WIN32) || defined(_WIN64) + #if defined(_WIN64) + #define SYS_ENV_64BIT + #else + #define SYS_ENV_32BIT + #endif + #define OS_FAMILY OS_FAMILY_WINDOWS + #define OS_TYPE OS_TYPE_WINDOWS + + #ifndef UNICODE + #define UNICODE + #endif + + #ifndef _UNICODE + #define _UNICODE + #endif + + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif + + #include +#endif + +#if defined(__linux__) || defined(__unix__) || defined(__APPLE__) || defined(_POSIX_VERSION) + #define OS_FAMILY OS_FAMILY_POSIX +#endif + +#ifdef __linux__ + #define OS_TYPE OS_TYPE_LINUX +#endif + +#if defined(__GNUC__) + #if defined(__x86_64__) || defined(__pc64__) + #define SYS_ENV_64BIT + #else + #define SYS_ENV_32BIT + #endif +#endif + +#if !defined(SYS_ENV_32BIT) && !defined(SYS_ENV_64BIT) + #error "System is not detected as either 32-bit or 64-bit" +#endif + +#if !defined(OS_FAMILY) + #error "System not supported. Only Windows and Posix systems supported right now" +#endif + +#if !defined(OS_TYPE) + #error "System not supported. Only Windows and linux systems supported right now" +#endif diff --git a/include/sibs/DirectConnection.hpp b/include/sibs/DirectConnection.hpp index 2137fd2..d96890b 100644 --- a/include/sibs/DirectConnection.hpp +++ b/include/sibs/DirectConnection.hpp @@ -25,8 +25,8 @@ namespace sibs enum class PubSubResult { - OK, - ERROR + RESULT_OK, + RESULT_ERROR }; struct DirectConnectionPeer; diff --git a/include/sibs/IpAddress.hpp b/include/sibs/IpAddress.hpp index 4403e83..54cb58a 100644 --- a/include/sibs/IpAddress.hpp +++ b/include/sibs/IpAddress.hpp @@ -3,12 +3,18 @@ #include #include #include -#ifndef WIN32 - #include - #include +#include "../env.hpp" +#if OS_FAMILY != OS_FAMILY_WINDOWS + #include + #include #else - #include - #include + #include + #include + int inet_pton(int af, const char *src, void *dst); + int inet_pton4(const char *src, void *dst); + int inet_pton6(const char *src, void *dst); + typedef u_short sa_family_t; + typedef uint32_t in_addr_t; #endif namespace sibs diff --git a/src/BootstrapConnection.cpp b/src/BootstrapConnection.cpp index d7cee09..d0731b9 100644 --- a/src/BootstrapConnection.cpp +++ b/src/BootstrapConnection.cpp @@ -30,7 +30,7 @@ namespace sibs } }); - PubSubResult connectResult = PubSubResult::OK; + PubSubResult connectResult = PubSubResult::RESULT_OK; std::string connectResultStr; bool connected = false; connections.connectServer(bootstrapAddress, [this, &connectResult, &connectResultStr, &connected](std::shared_ptr peer, PubSubResult result, const std::string &resultStr) @@ -46,7 +46,7 @@ namespace sibs std::this_thread::sleep_for(std::chrono::milliseconds(10)); } - if(connectResult != PubSubResult::OK) + if(connectResult != PubSubResult::RESULT_OK) { std::string errMsg = "Failed to connect to bootstrap node, error: "; errMsg += connectResultStr; @@ -122,7 +122,7 @@ namespace sibs Log::debug("BootstrapConnection::receiveDataFromServer: received subscriber (ip: %s, port: %d) from bootstrap node", newPeerAddress.getAddress().c_str(), newPeerAddress.getPort()); connections.connect(newPeerAddress, [this, pubsubKey](std::shared_ptr peer, PubSubResult result, const std::string &resultStr) { - if(result == PubSubResult::OK) + if(result == PubSubResult::RESULT_OK) { std::lock_guard lock(subscribeDataMutex); auto subscribeDataIt = subscribeData.find(pubsubKey); diff --git a/src/DirectConnection.cpp b/src/DirectConnection.cpp index 3ffff22..8243b50 100644 --- a/src/DirectConnection.cpp +++ b/src/DirectConnection.cpp @@ -77,7 +77,7 @@ namespace sibs // For better performance, modify HKLM\System\CurrentControlSet\Services\Afd\Parameters\FastSendDatagramThreshold #ifdef WIN32 int mss = 1052; - UDT::setsockopt(socket, 0, UDT_MSS, &mss, sizeof(mss)); + UDT::setsockopt(udtSocket, 0, UDT_MSS, &mss, sizeof(mss)); #endif if(rendezvous || bind) @@ -153,16 +153,16 @@ namespace sibs catch(SocketCreateException &e) { if(connectCallbackFunc) - connectCallbackFunc(peer, PubSubResult::ERROR, e.what()); - return PubSubConnectResult { peer, PubSubResult::ERROR, e.what() }; + connectCallbackFunc(peer, PubSubResult::RESULT_ERROR, e.what()); + return PubSubConnectResult { peer, PubSubResult::RESULT_ERROR, e.what() }; } Log::debug("DirectConnections: Connecting to peer (ip: %s, port: %d, rendezvous: %s)", address.getAddress().c_str(), address.getPort(), rendezvous ? "yes" : "no"); if(UDT::connect(socket->udtSocket, (sockaddr*)&address.address, sizeof(address.address)) == UDT::ERROR) { if(connectCallbackFunc) - connectCallbackFunc(peer, PubSubResult::ERROR, UDT::getlasterror_desc()); - return PubSubConnectResult{ peer, PubSubResult::ERROR, UDT::getlasterror_desc() }; + connectCallbackFunc(peer, PubSubResult::RESULT_ERROR, UDT::getlasterror_desc()); + return PubSubConnectResult{ peer, PubSubResult::RESULT_ERROR, UDT::getlasterror_desc() }; } UDT::epoll_add_usock(eid, socket->udtSocket); @@ -175,8 +175,8 @@ namespace sibs peersMutex.unlock(); if(connectCallbackFunc) - connectCallbackFunc(peer, PubSubResult::OK, ""); - return PubSubConnectResult { peer, PubSubResult::OK, "" }; + connectCallbackFunc(peer, PubSubResult::RESULT_OK, ""); + return PubSubConnectResult { peer, PubSubResult::RESULT_OK, "" }; }); connectionResultsMutex.unlock(); } @@ -199,10 +199,10 @@ namespace sibs if(sentSize == UDT::ERROR) { if(sendDataCallbackFunc) - sendDataCallbackFunc(PubSubResult::ERROR, UDT::getlasterror_desc()); + sendDataCallbackFunc(PubSubResult::RESULT_ERROR, UDT::getlasterror_desc()); } else if(sendDataCallbackFunc) - sendDataCallbackFunc(PubSubResult::OK, ""); + sendDataCallbackFunc(PubSubResult::RESULT_OK, ""); }).detach(); return true; } diff --git a/src/IpAddress.cpp b/src/IpAddress.cpp index 58ed661..75e4348 100644 --- a/src/IpAddress.cpp +++ b/src/IpAddress.cpp @@ -1,6 +1,171 @@ #include "../include/sibs/IpAddress.hpp" #include +#if OS_FAMILY == OS_FAMILY_WINDOWS +// Source: https://stackoverflow.com/questions/15370033/how-to-use-inet-pton-with-the-mingw-compiler +#define NS_INADDRSZ 4 +#define NS_IN6ADDRSZ 16 +#define NS_INT16SZ 2 + +int inet_pton(int af, const char *src, void *dst) +{ + switch (af) + { + case AF_INET: + return inet_pton4(src, dst); + case AF_INET6: + return inet_pton6(src, dst); + default: + return -1; + } +} + +int inet_pton4(const char *src, void *_dst) +{ + char *dst = (char*)_dst; + uint8_t tmp[NS_INADDRSZ], *tp; + + int saw_digit = 0; + int octets = 0; + *(tp = tmp) = 0; + + int ch; + while ((ch = *src++) != '\0') + { + if (ch >= '0' && ch <= '9') + { + uint32_t n = *tp * 10 + (ch - '0'); + + if (saw_digit && *tp == 0) + return 0; + + if (n > 255) + return 0; + + *tp = n; + if (!saw_digit) + { + if (++octets > 4) + return 0; + saw_digit = 1; + } + } + else if (ch == '.' && saw_digit) + { + if (octets == 4) + return 0; + *++tp = 0; + saw_digit = 0; + } + else + return 0; + } + if (octets < 4) + return 0; + + memcpy(dst, tmp, NS_INADDRSZ); + + return 1; +} + +int inet_pton6(const char *src, void *_dst) +{ + char *dst = (char*)_dst; + static const char xdigits[] = "0123456789abcdef"; + uint8_t tmp[NS_IN6ADDRSZ]; + + uint8_t *tp = (uint8_t*) memset(tmp, '\0', NS_IN6ADDRSZ); + uint8_t *endp = tp + NS_IN6ADDRSZ; + uint8_t *colonp = NULL; + + /* Leading :: requires some special handling. */ + if (*src == ':') + { + if (*++src != ':') + return 0; + } + + const char *curtok = src; + int saw_xdigit = 0; + uint32_t val = 0; + int ch; + while ((ch = tolower(*src++)) != '\0') + { + const char *pch = strchr(xdigits, ch); + if (pch != NULL) + { + val <<= 4; + val |= (pch - xdigits); + if (val > 0xffff) + return 0; + saw_xdigit = 1; + continue; + } + if (ch == ':') + { + curtok = src; + if (!saw_xdigit) + { + if (colonp) + return 0; + colonp = tp; + continue; + } + else if (*src == '\0') + { + return 0; + } + if (tp + NS_INT16SZ > endp) + return 0; + *tp++ = (uint8_t) (val >> 8) & 0xff; + *tp++ = (uint8_t) val & 0xff; + saw_xdigit = 0; + val = 0; + continue; + } + if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) && + inet_pton4(curtok, (char*) tp) > 0) + { + tp += NS_INADDRSZ; + saw_xdigit = 0; + break; /* '\0' was seen by inet_pton4(). */ + } + return 0; + } + if (saw_xdigit) + { + if (tp + NS_INT16SZ > endp) + return 0; + *tp++ = (uint8_t) (val >> 8) & 0xff; + *tp++ = (uint8_t) val & 0xff; + } + if (colonp != NULL) + { + /* + * Since some memmove()'s erroneously fail to handle + * overlapping regions, we'll do the shift by hand. + */ + const int n = tp - colonp; + + if (tp == endp) + return 0; + + for (int i = 1; i <= n; i++) + { + endp[-i] = colonp[n - i]; + colonp[n - i] = 0; + } + tp = endp; + } + if (tp != endp) + return 0; + + memcpy(dst, tmp, NS_IN6ADDRSZ); + + return 1; +} +#endif + namespace sibs { Ipv4::Ipv4() : Ipv4(nullptr, 0) @@ -44,8 +209,11 @@ namespace sibs std::string Ipv4::getAddress() const { std::string result; - result.resize(INET_ADDRSTRLEN); - inet_ntop(AF_INET, &address.sin_addr, &result[0], INET_ADDRSTRLEN); + const int addrLen = sizeof(address); + char host[NI_MAXHOST]; + char service[NI_MAXSERV]; + getnameinfo((sockaddr *)&address, addrLen, host, sizeof(host), service, sizeof(service), NI_NUMERICHOST | NI_NUMERICSERV); + result += host; return result; } -- cgit v1.2.3