From 55f87d90a521f73c11408383bfc3fc7d84cc70ff Mon Sep 17 00:00:00 2001 From: open-license-manager <rillf@maildrop.cc> Date: 周五, 01 8月 2014 23:52:41 +0800 Subject: [PATCH] new default identification method --- src/library/os/linux/os-linux.c | 62 ++++++++++++++++++++++-------- 1 files changed, 45 insertions(+), 17 deletions(-) diff --git a/src/library/os/linux/os-linux.c b/src/library/os/linux/os-linux.c index 3746ddf..b791859 100644 --- a/src/library/os/linux/os-linux.c +++ b/src/library/os/linux/os-linux.c @@ -49,15 +49,20 @@ FUNCTION_RETURN f_return = 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; } + + if (adapterInfos != NULL) { + memset(adapterInfos, 0, (*adapter_info_size) * sizeof(AdapterInfo)); + } + /* count the maximum number of interfaces */ for (ifa = ifaddr, if_max = 0; ifa != NULL; ifa = ifa->ifa_next, n++) { if (ifa->ifa_addr == NULL) { @@ -111,8 +116,8 @@ */ #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)); } @@ -190,7 +195,7 @@ hexuuid[j++] = '0'; } hexuuid[j] = '\0'; - for (i = 0; i < j/2; i++) { + 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; } @@ -204,7 +209,7 @@ /*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; @@ -224,20 +229,12 @@ } memset(tmpDrives, 0, sizeof(DiskInfo) * maxDrives); statDrives = (__ino64_t *) malloc(maxDrives * sizeof(__ino64_t )); - memset(statDrives, 0, sizeof(__ino64_t ) * maxDrives);; + 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 - free(statDrives); return ERROR; } @@ -276,16 +273,25 @@ } } endmntent(aFile); + if (diskInfos == NULL) { *disk_info_size = currentDrive; free(tmpDrives); result = OK; } else if (*disk_info_size >= currentDrive) { + 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 ERROR; + } result = 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]) { @@ -357,6 +363,28 @@ } } +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 OK; +} + VIRTUALIZATION getVirtualization() { //http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html // -- Gitblit v1.9.1