int ds_sds_session_register_component_with_dependencies(struct ds_sds_session *session, const char *container_name, const char *component_id, const char *target_filename) { xmlNode *datastream = ds_sds_session_get_selected_datastream(session); if (!datastream) { return -1; } xmlNodePtr container = node_get_child_element(datastream, container_name); if (!container) { if (ds_sds_session_get_datastream_id(session) == NULL) oscap_seterr(OSCAP_EFAMILY_XML, "No '%s' container element found in file '%s' in the first datastream.", container_name, oscap_source_readable_origin(session->source)); else oscap_seterr(OSCAP_EFAMILY_XML, "No '%s' container element found in file '%s' in datastream of id '%s'.", container_name, oscap_source_readable_origin(session->source), ds_sds_session_get_datastream_id(session)); return -1; } int res = -1; xmlNode *component_ref = containter_get_component_ref_by_id(container, component_id); if (component_ref != NULL) { if (target_filename == NULL) { res = ds_sds_dump_component_ref(component_ref, session); } else { res = ds_sds_dump_component_ref_as(component_ref, session, "." , target_filename); } } else { oscap_seterr(OSCAP_EFAMILY_XML, "No '%s' component ref found in file '%s' in datastream of id '%s'.", component_id, oscap_source_readable_origin(session->source), ds_sds_session_get_datastream_id(session)); return -1; } return res; }
static xmlNodePtr ds_sds_find_component_ref(xmlNodePtr datastream, const char* id) { /* This searches for a ds:component-ref (XLink) element with a given id. * It returns a first such element in a given ds:data-stream. */ xmlNodePtr cref_parent = datastream->children; for (; cref_parent != NULL; cref_parent = cref_parent->next) { if (cref_parent->type != XML_ELEMENT_NODE) continue; xmlNode *component_ref = containter_get_component_ref_by_id(cref_parent, id); if (component_ref != NULL) { return component_ref; } } return NULL; }