open-license-manager
2014-04-23 bcc2c2b3761b818f91e365f6ba5f43842410aca9
calculate disk identifiers
3个文件已修改
115 ■■■■■ 已修改文件
src/library/os/linux/os-linux.c 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/library/os/os.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
test/library/Os_Linux_test.cpp 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/library/os/linux/os-linux.c
@@ -26,6 +26,10 @@
#include <openssl/pem.h>
#include <openssl/err.h>
#include <mntent.h>
#include <dirent.h>
#include <stdio.h>
static int ifname_position(char *ifnames, char * ifname, int ifnames_max) {
    int i, position;
    position = -1;
@@ -153,11 +157,103 @@
    freeifaddrs(ifaddr);
    return f_return;
}
/**
 *Usually uuid are hex number separated by "-". this method read up to 8 hex
 *numbers skipping - characters.
 *@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) {
}
#define MAX_UNITS 20
FUNCTION_RETURN getDiskInfos(DiskInfo * diskInfos, size_t * disk_info_size) {
    struct stat filename_stat, mount_stat;
    static char discard[1024];
    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];
    struct mntent *ent;
    int maxDrives, currentDrive, stat_result, i, len;
    __ino64_t *statDrives;
    DiskInfo *tmpDrives;
    FILE *aFile;
    DIR *disk_by_uuid_dir, *disk_by_label;
    struct dirent *dir;
    if (diskInfos != NULL) {
        maxDrives = *disk_info_size;
        tmpDrives = diskInfos;
    } else {
        maxDrives = MAX_UNITS;
        tmpDrives = (DiskInfo *) malloc(sizeof(DiskInfo) * maxDrives);
    }
    statDrives = (__ino64_t *) malloc(maxDrives * sizeof(__ino64_t ));
    aFile = setmntent("/proc/mounts", "r");
    if (aFile == NULL) {
        perror("setmntent");
        exit(1);
    }
    disk_by_uuid_dir = opendir("/dev/disk/by-uuid");
    if (disk_by_uuid_dir == NULL) {
        printf("errreeee!!!");
    }
    currentDrive = 0;
    while (NULL != (ent = getmntent(aFile))) {
        if ((strncmp(ent->mnt_type, "ext", 3) == 0
                || strncmp(ent->mnt_type, "vfat", 4) == 0
                || strncmp(ent->mnt_type, "ntfs", 4) == 0)
                && ent->mnt_fsname != NULL
                && strncmp(ent->mnt_fsname, "/dev/", 5) == 0) {
            if (stat(ent->mnt_fsname, &mount_stat) == 0) {
                printf("mntent: %s %s %d\n", ent->mnt_fsname, ent->mnt_dir,
                        mount_stat.st_ino);
                strcpy(tmpDrives[currentDrive].device, ent->mnt_fsname);
                statDrives[currentDrive] = mount_stat.st_ino;
                if (strcmp(ent->mnt_dir, "/") == 0) {
                    tmpDrives[currentDrive].preferred = true;
                }
                currentDrive++;
            }
        }
    }
    endmntent(aFile);
    while ((dir = readdir(disk_by_uuid_dir)) != NULL) {
        strcpy(cur_dir, "/dev/disk/by-uuid/");
        strcat(cur_dir, dir->d_name);
        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);
                    printf("uuid %d %s %s\n", i, tmpDrives[i].device, path);
                }
            }
        }
    }
    closedir(disk_by_uuid_dir);
    disk_by_label = opendir("/dev/disk/by-label");
    if (disk_by_label != NULL) {
        while ((dir = readdir(disk_by_label)) != NULL) {
            strcpy(cur_dir, "/dev/disk/by-label/");
            strcat(cur_dir, dir->d_name);
            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);
                        printf("label %d %s %s\n", i, tmpDrives[i].label,
                                tmpDrives[i].device);
                    }
                }
            }
        }
        closedir(disk_by_label);
    }
    /*
    FILE *mounts = fopen(_PATH_MOUNTED, "r");
    if (mounts == NULL) {
        return ERROR;
@@ -172,8 +268,8 @@
                    type);
        }
    }
    return ERROR;
     */
    return OK;
}
void os_initialize() {
src/library/os/os.h
@@ -14,6 +14,7 @@
#include "../base/base.h"
#include <stddef.h>
#include <stdbool.h>
typedef enum {
    NONE, VMWARE
@@ -31,6 +32,7 @@
    char device[255];
    unsigned char disk_sn[8];
    char label[255];
    bool preferred;
} DiskInfo;
FUNCTION_RETURN getAdapterInfos(AdapterInfo * adapterInfos,
test/library/Os_Linux_test.cpp
@@ -9,7 +9,6 @@
#include <iostream>
using namespace std;
/*
 BOOST_AUTO_TEST_CASE( read_disk_id ) {
 DiskInfo * diskInfos = NULL;
 size_t disk_info_size =0;
@@ -23,8 +22,7 @@
 BOOST_CHECK_GT(strlen(diskInfos[0].label),0);
 BOOST_CHECK_GT(diskInfos[0].disk_sn[0],0);
 }
 */
/*
BOOST_AUTO_TEST_CASE( read_network_adapters ) {
    AdapterInfo * adapter_info = NULL;
    size_t adapter_info_size = 0;
@@ -41,10 +39,11 @@
        BOOST_CHECK_GT(strlen(adapter_info[i].description), 0);
        //lo mac address is always 0 but it has ip
        //other interfaces may not be connected
        if (string(adapter_info[i].description) != "lo") {
        if (string(adapter_info[i].description) == "lo") {
            BOOST_CHECK_NE(adapter_info[i].ipv4_address[0], 0);
        } else {
            BOOST_CHECK_NE(adapter_info[i].mac_address[0], 0);
        }
    }
}
}*/