Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}