From 49ba7383ac0fa8c5450c0e345914ac03b38d07c4 Mon Sep 17 00:00:00 2001
From: open-license-manager <rillf@maildrop.cc>
Date: 周三, 17 9月 2014 06:03:08 +0800
Subject: [PATCH] splitted os-linux.c

---
 src/library/os/os-cpp.h             |    2 
 src/library/os/linux/os-linux.cpp   |   20 --
 src/library/os/linux/network_id.c   |  175 +++++++++++++++++++++++++
 src/library/os/os.h                 |    1 
 src/library/os/linux/CMakeLists.txt |    1 
 src/library/os/linux/os-linux.c     |  167 +++--------------------
 6 files changed, 201 insertions(+), 165 deletions(-)

diff --git a/src/library/os/linux/CMakeLists.txt b/src/library/os/linux/CMakeLists.txt
index 1bdbb26..014f98c 100644
--- a/src/library/os/linux/CMakeLists.txt
+++ b/src/library/os/linux/CMakeLists.txt
@@ -1,5 +1,6 @@
 ADD_LIBRARY(os STATIC
 	os-linux.c
+	network_id.c
     os-linux.cpp
 )
 
diff --git a/src/library/os/linux/network_id.c b/src/library/os/linux/network_id.c
new file mode 100644
index 0000000..4880bb1
--- /dev/null
+++ b/src/library/os/linux/network_id.c
@@ -0,0 +1,175 @@
+/**
+ * @file network_id.c
+ * @date 16 Sep 2014
+ * @brief File containing network interface detection functions for Linux.
+ *
+ * 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 "lo" interfaces,
+ * @TODO: place physical interfaces in front in a repeatable order: "eth", "wlan","ib"
+ * and other interfaces later, first the one with a a specified mac address, then
+ * the ones with only an ip.)
+ */
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE     /* To get defns of NI_MAXSERV and NI_MAXHOST */
+#endif
+#include <arpa/inet.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <ifaddrs.h>
+#include <linux/if_link.h>
+#include <netpacket/packet.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "../os.h"
+
+/**
+ *
+ * @param ifnames
+ * @param ifname
+ * @param ifnames_max
+ * @return
+ */
+
+static int ifname_position(char *ifnames, char * ifname, int ifnames_max) {
+	int i, position;
+	position = -1;
+	for (i = 0; i < ifnames_max; i++) {
+		if (strcmp(ifname, &ifnames[i * NI_MAXHOST]) == 0) {
+			position = i;
+			break;
+		}
+	}
+	return position;
+}
+
+/**
+ *
+ * @param adapterInfos
+ * @param adapter_info_size
+ * @return
+ */
+FUNCTION_RETURN getAdapterInfos(OsAdapterInfo * adapterInfos,
+		size_t * adapter_info_size) {
+
+	FUNCTION_RETURN f_return = FUNC_RET_OK;
+	struct ifaddrs *ifaddr, *ifa;
+	int family, i, n, if_name_position;
+	unsigned int if_num, if_max;
+	//char host[NI_MAXHOST];
+	char *ifnames;
+
+	if (getifaddrs(&ifaddr) == -1) {
+		perror("getifaddrs");
+		return FUNC_RET_ERROR;
+	}
+
+	if (adapterInfos != NULL) {
+		memset(adapterInfos, 0, (*adapter_info_size) * sizeof(OsAdapterInfo));
+	}
+
+	/* count the maximum number of interfaces */
+	for (ifa = ifaddr, if_max = 0; ifa != NULL; ifa = ifa->ifa_next, n++) {
+		if (ifa->ifa_addr == NULL) {
+			continue;
+		}
+		if_max++;
+	}
+
+	/* allocate space for names */
+	ifnames = (char*) malloc(NI_MAXHOST * if_max);
+	memset(ifnames, 0, NI_MAXHOST * if_max);
+	/* Walk through linked list, maintaining head pointer so we
+	 can free list later */
+	for (ifa = ifaddr, n = 0, if_num = 0; ifa != NULL;
+			ifa = ifa->ifa_next, n++) {
+		if (ifa->ifa_addr == NULL) {
+			continue;
+		}
+		if_name_position = ifname_position(ifnames, ifa->ifa_name, if_num);
+		//interface name not seen en advance
+		if (if_name_position < 0) {
+			strncpy(&ifnames[if_num * NI_MAXHOST], ifa->ifa_name, NI_MAXHOST);
+			if (adapterInfos != NULL && if_num < *adapter_info_size) {
+				strncpy(adapterInfos[if_num].description, ifa->ifa_name,
+				NI_MAXHOST);
+			}
+			if_name_position = if_num;
+			if_num++;
+			if (adapterInfos == NULL) {
+				continue;
+			}
+		}
+		family = ifa->ifa_addr->sa_family;
+		/* Display interface name and family (including symbolic
+		 form of the latter for the common families) */
+#ifdef _DEBUG
+		printf("%-8s %s (%d)\n", ifa->ifa_name,
+				(family == AF_PACKET) ? "AF_PACKET" :
+				(family == AF_INET) ? "AF_INET" :
+				(family == AF_INET6) ? "AF_INET6" : "???", family);
+#endif
+		/* For an AF_INET* interface address, display the address
+		 * || family == AF_INET6*/
+		if (family == AF_INET) {
+			/*
+			 s = getnameinfo(ifa->ifa_addr,
+			 (family == AF_INET) ?
+			 sizeof(struct sockaddr_in) :
+			 sizeof(struct sockaddr_in6), host, NI_MAXHOST,
+			 NULL, 0, NI_NUMERICHOST);
+
+			 #ifdef _DEBUG
+			 s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), host,
+			 NI_MAXHOST,
+			 NULL, 0, NI_NUMERICHOST);
+			 if (s != 0) {
+			 printf("getnameinfo() failed: %s\n", gai_strerror(s));
+			 }
+			 printf("\t\taddress: <%s>\n", host);
+			 #endif
+			 */
+			if (adapterInfos != NULL && if_name_position < *adapter_info_size) {
+				struct sockaddr_in *s1 = (struct sockaddr_in*) ifa->ifa_addr;
+				in_addr_t iaddr = s1->sin_addr.s_addr;
+				adapterInfos[if_name_position].ipv4_address[0] = (iaddr
+						& 0x000000ff);
+				adapterInfos[if_name_position].ipv4_address[1] = (iaddr
+						& 0x0000ff00) >> 8;
+				adapterInfos[if_name_position].ipv4_address[2] = (iaddr
+						& 0x00ff0000) >> 16;
+				adapterInfos[if_name_position].ipv4_address[3] = (iaddr
+						& 0xff000000) >> 24;
+			}
+		} else if (family == AF_PACKET && ifa->ifa_data != NULL) {
+			struct sockaddr_ll *s1 = (struct sockaddr_ll*) ifa->ifa_addr;
+			if (adapterInfos != NULL && if_name_position < *adapter_info_size) {
+				for (i = 0; i < 6; i++) {
+					adapterInfos[if_name_position].mac_address[i] =
+							s1->sll_addr[i];
+#ifdef _DEBUG
+					printf("%02x:", s1->sll_addr[i]);
+#endif
+				}
+#ifdef _DEBUG
+				printf("\t %s\n", ifa->ifa_name);
+#endif
+
+			}
+		}
+	}
+
+	*adapter_info_size = if_num;
+	if (adapterInfos == NULL) {
+		f_return = FUNC_RET_OK;
+	} else if (*adapter_info_size < if_num) {
+		f_return = FUNC_RET_BUFFER_TOO_SMALL;
+	}
+	freeifaddrs(ifaddr);
+	free(ifnames);
+	return f_return;
+}
diff --git a/src/library/os/linux/os-linux.c b/src/library/os/linux/os-linux.c
index 2373985..1b46dfc 100644
--- a/src/library/os/linux/os-linux.c
+++ b/src/library/os/linux/os-linux.c
@@ -1,17 +1,9 @@
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE     /* To get defns of NI_MAXSERV and NI_MAXHOST */
-#endif
-#include <arpa/inet.h>
-#include <sys/socket.h>
-#include <netdb.h>
-#include <ifaddrs.h>
+
 #include <stdio.h>
 #include <ctype.h>
 #include <stdlib.h>
 #include <unistd.h>
