From 897303206e87db7616b8c5f11b894c94b1047e7c Mon Sep 17 00:00:00 2001
From: open-license-manager <rillf@maildrop.cc>
Date: 周一, 08 9月 2014 05:59:02 +0800
Subject: [PATCH] Merge branch 'master' of https://github.com/open-license-manager/open-license-manager.git

---
 src/library/os/win/os-win.c |   65 +++++++++++++++++++++++++++++++-
 1 files changed, 62 insertions(+), 3 deletions(-)

diff --git a/src/library/os/win/os-win.c b/src/library/os/win/os-win.c
index 088b97b..7c5c361 100644
--- a/src/library/os/win/os-win.c
+++ b/src/library/os/win/os-win.c
@@ -1,4 +1,5 @@
 #include <Windows.h>
+#include <iphlpapi.h>
 #include"../os.h"
 
 FUNCTION_RETURN getOsSpecificIdentifier(unsigned char identifier[6]){
@@ -9,7 +10,7 @@
 	char* buffer[MAX_COMPUTERNAME_LENGTH + 1];
 	int bufsize = MAX_COMPUTERNAME_LENGTH + 1;
 	BOOL cmpName = GetComputerName(
-		buffer,&bufsize);
+		buffer, &bufsize);
 	strncpy(identifier, buffer, 6);
 }
 
@@ -23,6 +24,64 @@
 FUNCTION_RETURN getDiskInfos(DiskInfo * diskInfos, size_t * disk_info_size) {
 }
 
-FUNCTION_RETURN getAdapterInfos(AdapterInfo * adapterInfos,
-	size_t * adapter_info_size) {
+//http://stackoverflow.com/questions/18046063/mac-address-using-c
+//TODO: count only interfaces with type (MIB_IF_TYPE_ETHERNET IF_TYPE_IEEE80211)
+FUNCTION_RETURN getAdapterInfos(OsAdapterInfo * adapterInfos, size_t * adapter_info_size) {
+	DWORD dwStatus;
+	unsigned int i;
+	PIP_ADAPTER_INFO pAdapterInfo, pAdapter = NULL;
+	//IP_ADAPTER_INFO AdapterInfo[16];              // Allocate information for up to 16 NICs
+	DWORD dwBufLen = 0; //sizeof(AdapterInfo);         // Save the memory size of buffer
+
+	dwStatus = GetAdaptersInfo(               // Call GetAdapterInfo
+		null,// [out] buffer to receive data
+		&dwBufLen   // [in] size of receive data buffer
+		);
+	if (dwStatus != ERROR_BUFFER_OVERFLOW){
+		return FUNC_RET_ERROR;
+	}
+	if (adapterInfos == null || *adapter_info_size == 0){
+		*adapter_info_size = dwBufLen;
+		return FUNC_RET_BUFFER_TOO_SMALL;
+	}
+	else {
+		memset(adapterInfos, 0, adapter_info_size);
+		pAdapterInfo = (IP_ADAPTER_INFO*)malloc(dwBufLen*sizeof(IP_ADAPTER_INFO));
+		dwStatus = GetAdaptersInfo(pAdapterInfo, &dwBufLen);
+		if (dwStatus != NO_ERROR){
+			free(pAdapterInfo);
+			return FUNC_RET_ERROR;
+		}
+		pAdapter = pAdapterInfo;
+		for (i = 0; i < min(*adapter_info_size, dwBufLen); i++) {
+			strncpy(adapterInfos[i].description, pAdapter->Description, min(sizeof(adapterInfos->description), MAX_ADAPTER_DESCRIPTION_LENGTH));
+			memcpy(adapterInfos[i].mac_address, pAdapter->Address, 8);
+			memcpy(adapterInfos[i].ipv4_address, pAdapter->IpAddressList.IpAddress, 8);
+
+			pAdapter = pAdapter->Next;
+		}
+	}
+
+#include <ctype.h>
+#include <stdio.h>
+	int main(void) {
+		char *str = "192.168.0.1", *str2;
+		unsigned char value[4] = { 0 };
+		size_t index = 0;
+
+		str2 = str; /* save the pointer */
+		while (*str) {
+			if (isdigit((unsigned char)*str)) {
+				value[index] *= 10;
+				value[index] += *str - '0';
+			}
+			else {
+				index++;
+			}
+			str++;
+		}
+		printf("values in \"%s\": %d %d %d %d\n", str2,
+			value[0], value[1], value[2], value[3]);
+		return 0;
+	}
 }
\ No newline at end of file

--
Gitblit v1.9.1