int ds_dump_component_sources(struct oscap_htable *component_sources, const char *target_dir) { struct oscap_htable_iterator *hit = oscap_htable_iterator_new(component_sources); while (oscap_htable_iterator_has_more(hit)) { struct oscap_source *s = oscap_htable_iterator_next_value(hit); char *filename = target_dir == NULL ? oscap_strdup(oscap_source_readable_origin(s)) : oscap_sprintf("%s/%s", target_dir, oscap_source_readable_origin(s)); int ret = oscap_acquire_ensure_parent_dir(filename); if (ret != 0) { oscap_htable_iterator_free(hit); return ret; } ret = oscap_source_save_as(s, filename); free(filename); if (ret != 0) { oscap_htable_iterator_free(hit); return ret; } } oscap_htable_iterator_free(hit); return 0; }
static int ds_rds_create_from_dom(xmlDocPtr* ret, xmlDocPtr sds_doc, xmlDocPtr xccdf_result_file_doc, struct oscap_htable* oval_result_sources) { *ret = NULL; xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0"); xmlNodePtr root = xmlNewNode(NULL, BAD_CAST "asset-report-collection"); xmlDocSetRootElement(doc, root); xmlNsPtr arf_ns = xmlNewNs(root, BAD_CAST arf_ns_uri, BAD_CAST "arf"); xmlSetNs(root, arf_ns); xmlNsPtr core_ns = xmlNewNs(root, BAD_CAST core_ns_uri, BAD_CAST "core"); xmlNewNs(root, BAD_CAST ai_ns_uri, BAD_CAST "ai"); xmlNodePtr relationships = xmlNewNode(core_ns, BAD_CAST "relationships"); xmlNewNs(relationships, BAD_CAST arfvocab_ns_uri, BAD_CAST "arfvocab"); xmlNewNs(relationships, BAD_CAST arfrel_ns_uri, BAD_CAST "arfrel"); xmlAddChild(root, relationships); xmlNodePtr report_requests = xmlNewNode(arf_ns, BAD_CAST "report-requests"); xmlAddChild(root, report_requests); xmlNodePtr assets = xmlNewNode(arf_ns, BAD_CAST "assets"); xmlAddChild(root, assets); xmlNodePtr report_request = xmlNewNode(arf_ns, BAD_CAST "report-request"); xmlSetProp(report_request, BAD_CAST "id", BAD_CAST "collection1"); xmlNodePtr arf_content = xmlNewNode(arf_ns, BAD_CAST "content"); xmlDOMWrapCtxtPtr sds_wrap_ctxt = xmlDOMWrapNewCtxt(); xmlNodePtr sds_res_node = NULL; xmlDOMWrapCloneNode(sds_wrap_ctxt, sds_doc, xmlDocGetRootElement(sds_doc), &sds_res_node, doc, NULL, 1, 0); xmlAddChild(arf_content, sds_res_node); xmlDOMWrapReconcileNamespaces(sds_wrap_ctxt, sds_res_node, 0); xmlDOMWrapFreeCtxt(sds_wrap_ctxt); xmlAddChild(report_request, arf_content); xmlAddChild(report_requests, report_request); xmlNodePtr reports = xmlNewNode(arf_ns, BAD_CAST "reports"); ds_rds_add_xccdf_test_results(doc, reports, xccdf_result_file_doc, relationships, assets, "collection1"); unsigned int oval_report_suffix = 2; struct oscap_htable_iterator *hit = oscap_htable_iterator_new(oval_result_sources); while (oscap_htable_iterator_has_more(hit)) { struct oscap_source *oval_source = oscap_htable_iterator_next_value(hit); xmlDoc *oval_result_doc = oscap_source_get_xmlDoc(oval_source); char* report_id = oscap_sprintf("oval%i", oval_report_suffix++); ds_rds_create_report(doc, reports, oval_result_doc, report_id); oscap_free(report_id); } oscap_htable_iterator_free(hit); xmlAddChild(root, reports); *ret = doc; return 0; }