struct oval_result_test *oval_result_test_clone (struct oval_result_system *new_system, struct oval_result_test *old_test) { __attribute__nonnull__(old_test); const char *testid = oval_result_test_get_id(old_test); struct oval_result_test *new_test = oval_result_test_new(new_system, (char *) testid); struct oval_result_item_iterator *old_items = oval_result_test_get_items(old_test); while (oval_result_item_iterator_has_more(old_items)) { struct oval_result_item *old_item = oval_result_item_iterator_next(old_items); struct oval_result_item *new_item = oval_result_item_clone(new_system, old_item); oval_result_test_add_item(new_test, new_item); } oval_result_item_iterator_free(old_items); struct oval_variable_binding_iterator *old_bindings = oval_result_test_get_bindings(old_test); while (oval_variable_binding_iterator_has_more(old_bindings)) { struct oval_variable_binding *old_binding = oval_variable_binding_iterator_next(old_bindings); struct oval_variable_binding *new_binding = oval_variable_binding_clone(old_binding, NULL); oval_result_test_add_binding(new_test, new_binding); } oval_variable_binding_iterator_free(old_bindings); struct oval_message_iterator *old_messages = oval_result_test_get_messages(old_test); while (oval_message_iterator_has_more(old_messages)) { struct oval_message *old_message = oval_message_iterator_next(old_messages); struct oval_message *new_message = oval_message_clone(old_message); oval_result_test_add_message(new_test, new_message); } oval_message_iterator_free(old_messages); oval_result_test_set_instance(new_test, oval_result_test_get_instance(old_test)); oval_result_test_set_result(new_test, old_test->result); return new_test; }
static int _oval_result_test_binding_parse(xmlTextReaderPtr reader, struct oval_parser_context *context, void **args) { int return_code = 0; xmlChar *variable_id = xmlTextReaderGetAttribute(reader, BAD_CAST "variable_id"); struct oval_syschar_model *syschar_model = oval_result_system_get_syschar_model(SYSTEM); struct oval_definition_model *definition_model = oval_syschar_model_get_definition_model(syschar_model); struct oval_variable *variable = oval_definition_model_get_new_variable (definition_model, (char *)variable_id, OVAL_VARIABLE_UNKNOWN); xmlChar *value = xmlTextReaderValue(reader); struct oval_variable_binding *binding = oval_variable_binding_new(variable, oscap_strdup((char *) value)); oval_result_test_add_binding(TEST, binding); xmlFree(value); xmlFree(variable_id); return return_code; }
static void _oval_result_test_initialize_bindings(struct oval_result_test *rslt_test) { __attribute__nonnull__(rslt_test); struct oval_test *oval_test = oval_result_test_get_test(rslt_test); struct oval_string_map *vm; struct oval_state_iterator *ste_itr; struct oval_iterator *var_itr; vm = oval_string_map_new(); /* Gather bindings pertaining to the referenced states */ /* TODO: cache bindings collected for each state */ ste_itr = oval_test_get_states(oval_test); while (oval_state_iterator_has_more(ste_itr)) { struct oval_state *ste; ste = oval_state_iterator_next(ste_itr); oval_ste_collect_var_refs(ste, vm); } oval_state_iterator_free(ste_itr); var_itr = oval_string_map_values(vm); while (oval_collection_iterator_has_more(var_itr)) { struct oval_variable *var; struct oval_value_iterator *val_itr; struct oval_variable_binding *binding; var = oval_collection_iterator_next(var_itr); binding = oval_variable_binding_new(var, NULL); val_itr = oval_variable_get_values(var); while (oval_value_iterator_has_more(val_itr)) { struct oval_value *val; char *txt; val = oval_value_iterator_next(val_itr); txt = oval_value_get_text(val); txt = oscap_strdup(txt); oval_variable_binding_add_value(binding, txt); } oval_value_iterator_free(val_itr); oval_result_test_add_binding(rslt_test, binding); } oval_collection_iterator_free(var_itr); /* Gather bindings pertaining to the collected object */ struct oval_object *oval_object = oval_test_get_object(oval_test); if (oval_object) { char *object_id = oval_object_get_id(oval_object); struct oval_result_system *sys = oval_result_test_get_system(rslt_test); struct oval_syschar_model *syschar_model = oval_result_system_get_syschar_model(sys); struct oval_syschar *syschar = oval_syschar_model_get_syschar(syschar_model, object_id); /* no syschar if system characteristics was a subset of definitions */ if(syschar) { struct oval_variable_binding_iterator *bindings = oval_syschar_get_variable_bindings(syschar); while (oval_variable_binding_iterator_has_more(bindings)) { struct oval_variable *var; char *var_id; struct oval_variable_binding *binding = oval_variable_binding_iterator_next(bindings); var = oval_variable_binding_get_variable(binding); var_id = oval_variable_get_id(var); /* Don't add bindings that were already * collected from states. Assumtion is made * that object's own bindings don't contain * duplicates. */ if (oval_string_map_get_value(vm, var_id) == NULL) { struct oval_definition_model *definition_model = oval_syschar_model_get_definition_model(syschar_model); struct oval_variable_binding *binding_copy = oval_variable_binding_clone(binding, definition_model); oval_result_test_add_binding(rslt_test, binding_copy); } } oval_variable_binding_iterator_free(bindings); } } oval_string_map_free(vm, NULL); rslt_test->bindings_initialized = true; }