Gabriele Contini
2019-09-07 7b1950f29fa4a73a43b71ee3c1e444fa38e296f0
src/library/os/os-linux.c
@@ -82,7 +82,6 @@
   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) {
@@ -110,7 +109,8 @@
            if (drive_found == -1) {
               LOG_DEBUG("mntent: %s %s %d\n", ent->mnt_fsname, ent->mnt_dir,
                     (unsigned long int)mount_stat.st_ino);
               strncpy(tmpDrives[currentDrive].device, ent->mnt_fsname, 255-1);
               strncpy(tmpDrives[currentDrive].device, ent->mnt_fsname,
                     255 - 1);
               statDrives[currentDrive] = mount_stat.st_ino;
               drive_found = currentDrive;
               currentDrive++;
@@ -128,7 +128,7 @@
   if (diskInfos == NULL) {
      *disk_info_size = currentDrive;
      free(tmpDrives);
      result = FUNC_RET_OK;
      result = (currentDrive > 0) ? FUNC_RET_OK : FUNC_RET_NOT_AVAIL;
   } else if (*disk_info_size >= currentDrive) {
      disk_by_uuid_dir = opendir("/dev/disk/by-uuid");
      if (disk_by_uuid_dir == NULL) {
@@ -234,7 +234,58 @@
   return FUNC_RET_OK;
}
//0=NO 1=Docker/Lxc
static int checkContainerProc() {
   //in docer /proc/self/cgroups contains the "docker" or "lxc" string
   //https://stackoverflow.com/questions/23513045/how-to-check-if-a-process-is-running-inside-docker-container
   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, "/cgroup");
    FILE * fp;
    char * line = NULL;
    size_t len = 0;
    ssize_t read;
    int result = 0;
    fp = fopen(proc_path, "r");
    if (fp == NULL) {
        return 0;
    }
    while ((read = getline(&line, &len, fp)) != -1 && result == 0) {
       //line[len]=0;
        //printf("Retrieved line of length %zu:\n", read);
        //printf("%s", line);
       if(strstr(line, "docker") != NULL || strstr(line, "lxc") != NULL) {
           result = 1;
       }
    }
    fclose(fp);
    if(line) free(line);
   return result;
}
//0=NO 1=Docker/Lxc
static int checkLXC() {
   return (access("/var/run/systemd/container",F_OK)==0) ? 1:0;
}
VIRTUALIZATION getVirtualization() {
   VIRTUALIZATION result = NONE;
   int isContainer = checkContainerProc();
   if (isContainer == 1) {
      result = CONTAINER;
   } else if(checkLXC()){
      result = CONTAINER;
   }
   return result;
//http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
//
//bool rc = true;
@@ -254,6 +305,7 @@
    "pop    %edx \n"
    );*/
   //systemd-detect-virt
   return NONE;
}