int oval_definition_model_bind_variable_model(struct oval_definition_model *defmodel, struct oval_variable_model *varmodel) { struct oval_string_iterator *evar_id_itr; if (!defmodel->bound_variable_models) defmodel->bound_variable_models = oval_collection_new(); oval_collection_add(defmodel->bound_variable_models, varmodel); /* todo: keep reference count for each variable model if it can be bound to multiple definition models */ evar_id_itr = oval_variable_model_get_variable_ids(varmodel); while (oval_string_iterator_has_more(evar_id_itr)) { char *evar_id; struct oval_variable *var; evar_id = oval_string_iterator_next(evar_id_itr); var = oval_definition_model_get_variable(defmodel, evar_id); if (!var) continue; oval_variable_bind_ext_var(var, varmodel, evar_id); } oval_string_iterator_free(evar_id_itr); return 0; }
static void _oval_definition_model_clone(struct oval_string_map *oldmap, struct oval_definition_model *newmodel, _oval_clone_func cloner) { struct oval_string_iterator *keys = (struct oval_string_iterator *)oval_string_map_keys(oldmap); while (oval_string_iterator_has_more(keys)) { char *key = oval_string_iterator_next(keys); void *olditem = oval_string_map_get_value(oldmap, key); (*cloner) (newmodel, olditem); } oval_string_iterator_free(keys); }
struct oval_affected *oval_affected_clone(struct oval_definition_model *new_model, struct oval_affected *old_affected) { __attribute__nonnull__(old_affected); struct oval_affected *new_affected = oval_affected_new(new_model); oval_affected_set_family(new_affected, old_affected->family); struct oval_string_iterator *platforms = oval_affected_get_platforms(old_affected); while (oval_string_iterator_has_more(platforms)) { char *platform = oval_string_iterator_next(platforms); oval_affected_add_platform(new_affected, platform); } oval_string_iterator_free(platforms); struct oval_string_iterator *products = oval_affected_get_products(old_affected); while (oval_string_iterator_has_more(products)) { char *product = oval_string_iterator_next(products); oval_affected_add_product(new_affected, product); } oval_string_iterator_free(products); return new_affected; }
static void _oval_result_binding_to_dom(struct oval_variable_binding *binding, xmlDocPtr doc, xmlNode *parent) { xmlNs *ns_results = xmlSearchNsByHref(doc, parent, OVAL_RESULTS_NAMESPACE); struct oval_variable *oval_variable = oval_variable_binding_get_variable(binding); char *variable_id = oval_variable_get_id(oval_variable); struct oval_string_iterator *str_itr; str_itr = oval_variable_binding_get_values(binding); while (oval_string_iterator_has_more(str_itr)) { char *value; xmlNode *binding_node; value = oval_string_iterator_next(str_itr); binding_node = xmlNewTextChild(parent, ns_results, BAD_CAST "tested_variable", BAD_CAST value); xmlNewProp(binding_node, BAD_CAST "variable_id", BAD_CAST variable_id); } oval_string_iterator_free(str_itr); }
struct oval_test *oval_test_clone(struct oval_definition_model *new_model, struct oval_test *old_test) { __attribute__nonnull__(old_test); struct oval_state_iterator *ste_itr; struct oval_test *new_test = oval_definition_model_get_test(new_model, old_test->id); if (new_test == NULL) { new_test = oval_test_new(new_model, old_test->id); oval_test_set_deprecated(new_test, old_test->deprecated); oval_test_set_version(new_test, old_test->version); oval_test_set_check(new_test, old_test->check); oval_test_set_existence(new_test, old_test->existence); oval_test_set_state_operator(new_test, old_test->state_operator); oval_test_set_subtype(new_test, old_test->subtype); oval_test_set_comment(new_test, old_test->comment); if (old_test->object) { struct oval_object *object = oval_object_clone(new_model, old_test->object); oval_test_set_object(new_test, object); } ste_itr = oval_test_get_states(old_test); while (oval_state_iterator_has_more(ste_itr)) { struct oval_state *ste; ste = oval_state_iterator_next(ste_itr); ste = oval_state_clone(new_model, ste); oval_test_add_state(new_test, ste); } oval_state_iterator_free(ste_itr); struct oval_string_iterator *notes = oval_test_get_notes(old_test); while (oval_string_iterator_has_more(notes)) { char *note = oval_string_iterator_next(notes); oval_test_add_note(new_test, note); } oval_string_iterator_free(notes); } return new_test; }
xmlNode *oval_test_to_dom(struct oval_test *test, xmlDoc * doc, xmlNode * parent) { xmlNode * test_node=NULL; /* skip unknown test */ oval_subtype_t subtype = oval_test_get_subtype(test); if ( subtype == OVAL_SUBTYPE_UNKNOWN ) { oscap_dlprintf(DBG_E, "Unknown Test %s.\n", oval_test_get_id(test)); return test_node; } /* get test name */ const char *subtype_text = oval_subtype_get_text(subtype); char test_name[strlen(subtype_text) + 6]; sprintf(test_name, "%s_test", subtype_text); /* get family URI */ oval_family_t family = oval_test_get_family(test); const char *family_text = oval_family_get_text(family); char family_uri[strlen((const char *)OVAL_DEFINITIONS_NAMESPACE) + strlen(family_text) + 2]; sprintf(family_uri,"%s#%s", OVAL_DEFINITIONS_NAMESPACE, family_text); /* search namespace & create child */ xmlNs *ns_family = xmlSearchNsByHref(doc, parent, BAD_CAST family_uri); test_node = xmlNewTextChild(parent, ns_family, BAD_CAST test_name, NULL); char *id = oval_test_get_id(test); xmlNewProp(test_node, BAD_CAST "id", BAD_CAST id); char version[10]; *version = '\0'; snprintf(version, sizeof(version), "%d", oval_test_get_version(test)); xmlNewProp(test_node, BAD_CAST "version", BAD_CAST version); oval_existence_t existence = oval_test_get_existence(test); if (existence != OVAL_AT_LEAST_ONE_EXISTS) xmlNewProp(test_node, BAD_CAST "check_existence", BAD_CAST oval_existence_get_text(existence)); oval_check_t check = oval_test_get_check(test); xmlNewProp(test_node, BAD_CAST "check", BAD_CAST oval_check_get_text(check)); oval_operator_t ste_operator = oval_test_get_state_operator(test); if (ste_operator != OVAL_OPERATOR_AND) xmlNewProp(test_node, BAD_CAST "state_operator", BAD_CAST oval_operator_get_text(ste_operator)); char *comm = oval_test_get_comment(test); xmlNewProp(test_node, BAD_CAST "comment", BAD_CAST comm); bool deprecated = oval_test_get_deprecated(test); if (deprecated) xmlNewProp(test_node, BAD_CAST "deprecated", BAD_CAST "true"); struct oval_string_iterator *notes = oval_test_get_notes(test); if (oval_string_iterator_has_more(notes)) { xmlNs *ns_definitions = xmlSearchNsByHref(doc, parent, OVAL_DEFINITIONS_NAMESPACE); xmlNode *notes_node = xmlNewTextChild(test_node, ns_definitions, BAD_CAST "notes", NULL); while (oval_string_iterator_has_more(notes)) { char *note = oval_string_iterator_next(notes); xmlNewTextChild(notes_node, ns_definitions, BAD_CAST "note", BAD_CAST note); } } oval_string_iterator_free(notes); struct oval_object *object = oval_test_get_object(test); if (object) { xmlNode *object_node = xmlNewTextChild(test_node, ns_family, BAD_CAST "object", NULL); xmlNewProp(object_node, BAD_CAST "object_ref", BAD_CAST oval_object_get_id(object)); } struct oval_state_iterator *ste_itr = oval_test_get_states(test); while (oval_state_iterator_has_more(ste_itr)) { struct oval_state *state; state = oval_state_iterator_next(ste_itr); xmlNode *state_node = xmlNewTextChild(test_node, ns_family, BAD_CAST "state", NULL); xmlNewProp(state_node, BAD_CAST "state_ref", BAD_CAST oval_state_get_id(state)); } oval_state_iterator_free(ste_itr); return test_node; }