From 1e166c13aaabe8d2aad1d604c77020a14dc577cd Mon Sep 17 00:00:00 2001 From: open-license-manager <rillf@maildrop.cc> Date: 周二, 16 9月 2014 06:22:21 +0800 Subject: [PATCH] refactorings --- src/library/os/linux/os-linux.c | 157 +++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 111 insertions(+), 46 deletions(-) diff --git a/src/library/os/linux/os-linux.c b/src/library/os/linux/os-linux.c index b6430cc..2373985 100644 --- a/src/library/os/linux/os-linux.c +++ b/src/library/os/linux/os-linux.c @@ -1,15 +1,18 @@ +#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> #include <stdlib.h> @@ -19,7 +22,7 @@ #include <sys/ioctl.h> #include <sys/stat.h> #include "../os.h" -#include "../../base/public-key.h" +#include "public-key.h" #include <openssl/evp.h> #include <openssl/bio.h> @@ -29,6 +32,10 @@ #include <mntent.h> #include <dirent.h> #include <stdio.h> + +#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; @@ -43,20 +50,25 @@ } -FUNCTION_RETURN getAdapterInfos(AdapterInfo * adapterInfos, +FUNCTION_RETURN getAdapterInfos(OsAdapterInfo * adapterInfos, size_t * adapter_info_size) { - FUNCTION_RETURN f_return = OK; + FUNCTION_RETURN f_return = FUNC_RET_OK; struct ifaddrs *ifaddr, *ifa; - int family, i, s, n, if_name_position; + int family, i, n, if_name_position; unsigned int if_num, if_max; - char host[NI_MAXHOST]; + //char host[NI_MAXHOST]; char *ifnames; if (getifaddrs(&ifaddr) == -1) { perror("getifaddrs"); - return ERROR; + 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) { @@ -107,17 +119,17 @@ 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); + 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; @@ -150,11 +162,12 @@ *adapter_info_size = if_num; if (adapterInfos == NULL) { - f_return = OK; + f_return = FUNC_RET_OK; } else if (*adapter_info_size < if_num) { - f_return = BUFFER_TOO_SMALL; + f_return = FUNC_RET_BUFFER_TOO_SMALL; } freeifaddrs(ifaddr); + free(ifnames); return f_return; } /** @@ -168,36 +181,41 @@ size_t len; unsigned int i, j; char * hexuuid; + unsigned char cur_character; //remove characters not in hex set len = strlen(uuid); - hexuuid = (char *) malloc(sizeof(char) * out_size * 2 + 1); - for (i = 0, j = 0; j < out_size * 2; i++) { - if (i < len) { - if (isxdigit(uuid[i])) { - hexuuid[j] = uuid[i]; - j++; - } else { - //skip - continue; - } - } else { - hexuuid[j] = '0'; + hexuuid = (char *) malloc(sizeof(char) * strlen(uuid)); + memset(buffer_out, 0, out_size); + memset(hexuuid, 0, sizeof(char) * strlen(uuid)); + + for (i = 0, j = 0; i < len; i++) { + if (isxdigit(uuid[i])) { + hexuuid[j] = uuid[i]; j++; + } else { + //skip + continue; } } - hexuuid[j] = '\0'; - for (i = 0; i < out_size; i++) { - sscanf(&hexuuid[i * 2], "%2hhx", &buffer_out[i]); + if (j % 2 == 1) { + hexuuid[j++] = '0'; } + hexuuid[j] = '\0'; + for (i = 0; i < j / 2; i++) { + sscanf(&hexuuid[i * 2], "%2hhx", &cur_character); + buffer_out[i % out_size] = buffer_out[i % out_size] ^ cur_character; + } + free(hexuuid); } + #define MAX_UNITS 20 FUNCTION_RETURN getDiskInfos(DiskInfo * diskInfos, size_t * disk_info_size) { struct stat mount_stat, sym_stat; /*static char discard[1024]; char device[64], name[64], type[64]; */ - char path[MAX_PATH], cur_dir[MAX_PATH]; + char cur_dir[MAX_PATH]; struct mntent *ent; int maxDrives, currentDrive, i, drive_found; @@ -215,21 +233,15 @@ maxDrives = MAX_UNITS; tmpDrives = (DiskInfo *) malloc(sizeof(DiskInfo) * maxDrives); } - statDrives = (__ino64_t *) malloc(maxDrives * sizeof(__ino64_t )); memset(tmpDrives, 0, sizeof(DiskInfo) * maxDrives); + statDrives = (__ino64_t *) malloc(maxDrives * sizeof(__ino64_t )); + memset(statDrives, 0, sizeof(__ino64_t ) * maxDrives); + ; aFile = setmntent("/proc/mounts", "r"); if (aFile == NULL) { /*proc not mounted*/ - return ERROR; - } - - disk_by_uuid_dir = opendir("/dev/disk/by-uuid"); - if (disk_by_uuid_dir == NULL) { -#ifdef _DEBUG - printf("Open /dev/disk/by-uuid fail"); -#endif - return ERROR; + return FUNC_RET_ERROR; } currentDrive = 0; @@ -259,7 +271,7 @@ if (strcmp(ent->mnt_dir, "/") == 0) { strcpy(tmpDrives[drive_found].label, "root"); #ifdef _DEBUG - printf("drive %d set to preferred\n", ent->mnt_fsname); + printf("drive %s set to preferred\n", ent->mnt_fsname); #endif tmpDrives[drive_found].preferred = true; } @@ -267,24 +279,35 @@ } } endmntent(aFile); + if (diskInfos == NULL) { *disk_info_size = currentDrive; free(tmpDrives); - result = OK; + result = FUNC_RET_OK; } else if (*disk_info_size >= currentDrive) { - result = OK; + disk_by_uuid_dir = opendir("/dev/disk/by-uuid"); + if (disk_by_uuid_dir == NULL) { +#ifdef _DEBUG + printf("Open /dev/disk/by-uuid fail"); +#endif + free(statDrives); + return FUNC_RET_ERROR; + } + result = FUNC_RET_OK; *disk_info_size = currentDrive; while ((dir = readdir(disk_by_uuid_dir)) != NULL) { strcpy(cur_dir, "/dev/disk/by-uuid/"); - strcat(cur_dir, dir->d_name); + strncat(cur_dir, dir->d_name, 200); if (stat(cur_dir, &sym_stat) == 0) { for (i = 0; i < currentDrive; i++) { if (sym_stat.st_ino == statDrives[i]) { parseUUID(dir->d_name, tmpDrives[i].disk_sn, sizeof(tmpDrives[i].disk_sn)); #ifdef _DEBUG - printf("uuid %d %s %s %02x%02x%02x%02x\n", i, - tmpDrives[i].device, path, + VALGRIND_CHECK_VALUE_IS_DEFINED(tmpDrives[i].device); + + printf("uuid %d %s %02x%02x%02x%02x\n", i, + tmpDrives[i].device, tmpDrives[i].disk_sn[0], tmpDrives[i].disk_sn[1], tmpDrives[i].disk_sn[2], @@ -314,7 +337,7 @@ closedir(disk_by_label); } } else { - result = BUFFER_TOO_SMALL; + result = FUNC_RET_BUFFER_TOO_SMALL; } /* FILE *mounts = fopen(_PATH_MOUNTED, "r"); @@ -332,6 +355,7 @@ } } */ + free(statDrives); return result; } @@ -343,6 +367,28 @@ ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); } +} + +static void _getCpuid(unsigned int* p, unsigned int ax) { + __asm __volatile + ( "movl %%ebx, %%esi\n\t" + "cpuid\n\t" + "xchgl %%ebx, %%esi" + : "=a" (p[0]), "=S" (p[1]), + "=c" (p[2]), "=d" (p[3]) + : "0" (ax) + ); +} + +FUNCTION_RETURN getCpuId(unsigned char identifier[6]) { + unsigned int i; + unsigned int cpuinfo[4] = { 0, 0, 0, 0 }; + _getCpuid(cpuinfo, 0); + for (i = 0; i < 3; i++) { + identifier[i * 2] = cpuinfo[i] & 0xFF; + identifier[i * 2 + 1] = (cpuinfo[i] & 0xFF00) >> 8; + } + return FUNC_RET_OK; } VIRTUALIZATION getVirtualization() { @@ -368,3 +414,22 @@ return NONE; } +FUNCTION_RETURN getMachineName(unsigned char identifier[6]) { + static struct utsname u; + + if (uname(&u) < 0) { + return FUNC_RET_ERROR; + } + memcpy(identifier, u.nodename, 6); + return FUNC_RET_OK; +} + +FUNCTION_RETURN getOsSpecificIdentifier(unsigned char identifier[6]) { + char* dbus_id = dbus_get_local_machine_id(); + if (dbus_id == NULL) { + return FUNC_RET_ERROR; + } + memcpy(identifier, dbus_id, 6); + dbus_free(dbus_id); + return FUNC_RET_OK; +} -- Gitblit v1.9.1