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; }
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; }