-#include <linux/if_link.h>
-#include <sys/socket.h>
-#include <netpacket/packet.h>
+
 #include <valgrind/memcheck.h>
 #include <paths.h>
 
@@ -36,140 +28,6 @@
 #include <dbus-1.0/dbus/dbus.h>
 #include <sys/utsname.h>
 
-
-static int ifname_position(char *ifnames, char * ifname, int ifnames_max) {
-	int i, position;
-	position = -1;
-	for (i = 0; i < ifnames_max; i++) {
-		if (strcmp(ifname, &ifnames[i * NI_MAXHOST]) == 0) {
-			position = i;
-			break;
-		}
-	}
-	return position;
-
-}
-
-FUNCTION_RETURN getAdapterInfos(OsAdapterInfo * adapterInfos,
-		size_t * adapter_info_size) {
-
-	FUNCTION_RETURN f_return = FUNC_RET_OK;
-	struct ifaddrs *ifaddr, *ifa;
-	int family, i, n, if_name_position;
-	unsigned int if_num, if_max;
-	//char host[NI_MAXHOST];
-	char *ifnames;
-
-	if (getifaddrs(&ifaddr) == -1) {
-		perror("getifaddrs");
-		return FUNC_RET_ERROR;
-	}
-
-	if (adapterInfos != NULL) {
-		memset(adapterInfos, 0, (*adapter_info_size) * sizeof(OsAdapterInfo));
-	}
-
-	/* count the maximum number of interfaces */
-	for (ifa = ifaddr, if_max = 0; ifa != NULL; ifa = ifa->ifa_next, n++) {
-		if (ifa->ifa_addr == NULL) {
-			continue;
-		}
-		if_max++;
-	}
-
-	/* allocate space for names */
-	ifnames = (char*) malloc(NI_MAXHOST * if_max);
-	memset(ifnames, 0, NI_MAXHOST * if_max);
-	/* Walk through linked list, maintaining head pointer so we
-	 can free list later */
-	for (ifa = ifaddr, n = 0, if_num = 0; ifa != NULL;
-			ifa = ifa->ifa_next, n++) {
-		if (ifa->ifa_addr == NULL) {
-			continue;
-		}
-		if_name_position = ifname_position(ifnames, ifa->ifa_name, if_num);
-		//interface name not seen en advance
-		if (if_name_position < 0) {
-			strncpy(&ifnames[if_num * NI_MAXHOST], ifa->ifa_name, NI_MAXHOST);
-			if (adapterInfos != NULL && if_num < *adapter_info_size) {
-				strncpy(adapterInfos[if_num].description, ifa->ifa_name,
-				NI_MAXHOST);
-			}
-			if_name_position = if_num;
-			if_num++;
-			if (adapterInfos == NULL) {
-				continue;
-			}
-		}
-		family = ifa->ifa_addr->sa_family;
-		/* Display interface name and family (including symbolic
-		 form of the latter for the common families) */
-#ifdef _DEBUG
-		printf("%-8s %s (%d)\n", ifa->ifa_name,
-				(family == AF_PACKET) ? "AF_PACKET" :
-				(family == AF_INET) ? "AF_INET" :
-				(family == AF_INET6) ? "AF_INET6" : "???", family);
-#endif
-		/* For an AF_INET* interface address, display the address
-		 * || family == AF_INET6*/
-		if (family == AF_INET) {
-			/*
-			 s = getnameinfo(ifa->ifa_addr,
-			 (family == AF_INET) ?
-			 sizeof(struct sockaddr_in) :
-			 sizeof(struct sockaddr_in6), host, NI_MAXHOST,
-			 NULL, 0, NI_NUMERICHOST);
-
-#ifdef _DEBUG
-			s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), host,
-					NI_MAXHOST,
-					NULL, 0, NI_NUMERICHOST);
-			if (s != 0) {
-				printf("getnameinfo() failed: %s\n", gai_strerror(s));
-			}
-			printf("\t\taddress: <%s>\n", host);
-#endif
-*/
-			if (adapterInfos != NULL && if_name_position < *adapter_info_size) {
-				struct sockaddr_in *s1 = (struct sockaddr_in*) ifa->ifa_addr;
-				in_addr_t iaddr = s1->sin_addr.s_addr;
-				adapterInfos[if_name_position].ipv4_address[0] = (iaddr
-						& 0x000000ff);
-				adapterInfos[if_name_position].ipv4_address[1] = (iaddr
-						& 0x0000ff00) >> 8;
-				adapterInfos[if_name_position].ipv4_address[2] = (iaddr
-						& 0x00ff0000) >> 16;
-				adapterInfos[if_name_position].ipv4_address[3] = (iaddr
-						& 0xff000000) >> 24;
-			}
-		} else if (family == AF_PACKET && ifa->ifa_data != NULL) {
-			struct sockaddr_ll *s1 = (struct sockaddr_ll*) ifa->ifa_addr;
-			if (adapterInfos != NULL && if_name_position < *adapter_info_size) {
-				for (i = 0; i < 6; i++) {
-					adapterInfos[if_name_position].mac_address[i] =
-							s1->sll_addr[i];
-#ifdef _DEBUG
-					printf("%02x:", s1->sll_addr[i]);
-#endif
-				}
-#ifdef _DEBUG
-				printf("\t %s\n", ifa->ifa_name);
-#endif
-
-			}
-		}
-	}
-
-	*adapter_info_size = if_num;
-	if (adapterInfos == NULL) {
-		f_return = FUNC_RET_OK;
-	} else if (*adapter_info_size < if_num) {
-		f_return = FUNC_RET_BUFFER_TOO_SMALL;
-	}
-	freeifaddrs(ifaddr);
-	free(ifnames);
-	return f_return;
-}
 /**
  *Usually uuid are hex number separated by "-". this method read up to 8 hex
  *numbers skipping - characters.
@@ -433,3 +291,24 @@
 	dbus_free(dbus_id);
 	return FUNC_RET_OK;
 }
+
+FUNCTION_RETURN getModuleName(char buffer[MAX_PATH]) {
+	FUNCTION_RETURN result;
+	char path[MAX_PATH] = { 0 };
+	char proc_path[MAX_PATH], pidStr[64];
+	pid_t pid = getpid();
+	sprintf(pidStr, "%d", pid);
+	strcpy(proc_path, "/proc/");
+	strcat(proc_path, pidStr);
+	strcat(proc_path, "/exe");
+
+	int ch = readlink(proc_path, path, MAX_PATH);
+	if (ch != -1) {
+		path[ch] = '\0';
+		strncpy(buffer, path, ch);
+		result = FUNC_RET_OK;
+	} else {
+		result = FUNC_RET_ERROR;
+	}
+	return result;
+}
diff --git a/src/library/os/linux/os-linux.cpp b/src/library/os/linux/os-linux.cpp
index 1f65304..fffd816 100644
--- a/src/library/os/linux/os-linux.cpp
+++ b/src/library/os/linux/os-linux.cpp
@@ -34,26 +34,6 @@
 
 using namespace std;
 
-string OsFunctions::getModuleName() {
-	char path[2048] = { 0 };
-	string strPath;
-	string result;
-	pid_t pid = getpid();
-	const string pidstr = to_string(((long) pid));
-	strPath = string("/proc/") + pidstr + "/exe";
-	const char * proc_path = strPath.c_str();
-	int ch = readlink(proc_path, path, 2048);
-	if (ch != -1) {
-		path[ch] = '\0';
-		result = string(path);
-	} else {
-		throw runtime_error(
-				string("Can't find: ") + strPath + " proc filesystem mounted?");
-	}
-	return result;
-}
-
-
 
 bool OsFunctions::verifySignature(const char* stringToVerify,
 		const char* signatureB64) {
diff --git a/src/library/os/os-cpp.h b/src/library/os/os-cpp.h
index 75e1132..5e0fe24 100644
--- a/src/library/os/os-cpp.h
+++ b/src/library/os/os-cpp.h
@@ -19,7 +19,7 @@
 class OsFunctions {
 public:
 
-	static string getModuleName();
+	//static string getModuleName();
 	//use system dependent methods to verify signature
 	static bool verifySignature(const char * stringToVerify,
 			const char* signature);
diff --git a/src/library/os/os.h b/src/library/os/os.h
index 741efe5..277d969 100644
--- a/src/library/os/os.h
+++ b/src/library/os/os.h
@@ -48,6 +48,7 @@
 		size_t * adapter_info_size);
 FUNCTION_RETURN getDiskInfos(DiskInfo * diskInfos, size_t * disk_info_size);
 FUNCTION_RETURN getUserHomePath(char[MAX_PATH]);
+FUNCTION_RETURN getModuleName(char buffer[MAX_PATH]);
 FUNCTION_RETURN getCpuId(unsigned char identifier[6]);
 FUNCTION_RETURN getMachineName(unsigned char identifier[6]);
 /**

--
Gitblit v1.9.1