Blame src/OVAL/oval_vardefMapping.c

Packit Service 569379
/*
Packit Service 569379
 * Copyright 2013 Red Hat Inc., Durham, North Carolina.
Packit Service 569379
 * All Rights Reserved.
Packit Service 569379
 *
Packit Service 569379
 * This library is free software; you can redistribute it and/or
Packit Service 569379
 * modify it under the terms of the GNU Lesser General Public
Packit Service 569379
 * License as published by the Free Software Foundation; either
Packit Service 569379
 * version 2.1 of the License, or (at your option) any later version.
Packit Service 569379
 *
Packit Service 569379
 * This library is distributed in the hope that it will be useful,
Packit Service 569379
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 569379
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 569379
 * Lesser General Public License for more details.
Packit Service 569379
 *
Packit Service 569379
 * You should have received a copy of the GNU Lesser General Public
Packit Service 569379
 * License along with this library; if not, write to the Free Software
Packit Service 569379
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Packit Service 569379
 *
Packit Service 569379
 * Authors:
Packit Service 569379
 *      Šimon Lukašík
Packit Service 569379
 */
Packit Service 569379
Packit Service 569379
#ifdef HAVE_CONFIG_H
Packit Service 569379
#include <config.h>
Packit Service 569379
#endif
Packit Service 569379
Packit Service 569379
#include "oval_definitions_impl.h"
Packit Service 569379
Packit Service 569379
static void _oval_definition_fill_vardef(struct oval_definition *definition, struct oval_string_map *vardef);
Packit Service 569379
static void _oval_criteria_fill_vardef(struct oval_criteria_node *cnode, struct oval_string_map *vardef, const char *definition_id);
Packit Service 569379
static void _oval_test_fill_vardef(struct oval_test *test, struct oval_string_map *vardef, const char *definition_id);
Packit Service 569379
static void _oval_object_fill_vardef(struct oval_object *object, struct oval_string_map *vardef, const char *definition_id);
Packit Service 569379
static void _oval_setobject_fill_vardef(struct oval_setobject *set, struct oval_string_map *vardef, const char *definition_id);
Packit Service 569379
static void _oval_state_fill_vardef(struct oval_state *state, struct oval_string_map *vardef, const char *definition_id);
Packit Service 569379
static void _oval_entity_fill_vardef(struct oval_entity *entity, struct oval_string_map *vardef, const char *definition_id);
Packit Service 569379
static void _vardef_insert(struct oval_string_map *vardef, const char *definition_id, const char *variable_id);
Packit Service 569379
Packit Service 569379
struct oval_string_map *oval_definition_model_build_vardef_mapping(struct oval_definition_model *model)
Packit Service 569379
{
Packit Service 569379
	struct oval_string_map *vardef = oval_string_map_new();
Packit Service 569379
	struct oval_definition_iterator *def_it = oval_definition_model_get_definitions(model);
Packit Service 569379
	while (oval_definition_iterator_has_more(def_it)) {
Packit Service 569379
		struct oval_definition *definition = oval_definition_iterator_next(def_it);
Packit Service 569379
		_oval_definition_fill_vardef(definition, vardef);
Packit Service 569379
	}
Packit Service 569379
	oval_definition_iterator_free(def_it);
Packit Service 569379
	return vardef;
Packit Service 569379
}
Packit Service 569379
Packit Service 569379
void _oval_definition_fill_vardef(struct oval_definition *definition, struct oval_string_map *vardef)
Packit Service 569379
{
Packit Service 569379
	struct oval_criteria_node *cnode = oval_definition_get_criteria(definition);
Packit Service 569379
	if (cnode != NULL)
Packit Service 569379
		_oval_criteria_fill_vardef(cnode, vardef, oval_definition_get_id(definition));
Packit Service 569379
}
Packit Service 569379
Packit Service 569379
void _oval_criteria_fill_vardef(struct oval_criteria_node *cnode, struct oval_string_map *vardef, const char *definition_id)
Packit Service 569379
{
Packit Service 569379
	switch (oval_criteria_node_get_type(cnode)) {
Packit Service 569379
	case OVAL_NODETYPE_CRITERION:{
Packit Service 569379
		struct oval_test *test = oval_criteria_node_get_test(cnode);
Packit Service 569379
		if (test != NULL)
Packit Service 569379
			_oval_test_fill_vardef(test, vardef, definition_id);
Packit Service 569379
		} break;
Packit Service 569379
	case OVAL_NODETYPE_CRITERIA:{
Packit Service 569379
		struct oval_criteria_node_iterator *cnode_it = oval_criteria_node_get_subnodes(cnode);
Packit Service 569379
		if (cnode_it != NULL) {
Packit Service 569379
			while (oval_criteria_node_iterator_has_more(cnode_it)) {
Packit Service 569379
				struct oval_criteria_node *node = oval_criteria_node_iterator_next(cnode_it);
Packit Service 569379
				if (node != NULL)
Packit Service 569379
					_oval_criteria_fill_vardef(node, vardef, definition_id);
Packit Service 569379
			}
Packit Service 569379
			oval_criteria_node_iterator_free(cnode_it);
Packit Service 569379
		}
Packit Service 569379
		} break;
Packit Service 569379
	case OVAL_NODETYPE_EXTENDDEF:{
Packit Service 569379
		struct oval_definition *definition = oval_criteria_node_get_definition(cnode);
Packit Service 569379
		if (definition != NULL) {
Packit Service 569379
			struct oval_criteria_node *node = oval_definition_get_criteria(definition);
Packit Service 569379
			if (node != NULL)
Packit Service 569379
				_oval_criteria_fill_vardef(node, vardef, definition_id);
Packit Service 569379
		}
Packit Service 569379
		} break;
Packit Service 569379
	case OVAL_NODETYPE_UNKNOWN:
Packit Service 569379
	default:
Packit Service 569379
		assert(false);
Packit Service 569379
		break;
Packit Service 569379
	}
Packit Service 569379
}
Packit Service 569379
Packit Service 569379
void _oval_test_fill_vardef(struct oval_test *test, struct oval_string_map *vardef, const char *definition_id)
Packit Service 569379
{
Packit Service 569379
	struct oval_object *object = oval_test_get_object(test);
Packit Service 569379
	if (object != NULL)
Packit Service 569379
		_oval_object_fill_vardef(object, vardef, definition_id);
Packit Service 569379
	struct oval_state_iterator *ste_it = oval_test_get_states(test);
Packit Service 569379
	while (oval_state_iterator_has_more(ste_it)) {
Packit Service 569379
		struct oval_state *state = oval_state_iterator_next(ste_it);
Packit Service 569379
		if (state != NULL)
Packit Service 569379
			_oval_state_fill_vardef(state, vardef, definition_id);
Packit Service 569379
	}
Packit Service 569379
	oval_state_iterator_free(ste_it);
Packit Service 569379
}
Packit Service 569379
Packit Service 569379
void _oval_object_fill_vardef(struct oval_object *object, struct oval_string_map *vardef, const char *definition_id)
Packit Service 569379
{
Packit Service 569379
	struct oval_object_content_iterator *content_it = oval_object_get_object_contents(object);
Packit Service 569379
	while (oval_object_content_iterator_has_more(content_it)) {
Packit Service 569379
		struct oval_object_content *content = oval_object_content_iterator_next(content_it);
Packit Service 569379
		switch (oval_object_content_get_type(content)) {
Packit Service 569379
		case OVAL_OBJECTCONTENT_ENTITY:{
Packit Service 569379
			struct oval_entity *entity = oval_object_content_get_entity(content);
Packit Service 569379
			_oval_entity_fill_vardef(entity, vardef, definition_id);
Packit Service 569379
			} break;
Packit Service 569379
		case OVAL_OBJECTCONTENT_SET:{
Packit Service 569379
			struct oval_setobject *set = oval_object_content_get_setobject(content);
Packit Service 569379
			_oval_setobject_fill_vardef(set, vardef, definition_id);
Packit Service 569379
			} break;
Packit Service 569379
		default:
Packit Service 569379
			break;
Packit Service 569379
		}
Packit Service 569379
	}
Packit Service 569379
	oval_object_content_iterator_free(content_it);
Packit Service 569379
}
Packit Service 569379
Packit Service 569379
void _oval_setobject_fill_vardef(struct oval_setobject *set, struct oval_string_map *vardef, const char *definition_id)
Packit Service 569379
{
Packit Service 569379
	switch (oval_setobject_get_type(set)) {
Packit Service 569379
	case OVAL_SET_AGGREGATE:{
Packit Service 569379
		struct oval_setobject_iterator *subset_it = oval_setobject_get_subsets(set);
Packit Service 569379
		while (oval_setobject_iterator_has_more(subset_it)) {
Packit Service 569379
			struct oval_setobject *subset = oval_setobject_iterator_next(subset_it);
Packit Service 569379
			_oval_setobject_fill_vardef(subset, vardef, definition_id);
Packit Service 569379
		}
Packit Service 569379
		oval_setobject_iterator_free(subset_it);
Packit Service 569379
		} break;
Packit Service 569379
	case OVAL_SET_COLLECTIVE:{
Packit Service 569379
		struct oval_object_iterator *object_it = oval_setobject_get_objects(set);
Packit Service 569379
		while (oval_object_iterator_has_more(object_it)) {
Packit Service 569379
			struct oval_object *object = oval_object_iterator_next(object_it);
Packit Service 569379
			_oval_object_fill_vardef(object, vardef, definition_id);
Packit Service 569379
		}
Packit Service 569379
		oval_object_iterator_free(object_it);
Packit Service 569379
Packit Service 569379
		struct oval_filter_iterator *filter_it = oval_setobject_get_filters(set);
Packit Service 569379
		while (oval_filter_iterator_has_more(filter_it)) {
Packit Service 569379
			struct oval_filter *filter = oval_filter_iterator_next(filter_it);
Packit Service 569379
			struct oval_state *state = oval_filter_get_state(filter);
Packit Service 569379
			_oval_state_fill_vardef(state, vardef, definition_id);
Packit Service 569379
		}
Packit Service 569379
		oval_filter_iterator_free(filter_it);
Packit Service 569379
		} break;
Packit Service 569379
	default:
Packit Service 569379
		break;
Packit Service 569379
	}
Packit Service 569379
}
Packit Service 569379
Packit Service 569379
void _oval_state_fill_vardef(struct oval_state *state, struct oval_string_map *vardef, const char *definition_id)
Packit Service 569379
{
Packit Service 569379
	struct oval_state_content_iterator *content_it = oval_state_get_contents(state);
Packit Service 569379
	while (oval_state_content_iterator_has_more(content_it)) {
Packit Service 569379
		struct oval_state_content *content = oval_state_content_iterator_next(content_it);
Packit Service 569379
		struct oval_entity *entity = oval_state_content_get_entity(content);
Packit Service 569379
		if (entity != NULL)
Packit Service 569379
			_oval_entity_fill_vardef(entity, vardef, definition_id);
Packit Service 569379
	}
Packit Service 569379
	oval_state_content_iterator_free(content_it);
Packit Service 569379
}
Packit Service 569379
Packit Service 569379
void _oval_entity_fill_vardef(struct oval_entity *entity, struct oval_string_map *vardef, const char *definition_id)
Packit Service 569379
{
Packit Service 569379
	if (oval_entity_get_varref_type(entity) == OVAL_ENTITY_VARREF_ATTRIBUTE ||
Packit Service 569379
		oval_entity_get_varref_type(entity) == OVAL_ENTITY_VARREF_ELEMENT) {
Packit Service 569379
		struct oval_variable *variable = oval_entity_get_variable(entity);
Packit Service 569379
		if (variable != NULL)
Packit Service 569379
			_vardef_insert(vardef, definition_id, oval_variable_get_id(variable));
Packit Service 569379
	}
Packit Service 569379
}
Packit Service 569379
Packit Service 569379
void _vardef_insert(struct oval_string_map *vardef, const char *definition_id, const char *variable_id)
Packit Service 569379
{
Packit Service 569379
	struct oval_string_map *def_list = (struct oval_string_map *) oval_string_map_get_value(vardef, variable_id);
Packit Service 569379
	if (def_list == NULL) {
Packit Service 569379
		def_list = oval_string_map_new();
Packit Service 569379
		oval_string_map_put(vardef, variable_id, def_list);
Packit Service 569379
	}
Packit Service 569379
	oval_string_map_put(def_list, definition_id, (void *) "");
Packit Service 569379
}