static bool _some_oval_result_exists(struct oscap_source *xccdf_source) { struct xccdf_benchmark *benchmark = NULL; struct xccdf_policy_model *policy_model = NULL; struct oscap_file_entry_list *files = NULL; struct oscap_file_entry_iterator *files_it = NULL; char *oval_result = NULL; bool result = false; benchmark = xccdf_benchmark_import_source(xccdf_source); if (benchmark == NULL) return false; policy_model = xccdf_policy_model_new(benchmark); files = xccdf_policy_model_get_systems_and_files(policy_model); files_it = oscap_file_entry_list_get_files(files); oval_result = malloc(PATH_MAX * sizeof(char)); while (oscap_file_entry_iterator_has_more(files_it)) { struct oscap_file_entry *file_entry = (struct oscap_file_entry *) oscap_file_entry_iterator_next(files_it);; struct stat sb; if (strcmp(oscap_file_entry_get_system(file_entry), "http://oval.mitre.org/XMLSchema/oval-definitions-5")) continue; snprintf(oval_result, PATH_MAX, "./%s.result.xml", oscap_file_entry_get_file(file_entry)); if (stat(oval_result, &sb) == 0) { result = true; break; } } free(oval_result); oscap_file_entry_iterator_free(files_it); oscap_file_entry_list_free(files); xccdf_policy_model_free(policy_model); return result; }
static inline void _print_xccdf_benchmark(struct xccdf_benchmark *bench, const char *prefix) { _print_xccdf_status(xccdf_benchmark_get_status_current(bench), prefix); printf("%sResolved: %s\n", prefix, xccdf_benchmark_get_resolved(bench) ? "true" : "false"); _print_xccdf_profiles(xccdf_benchmark_get_profiles(bench), prefix); struct xccdf_policy_model *policy_model = xccdf_policy_model_new(bench); _print_xccdf_referenced_files(policy_model, prefix); _print_xccdf_testresults(bench, prefix); xccdf_policy_model_free(policy_model); // xccdf_benchmark_free not needed, it si already freed by the policy! }