From 7b1950f29fa4a73a43b71ee3c1e444fa38e296f0 Mon Sep 17 00:00:00 2001 From: Gabriele Contini <gcontini@users.noreply.github.com> Date: 周六, 07 9月 2019 20:06:48 +0800 Subject: [PATCH] CentOS 7 tests --- src/library/os/os-linux.c | 76 ++++++++++++++++++++++++++++++++------ 1 files changed, 64 insertions(+), 12 deletions(-) diff --git a/src/library/os/os-linux.c b/src/library/os/os-linux.c index 7869651..661ea78 100644 --- a/src/library/os/os-linux.c +++ b/src/library/os/os-linux.c @@ -22,15 +22,15 @@ *@param uuid uuid as read in /dev/disk/by-uuid *@param buffer_out: unsigned char buffer[8] output buffer for result */ -static void parseUUID(const char *uuid, unsigned char* buffer_out, +static void parseUUID(const char *uuid, unsigned char *buffer_out, unsigned int out_size) { size_t len; unsigned int i, j; - char * hexuuid; + char *hexuuid; unsigned char cur_character; //remove characters not in hex set len = strlen(uuid); - hexuuid = (char *) malloc(sizeof(char) * strlen(uuid)); + hexuuid = (char*) malloc(sizeof(char) * strlen(uuid)); memset(buffer_out, 0, out_size); memset(hexuuid, 0, sizeof(char) * strlen(uuid)); @@ -56,7 +56,7 @@ } #define MAX_UNITS 20 -FUNCTION_RETURN getDiskInfos(DiskInfo * diskInfos, size_t * disk_info_size) { +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]; @@ -77,12 +77,11 @@ tmpDrives = diskInfos; } else { maxDrives = MAX_UNITS; - tmpDrives = (DiskInfo *) malloc(sizeof(DiskInfo) * maxDrives); + tmpDrives = (DiskInfo*) malloc(sizeof(DiskInfo) * maxDrives); } memset(tmpDrives, 0, sizeof(DiskInfo) * maxDrives); - statDrives = (__ino64_t *) malloc(maxDrives * sizeof(__ino64_t )); + 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) { @@ -170,7 +170,7 @@ if (stat(cur_dir, &sym_stat) == 0) { for (i = 0; i < currentDrive; i++) { if (sym_stat.st_ino == statDrives[i]) { - strncpy(tmpDrives[i].label, dir->d_name, 255-1); + strncpy(tmpDrives[i].label, dir->d_name, 255 - 1); printf("label %d %s %s\n", i, tmpDrives[i].label, tmpDrives[i].device); } @@ -212,7 +212,7 @@ } } -static void _getCpuid(unsigned int* p, unsigned int ax) { +static void _getCpuid(unsigned int *p, unsigned int ax) { __asm __volatile ( "movl %%ebx, %%esi\n\t" "cpuid\n\t" @@ -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; } @@ -291,7 +343,7 @@ strcat(proc_path, pidStr); strcat(proc_path, "/exe"); - int ch = readlink(proc_path, path, MAX_PATH-1); + int ch = readlink(proc_path, path, MAX_PATH - 1); if (ch != -1) { path[ch] = '\0'; strncpy(buffer, path, ch); -- Gitblit v1.9.1