int ds_sds_decompose_custom(const char* input_file, const char* id, const char* target_dir, const char* container_name, const char* component_id, const char* target_filename) { struct oscap_source *ds_source = oscap_source_new_from_file(input_file); struct ds_sds_session *session = ds_sds_session_new_from_source(ds_source); if (session == NULL) { oscap_source_free(ds_source); return -1; } if (ds_sds_session_set_datastream_id(session, id)) { ds_sds_session_free(session); oscap_source_free(ds_source); return -1; } if (ds_sds_session_set_target_dir(session, oscap_streq(target_dir, "") ? "." : target_dir)) { ds_sds_session_free(session); oscap_source_free(ds_source); return -1; } if (ds_sds_session_register_component_with_dependencies(session, container_name, component_id, target_filename) != 0) { ds_sds_session_free(session); oscap_source_free(ds_source); return -1; } int ret = ds_sds_session_dump_component_files(session); ds_sds_session_free(session); oscap_source_free(ds_source); return ret; }
struct oscap_source *ds_sds_session_select_tailoring(struct ds_sds_session *session, const char *component_id) { if (ds_sds_session_register_component_with_dependencies(session, "checklists", component_id, "tailoring.xml") != 0) { oscap_seterr(OSCAP_EFAMILY_OSCAP, "Could not extract %s with all dependencies from datastream.", component_id); return NULL; } struct oscap_source *tailoring = oscap_htable_get(session->component_sources, "tailoring.xml"); if (tailoring == NULL) { oscap_seterr(OSCAP_EFAMILY_OSCAP, "Internal error: Could not acquire handle to tailoring.xml source."); } return tailoring; }
int app_ds_sds_split(const struct oscap_action *action) { int ret = OSCAP_ERROR; const char* f_datastream_id = action->f_datastream_id; const char* f_component_id = action->f_xccdf_id; struct ds_sds_session *session = NULL; struct oscap_source *source = oscap_source_new_from_file(action->ds_action->file); /* Validate */ if (action->validate) { if (oscap_source_validate(source, reporter, (void *) action) != 0) { goto cleanup; } } session = ds_sds_session_new_from_source(source); if (session == NULL) { goto cleanup; } if (ds_sds_index_select_checklist(ds_sds_session_get_sds_idx(session), &f_datastream_id, &f_component_id) != 0) { fprintf(stdout, "Failed to locate a datastream with ID matching '%s' ID " "and checklist inside matching '%s' ID.\n", action->f_datastream_id == NULL ? "<any>" : action->f_datastream_id, action->f_xccdf_id == NULL ? "<any>" : action->f_xccdf_id); goto cleanup; } ds_sds_session_set_datastream_id(session, f_datastream_id); ds_sds_session_set_remote_resources(session, action->remote_resources, download_reporting_callback); ds_sds_session_set_target_dir(session, action->ds_action->target); if (ds_sds_session_register_component_with_dependencies(session, "checklists", f_component_id, NULL) != 0) { goto cleanup; } if (ds_sds_session_dump_component_files(session) != 0) { goto cleanup; } ret = OSCAP_OK; cleanup: oscap_print_error(); ds_sds_session_free(session); oscap_source_free(source); free(action->ds_action); return ret; }
struct oscap_source *ds_sds_session_select_checklist(struct ds_sds_session *session, const char *datastream_id, const char *component_id, const char *benchmark_id) { session->datastream_id = datastream_id; session->checklist_id = component_id; // We only use benchmark ID if datastream ID and/or component ID were NOT supplied. if (!datastream_id && !component_id && benchmark_id) { if (ds_sds_index_select_checklist_by_benchmark_id(ds_sds_session_get_sds_idx(session), benchmark_id, (const char **) &(session->datastream_id), (const char **) &(session->checklist_id)) != 0) { oscap_seterr(OSCAP_EFAMILY_OSCAP, "Failed to locate a datastream with component-ref " "that points to a component containing Benchmark with ID '%s'.", benchmark_id); return NULL; } } else { if (benchmark_id) { oscap_seterr(OSCAP_EFAMILY_OSCAP, "Not using benchmark ID ('%s') for component-ref lookup, " "datastream ID ('%s') and/or component-ref ID ('%s') were supplied, using them instead.", benchmark_id, datastream_id, component_id); } if (ds_sds_index_select_checklist(ds_sds_session_get_sds_idx(session), (const char **) &(session->datastream_id), (const char **) &(session->checklist_id)) != 0) { oscap_seterr(OSCAP_EFAMILY_OSCAP, "Failed to locate a datastream with ID matching " "'%s' ID and checklist inside matching '%s' ID.", datastream_id == NULL ? "<any>" : datastream_id, component_id == NULL ? "<any>" : component_id); return NULL; } } if (ds_sds_session_register_component_with_dependencies(session, "checklists", session->checklist_id, session->checklist_id) != 0) { oscap_seterr(OSCAP_EFAMILY_OSCAP, "Could not extract %s with all dependencies from datastream.", session->checklist_id); return NULL; } struct oscap_source *xccdf = oscap_htable_get(session->component_sources, session->checklist_id); if (xccdf == NULL) { oscap_seterr(OSCAP_EFAMILY_OSCAP, "Internal error: Could not acquire handle to '%s' source.", session->checklist_id); } return xccdf; }