open-license-manager
2014-04-24 0fa875ba166df3985adb4e1f2229fd7e7a4189f1
disk sn
3个文件已修改
103 ■■■■ 已修改文件
src/library/base/base.h 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/library/os/linux/os-linux.c 89 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
test/library/Os_Linux_test.cpp 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/library/base/base.h
@@ -16,7 +16,17 @@
#endif
#define _DEBUG
/*
#define cmax(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a > _b ? _a : _b; })
#define cmin(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a < _b ? _a : _b; })
*/
typedef enum  {
    OK, NOOK, ERROR, BUFFER_TOO_SMALL
} FUNCTION_RETURN;
src/library/os/linux/os-linux.c
@@ -163,8 +163,33 @@
 *@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;
    //remove characters not in hex set
    len = strlen(uuid);
    hexuuid = (char *) malloc(sizeof(char) * out_size * 2 + 1);
    for (i = 0, j = 0; j < out_size * 2; i++) {
        if (i < len) {
            if (isxdigit(uuid[i])) {
                hexuuid[j] = uuid[i];
                j++;
            } else {
                //skip
                continue;
            }
        } else {
            hexuuid[j] = '0';
            j++;
        }
    }
    hexuuid[j] = '\0';
    for (i = 0; i < out_size; i++) {
        sscanf(&hexuuid[i * 2], "%2hhx", &buffer_out[i]);
    }
    free(hexuuid);
}
#define MAX_UNITS 20
FUNCTION_RETURN getDiskInfos(DiskInfo * diskInfos, size_t * disk_info_size) {
@@ -174,12 +199,14 @@
     */
    char path[MAX_PATH], cur_dir[MAX_PATH];
    struct mntent *ent;
    int maxDrives, currentDrive, stat_result, i, len;
    int maxDrives, currentDrive, i, drive_found;
    __ino64_t *statDrives;
    DiskInfo *tmpDrives;
    FILE *aFile;
    DIR *disk_by_uuid_dir, *disk_by_label;
    struct dirent *dir;
    FUNCTION_RETURN result;
    if (diskInfos != NULL) {
        maxDrives = *disk_info_size;
@@ -189,16 +216,20 @@
        tmpDrives = (DiskInfo *) malloc(sizeof(DiskInfo) * maxDrives);
    }
    statDrives = (__ino64_t *) malloc(maxDrives * sizeof(__ino64_t ));
    memset(tmpDrives, 0, sizeof(DiskInfo) * maxDrives);
    aFile = setmntent("/proc/mounts", "r");
    if (aFile == NULL) {
        perror("setmntent");
        exit(1);
        /*proc not mounted*/
        return ERROR;
    }
    disk_by_uuid_dir = opendir("/dev/disk/by-uuid");
    if (disk_by_uuid_dir == NULL) {
        printf("errreeee!!!");
#ifdef _DEBUG
        printf("Open /dev/disk/by-uuid fail");
#endif
        return ERROR;
    }
    currentDrive = 0;
@@ -209,27 +240,56 @@
                && ent->mnt_fsname != NULL
                && strncmp(ent->mnt_fsname, "/dev/", 5) == 0) {
            if (stat(ent->mnt_fsname, &mount_stat) == 0) {
                drive_found = -1;
                for (i = 0; i < currentDrive; i++) {
                    if (statDrives[i] == mount_stat.st_ino) {
                        drive_found = i;
                    }
                }
                if (drive_found == -1) {
#ifdef _DEBUG
                printf("mntent: %s %s %d\n", ent->mnt_fsname, ent->mnt_dir,
                        mount_stat.st_ino);
#endif
                strcpy(tmpDrives[currentDrive].device, ent->mnt_fsname);
                statDrives[currentDrive] = mount_stat.st_ino;
                if (strcmp(ent->mnt_dir, "/") == 0) {
                    tmpDrives[currentDrive].preferred = true;
                }
                    drive_found = currentDrive;
                currentDrive++;
                }
                if (strcmp(ent->mnt_dir, "/") == 0) {
                    strcpy(tmpDrives[drive_found].label, "root");
#ifdef _DEBUG
                    printf("drive %d set to preferred\n", ent->mnt_fsname);
#endif
                    tmpDrives[drive_found].preferred = true;
                }
            }
        }
    }
    endmntent(aFile);
    if (diskInfos == NULL) {
        *disk_info_size = currentDrive;
        free(tmpDrives);
        result = OK;
    } else if (*disk_info_size >= currentDrive) {
        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);
        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);
                        parseUUID(dir->d_name, tmpDrives[i].disk_sn,
                                sizeof(tmpDrives[i].disk_sn));
#ifdef _DEBUG
                        printf("uuid %d %s %s %02x%02x%02x%02x\n", i,
                                tmpDrives[i].device, path,
                                tmpDrives[i].disk_sn[0],
                                tmpDrives[i].disk_sn[1],
                                tmpDrives[i].disk_sn[2],
                                tmpDrives[i].disk_sn[3]);
#endif
                }
            }
        }
@@ -253,6 +313,9 @@
        }
        closedir(disk_by_label);
    }
    } else {
        result = BUFFER_TOO_SMALL;
    }
    /*
     FILE *mounts = fopen(_PATH_MOUNTED, "r");
     if (mounts == NULL) {
@@ -269,7 +332,7 @@
     }
     }
     */
    return OK;
    return result;
}
void os_initialize() {
test/library/Os_Linux_test.cpp
@@ -22,7 +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;
@@ -46,4 +46,4 @@
        }
    }
}*/
}