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