From ef7df8048d1067d3148287f27af9047743f1e2ae Mon Sep 17 00:00:00 2001
From: gcontini <1121667+gcontini@users.noreply.github.com>
Date: 周日, 15 3月 2020 16:26:21 +0800
Subject: [PATCH] Merge branch 'feature/pc_identifiers' into develop issues #2 #3 #14 #49

---
 src/library/os/windows/network.cpp |  113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 113 insertions(+), 0 deletions(-)

diff --git a/src/library/os/windows/network.cpp b/src/library/os/windows/network.cpp
new file mode 100644
index 0000000..6334b9d
--- /dev/null
+++ b/src/library/os/windows/network.cpp
@@ -0,0 +1,113 @@
+/**
+ * @file network_id.c
+ * @date 16 Sep 2014
+ * @brief File containing network interface detection functions for Windows.
+ *
+ * The only public function of this module is #getAdapterInfos(OsAdapterInfo *,
+ *		size_t *), other functions are either static or inline.
+ *
+ * Responsibility of this module is to fill OsAdapterInfo structures, in a predictable way (skip loopback/vpn interfaces)
+ */
+
+#ifdef _MSC_VER
+#include <Windows.h>
+#endif
+#include <iphlpapi.h>
+#include <unordered_map>
+#include <stdio.h>
+//#pragma comment(lib, "IPHLPAPI.lib")
+
+#include "../../base/StringUtils.h"
+#include "../../base/logger.h"
+#include "../network.hpp"
+
+namespace license {
+namespace os {
+using namespace std;
+
+static int translate(char ipStringIn[16], unsigned char ipv4[4]) {
+	size_t index = 0;
+
+	char *str2 = ipStringIn; /* save the pointer */
+	while (*str2) {
+		if (isdigit((unsigned char)*str2)) {
+			ipv4[index] *= 10;
+			ipv4[index] += *str2 - '0';
+		} else {
+			index++;
+		}
+		str2++;
+	}
+	return 0;
+}
+/**
+ *
+ * @param adapterInfos
+ * @param adapter_info_size
+ * @return
+ */
+FUNCTION_RETURN getAdapterInfos(vector<OsAdapterInfo> &adapterInfos) {
+	unordered_map<string, OsAdapterInfo> adapterByName;
+	FUNCTION_RETURN f_return = FUNC_RET_OK;
+	DWORD dwStatus;
+	int adapter_info_size;
+	PIP_ADAPTER_INFO pAdapterInfo;
+	DWORD dwBufLen = sizeof(IP_ADAPTER_INFO);
+
+	unsigned int i = 3;
+	do {
+		pAdapterInfo = (PIP_ADAPTER_INFO)malloc(dwBufLen);
+		dwStatus = GetAdaptersInfo(	 // Call GetAdapterInfo
+			pAdapterInfo,  // [out] buffer to receive data
+			&dwBufLen  // [in] size of receive data buffer
+		);
+		if (dwStatus != NO_ERROR && pAdapterInfo != nullptr) {
+			free(pAdapterInfo);
+			pAdapterInfo = nullptr;
+		}
+	} while (dwStatus == ERROR_BUFFER_OVERFLOW && i-- > 0);
+
+	if (dwStatus == ERROR_BUFFER_OVERFLOW) {
+		return FUNC_RET_ERROR;
+	}
+
+	adapter_info_size = dwBufLen / sizeof(IP_ADAPTER_INFO);
+	if (adapter_info_size == 0) {
+		return FUNC_RET_NOT_AVAIL;
+	}
+
+	PIP_ADAPTER_INFO pAdapter = pAdapterInfo;
+	i = 0;
+	FUNCTION_RETURN result = FUNC_RET_OK;
+	while (pAdapter) {
+		OsAdapterInfo ai = {};
+		strncpy(ai.description, pAdapter->Description,
+				min((int)sizeof(ai.description), MAX_ADAPTER_DESCRIPTION_LENGTH));
+		memcpy(ai.mac_address, pAdapter->Address, 8);
+		translate(pAdapter->IpAddressList.IpAddress.String, ai.ipv4_address);
+		ai.type = IFACE_TYPE_ETHERNET;
+		i++;
+		pAdapter = pAdapter->Next;
+		if (i == adapter_info_size) {
+			result = FUNC_RET_BUFFER_TOO_SMALL;
+			break;
+		}
+		adapterByName[string(ai.description)] = ai;
+	}
+	free(pAdapterInfo);
+
+	// FIXME sort by eth , enps, wlan
+	if (adapterByName.size() == 0) {
+		f_return = FUNC_RET_NOT_AVAIL;
+	} else {
+		f_return = FUNC_RET_OK;
+		adapterInfos.reserve(adapterByName.size());
+		for (auto &it : adapterByName) {
+			adapterInfos.push_back(it.second);
+		}
+	}
+	return f_return;
+}
+
+}  // namespace os
+}  // namespace license

--
Gitblit v1.9.1