aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordec05eba <0xdec05eba@gmail.com>2018-10-28 02:15:56 +0200
committerdec05eba <0xdec05eba@gmail.com>2018-10-28 02:15:56 +0200
commite268dbeb982d92188c6515b9571b17d864d40ef6 (patch)
tree991f9336177f0b46dba6d14ed7bf348f52be55bd
parent4fffc1cd8ccf1c3b1f15b2cb1942daf8cdd556ab (diff)
Fix build for mingw
-rw-r--r--include/env.hpp59
-rw-r--r--include/sibs/DirectConnection.hpp4
-rw-r--r--include/sibs/IpAddress.hpp16
-rw-r--r--src/BootstrapConnection.cpp6
-rw-r--r--src/DirectConnection.cpp18
-rw-r--r--src/IpAddress.cpp172
6 files changed, 254 insertions, 21 deletions
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 <windows.h>
+#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 <stdexcept>
#include <string>
#include <unordered_map>
-#ifndef WIN32
- #include <arpa/inet.h>
- #include <netdb.h>
+#include "../env.hpp"
+#if OS_FAMILY != OS_FAMILY_WINDOWS
+ #include <arpa/inet.h>
+ #include <netdb.h>
#else
- #include <winsock2.h>
- #include <ws2tcpip.h>
+ #include <winsock2.h>
+ #include <ws2tcpip.h>
+ 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<DirectConnectionPeer> 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<DirectConnectionPeer> peer, PubSubResult result, const std::string &resultStr)
{
- if(result == PubSubResult::OK)
+ if(result == PubSubResult::RESULT_OK)
{
std::lock_guard<std::recursive_mutex> 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 <cstring>
+#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;
}