open-license-manager
2014-08-04 7b5931685caf55b7b974cb759e5018dbcf1a75c9
src/library/os/linux/os-linux.c
@@ -31,6 +31,9 @@
#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;
   position = -1;
@@ -49,15 +52,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 +119,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 +198,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 +212,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 +232,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 +276,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 +366,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
//
@@ -380,3 +411,22 @@
   return NONE;
}
FUNCTION_RETURN getMachineName(unsigned char identifier[6]) {
   static struct utsname u;
   if (uname(&u) < 0) {
      return ERROR;
   }
   memcpy(identifier, u.nodename, 6);
   return OK;
}
FUNCTION_RETURN getOsSpecificIdentifier(unsigned char identifier[6]) {
   char* dbus_id = dbus_get_local_machine_id();
   if (dbus_id == NULL) {
      return ERROR;
   }
   memcpy(identifier, dbus_id, 6);
   dbus_free(dbus_id);
   return OK;
}