/* * pc-identifiers.c * * Created on: Apr 16, 2014 * Author: devel */ #include "os/os.h" #include "pc-identifiers.h" #include #include static FUNCTION_RETURN generate_default_pc_id(PcIdentifier * identifiers, unsigned int * num_identifiers) { size_t adapter_num, disk_num; FUNCTION_RETURN result_adapterInfos, result_diskinfos; unsigned int required_id_size, i, j, k; DiskInfo * diskInfos; AdapterInfo *adapterInfos; result_adapterInfos = getAdapterInfos(NULL, &adapter_num); if (result_adapterInfos != OK) { //call generate_disk_pc_id; return result_adapterInfos; } result_diskinfos = getDiskInfos(NULL, &disk_num); if (result_diskinfos == OK) { required_id_size = disk_num * adapter_num; } else { required_id_size = disk_num; } if (identifiers == NULL) { *num_identifiers = required_id_size; return OK; } else if (*num_identifiers < required_id_size) { *num_identifiers = required_id_size; return BUFFER_TOO_SMALL; } diskInfos = (DiskInfo*) malloc(disk_num * sizeof(DiskInfo)); result_diskinfos = getDiskInfos(diskInfos, &disk_num); adapterInfos = (AdapterInfo*) malloc(adapter_num * sizeof(AdapterInfo)); result_adapterInfos = getAdapterInfos(adapterInfos, &adapter_num); for (i = 0; i < disk_num; i++) { for (j = 0; j < adapter_num; i++) { for (k = 0; k < 6; k++) identifiers[i * adapter_num + j][k] = diskInfos[i].disk_sn[k + 2] ^ adapterInfos[j].mac_address[k + 2]; } } free(diskInfos); free(adapterInfos); return OK; } static FUNCTION_RETURN generate_ethernet_pc_id(PcIdentifier * identifiers, unsigned int * num_identifiers, bool use_mac) { size_t adapters; FUNCTION_RETURN result_adapterInfos; unsigned int i, j, k; AdapterInfo *adapterInfos; result_adapterInfos = getAdapterInfos(NULL, &adapters); if (result_adapterInfos != OK) { return result_adapterInfos; } if (identifiers == NULL) { *num_identifiers = adapters; return OK; } else if (*num_identifiers < adapters) { *num_identifiers = adapters; return BUFFER_TOO_SMALL; } adapterInfos = (AdapterInfo*) malloc(adapters * sizeof(AdapterInfo)); result_adapterInfos = getAdapterInfos(adapterInfos, &adapters); for (j = 0; j < adapters; i++) { for (k = 0; k < 6; k++) if (use_mac) { identifiers[j][k] = adapterInfos[j].mac_address[k + 2]; } else { //use ip if (k < 4) { identifiers[j][k] = adapterInfos[j].ipv4_address[k]; } else { //padding identifiers[j][k] = 42; } } } free(adapterInfos); return OK; } static FUNCTION_RETURN generate_disk_pc_id(PcIdentifier * identifiers, unsigned int * num_identifiers, bool use_label) { size_t disk_num; FUNCTION_RETURN result_diskinfos; unsigned int required_id_size, i, k; DiskInfo * diskInfos; result_diskinfos = getDiskInfos(NULL, &disk_num); if (result_diskinfos != OK) { return result_diskinfos; } if (identifiers == NULL) { *num_identifiers = disk_num; return OK; } else if (*num_identifiers < disk_num) { *num_identifiers = disk_num; return BUFFER_TOO_SMALL; } diskInfos = (DiskInfo*) malloc(disk_num * sizeof(DiskInfo)); result_diskinfos = getDiskInfos(diskInfos, &disk_num); for (i = 0; i < disk_num; i++) { for (k = 0; k < 6; k++) { if (use_label) { identifiers[i][k] = diskInfos[i].label[k]; } else { identifiers[i][k] = diskInfos[i].disk_sn[k + 2]; } } } free(diskInfos); return OK; } /** * * Calculates all the possible identifiers for the current machine, for the * given calculation strategy requested. Pc identifiers are more than one, * for instance a machine with more than one disk and one network interface has * usually multiple identifiers. * * @param identifiers * @param array_size * @param * @return */ FUNCTION_RETURN generate_pc_id(PcIdentifier * identifiers, unsigned int * array_size, IDENTIFICATION_STRATEGY strategy) { FUNCTION_RETURN result; unsigned int i; unsigned char strategy_num; switch (strategy) { case DEFAULT: result = generate_default_pc_id(identifiers, array_size); break; case ETHERNET: result = generate_ethernet_pc_id(identifiers, array_size, false); break; case IP_ADDRESS: result = generate_ethernet_pc_id(identifiers, array_size, false); break; case DISK_NUM: result = generate_disk_pc_id(identifiers, array_size, false); break; case DISK_LABEL: result = generate_disk_pc_id(identifiers, array_size, false); break; default: return ERROR; } if (result == OK && identifiers != NULL) { strategy_num = strategy << 5; for (i = 0; i < *array_size; i++) { //encode strategy in the first three bits of the pc_identifier identifiers[i][0] = (identifiers[i][0] & 31) | strategy_num; } } return result; } FUNCTION_RETURN encode_pc_id(PcIdentifier identifier1, PcIdentifier identifier2, UserPcIdentifier* pc_identifier_out) { } FUNCTION_RETURN parity_check_id(UserPcIdentifier pc_identifier) { } /** * Extract the two pc identifiers from the user provided code. * @param identifier1_out * @param identifier2_out * @param str_code: the code in the string format XXXX-XXXX-XXXX-XXXX * @return */ int decode_pc_id(PcIdentifier* identifier1_out, PcIdentifier* identifier2_out, UserPcIdentifier str_code) { }