backup_file_t *backup_file_create(const char *filepath) { backup_file_t *file = backup_file_new(); if (filepath) { file->filepath = strdup(filepath); } file->mbdb_record = mbdb_record_create(); mbdb_record_init(file->mbdb_record); return file; }
backup_file_t *backup_file_create_with_data(unsigned char *data, unsigned int size, int copy) { backup_file_t *file = backup_file_new(); if (!file) { return NULL; } file->mbdb_record = mbdb_record_create(); mbdb_record_init(file->mbdb_record); backup_file_assign_file_data(file, data, size, copy); return file; }
mbdb_record_t* mbdb_record_parse(unsigned char* data) { unsigned int offset = 0; mbdb_record_t* record = mbdb_record_create(); if (record == NULL) { error("Unable to parse mbdb record\n"); return NULL; } // Parse Domain unsigned short strsize = be16toh(*((unsigned short*)&data[offset])); if (strsize > 0 && strsize < 0xFFFF) { record->domain = (char*) malloc(strsize+1); if (record->domain == NULL) { error("Allocation Error!\n"); return NULL; } offset += 2; memcpy(record->domain, &data[offset], strsize); record->domain[strsize] = 0; offset += strsize; } else { record->domain = NULL; offset+=2; } record->domain_size = strsize; // Parse Path strsize = be16toh(*((unsigned short*)&data[offset])); if (strsize > 0 && strsize < 0xFFFF) { record->path = (char*) malloc(strsize+1); if (record->path == NULL) { error("Allocation Error!\n"); return NULL; } offset+=2; memcpy(record->path, &data[offset], strsize); record->path[strsize] = 0; offset += strsize; } else { record->path = NULL; offset+=2; } record->path_size = strsize; // Parse Target strsize = be16toh(*((unsigned short*) &data[offset])); if (strsize > 0 && strsize < 0xFFFF) { record->target = (char*) malloc(strsize+1); if (record->target == NULL) { error("Allocation Error!\n"); return NULL; } offset+=2; memcpy(record->target, &data[offset], strsize); record->target[strsize] = 0; offset += strsize; } else { record->target = NULL; offset+=2; } record->target_size = strsize; // parse DataHash strsize = be16toh(*((unsigned short*) &data[offset])); if (strsize > 0 && strsize < 0xFFFF) { record->datahash = (char*) malloc(strsize); if (record->datahash == NULL) { error("Allocation Error!\n"); return NULL; } offset+=2; memcpy(record->datahash, &data[offset], strsize); offset += strsize; } else { record->datahash = NULL; offset+=2; } record->datahash_size = strsize; // parse unknown1 strsize = be16toh(*((unsigned short*) &data[offset])); if (strsize > 0 && strsize < 0xFFFF) { record->unknown1 = (char*) malloc(strsize+1); if (record->unknown1 == NULL) { error("Allocation Error!\n"); return NULL; } offset+=2; memcpy(record->unknown1, &data[offset], strsize); record->unknown1[strsize] = 0; offset += strsize; } else { record->unknown1 = NULL; offset+=2; } record->unknown1_size = strsize; record->mode = be16toh(*((unsigned short*) &data[offset])); offset += 2; record->unknown2 = be32toh(*((unsigned int*) &data[offset])); offset += 4; record->inode = be32toh(*((unsigned int*) &data[offset])); offset += 4; record->uid = be32toh(*((unsigned int*) &data[offset])); offset += 4; record->gid = be32toh(*((unsigned int*) &data[offset])); offset += 4; record->time1 = be32toh(*((unsigned int*) &data[offset])); offset += 4; record->time2 = be32toh(*((unsigned int*) &data[offset])); offset += 4; record->time3 = be32toh(*((unsigned int*) &data[offset])); offset += 4; record->length = be64toh(*((unsigned long long*) &data[offset])); offset += 8; record->flag = *((unsigned char*) &data[offset]); offset += 1; record->property_count = *((unsigned char*) &data[offset]); offset += 1; if (record->property_count > 0) { record->properties = (mbdb_record_property_t**)malloc(sizeof(mbdb_record_property_t*) * record->property_count); int i; for (i = 0; i < record->property_count; i++) { mbdb_record_property_t* prop = malloc(sizeof(mbdb_record_property_t)); prop->name_size = be16toh(*((unsigned short*)&data[offset])); prop->name = (char*)malloc(prop->name_size+1); offset+=2; memcpy(prop->name, &data[offset], prop->name_size); prop->name[prop->name_size] = 0; offset+=prop->name_size; prop->value_size = be16toh(*((unsigned short*)&data[offset])); prop->value = (char*)malloc(prop->value_size+1); offset+=2; memcpy(prop->value, &data[offset], prop->value_size); prop->value[prop->value_size] = 0; offset+=prop->value_size; record->properties[i] = prop; } } record->this_size = offset; //mbdb_record_debug(record); return record; }