struct xccdf_benchmark *xccdf_benchmark_import_source(struct oscap_source *source) { xmlTextReader *reader = oscap_source_get_xmlTextReader(source); while (xmlTextReaderRead(reader) == 1 && xmlTextReaderNodeType(reader) != XML_READER_TYPE_ELEMENT) ; struct xccdf_benchmark *benchmark = xccdf_benchmark_new(); const bool parse_result = xccdf_benchmark_parse(XITEM(benchmark), reader); xmlFreeTextReader(reader); if (!parse_result) { // parsing fatal error oscap_seterr(OSCAP_EFAMILY_XML, "Failed to import XCCDF content from '%s'.", oscap_source_readable_origin(source)); xccdf_benchmark_free(benchmark); return NULL; } // This is sadly the only place where we can pass origin file information // to the CPE1 embedded dictionary (if any). It is necessary to figure out // proper paths to OVAL files referenced from CPE1 dictionaries. // FIXME: Refactor and move this somewhere else struct cpe_dict_model* embedded_dict = xccdf_benchmark_get_cpe_list(benchmark); if (embedded_dict != NULL) { cpe_dict_model_set_origin_file(embedded_dict, oscap_source_readable_origin(source)); } // same situation with embedded CPE2 lang model // FIXME: Refactor and move this somewhere else struct cpe_lang_model* embedded_lang_model = xccdf_benchmark_get_cpe_lang_model(benchmark); if (embedded_lang_model != NULL) { cpe_lang_model_set_origin_file(embedded_lang_model, oscap_source_readable_origin(source)); } return benchmark; }
struct rds_index *ds_rds_session_get_rds_idx(struct ds_rds_session *session) { if (session->index == NULL) { xmlTextReader *reader = oscap_source_get_xmlTextReader(session->source); if (reader == NULL) { return NULL; } session->index = rds_index_parse(reader); xmlFreeTextReader(reader); } return session->index; }
char * xccdf_detect_version(const char* file) { struct oscap_source *source = oscap_source_new_from_file(file); xmlTextReader *reader = oscap_source_get_xmlTextReader(source); if (!reader) { oscap_source_free(source); return NULL; } char *doc_version = xccdf_detect_version_priv(reader); xmlFreeTextReader(reader); oscap_source_free(source); return doc_version; }
struct cpe_lang_model *cpe_lang_model_import_source(struct oscap_source *source) { xmlTextReaderPtr reader = oscap_source_get_xmlTextReader(source); struct cpe_lang_model *ret = NULL; if (reader != NULL) { xmlTextReaderNextNode(reader); ret = cpe_lang_model_parse(reader); if (ret != NULL) { cpe_lang_model_set_origin_file(ret, oscap_source_readable_origin(source)); } } xmlFreeTextReader(reader); return ret; }
static inline int _oval_definition_model_merge_source(struct oval_definition_model *model, struct oscap_source *source) { /* setup context */ struct oval_parser_context context; context.reader = oscap_source_get_xmlTextReader(source); if (context.reader == NULL) { return -1; } context.definition_model = model; context.user_data = NULL; /* jump into oval_definitions */ while (xmlTextReaderRead(context.reader) == 1 && xmlTextReaderNodeType(context.reader) != XML_READER_TYPE_ELEMENT) ; /* start parsing */ int ret = oval_definition_model_parse(context.reader, &context); xmlFreeTextReader(context.reader); return ret; }