int oval_sysent_parse_tag(xmlTextReaderPtr reader, struct oval_parser_context *context, oval_sysent_consumer consumer, void *user) { int ret, mask; char *tagname; struct oval_sysent *sysent; oval_datatype_t datatype; oval_syschar_status_t status; __attribute__nonnull__(context); tagname = (char *) xmlTextReaderLocalName(reader); if (!strcmp("#text", tagname)) { xmlFree(tagname); return 0; } sysent = oval_sysent_new(context->syschar_model); oval_sysent_set_name(sysent, tagname); mask = oval_parser_boolean_attribute(reader, "mask", 0); oval_sysent_set_mask(sysent, mask); datatype = oval_datatype_parse(reader, "datatype", OVAL_DATATYPE_STRING); oval_sysent_set_datatype(sysent, datatype); status = oval_syschar_status_parse(reader, "status", SYSCHAR_STATUS_EXISTS); oval_sysent_set_status(sysent, status); if (datatype == OVAL_DATATYPE_RECORD) ret = oval_parser_parse_tag(reader, context, &_oval_sysent_parse_record_field, sysent); else ret = oval_parser_text_value(reader, context, &oval_sysent_value_consumer_, sysent); if (ret == 0) (*consumer) (sysent, user); return ret; }
int oval_record_field_parse_tag(xmlTextReaderPtr reader, struct oval_parser_context *context, oscap_consumer_func consumer, void *user, oval_record_field_type_t record_field_type) { int ret = 0, mask; char *name; oval_datatype_t datatype; struct oval_record_field *rf; rf = oval_record_field_new(record_field_type); if (rf == NULL) return -1; name = (char *) xmlTextReaderGetAttribute(reader, BAD_CAST "name"); datatype = oval_datatype_parse(reader, "datatype", OVAL_DATATYPE_STRING); mask = oval_parser_boolean_attribute(reader, "mask", 0); oval_record_field_set_name(rf, name); xmlFree(name); oval_record_field_set_datatype(rf, datatype); oval_record_field_set_mask(rf, mask); switch (record_field_type) { case OVAL_RECORD_FIELD_STATE: { oval_operation_t opr; oval_check_t var_check; oval_check_t ent_check; char *var_ref; opr = oval_operation_parse(reader, "operation", OVAL_OPERATION_EQUALS); oval_record_field_set_operation(rf, opr); var_check = oval_check_parse(reader, "var_check", OVAL_CHECK_ALL); oval_record_field_set_var_check(rf, var_check); ent_check = oval_check_parse(reader, "entity_check", OVAL_CHECK_ALL); oval_record_field_set_ent_check(rf, ent_check); var_ref = (char *) xmlTextReaderGetAttribute(reader, BAD_CAST "var_ref"); if (var_ref == NULL) { ret = oscap_parser_text_value(reader, &_oval_record_field_value_consumer, rf); } else { struct oval_definition_model *model; struct oval_variable *var; model = context->definition_model; var = oval_definition_model_get_new_variable(model, var_ref, OVAL_VARIABLE_UNKNOWN); oval_record_field_set_variable(rf, var); xmlFree(var_ref); } break; } case OVAL_RECORD_FIELD_ITEM: { oval_syschar_status_t status; status = oval_syschar_status_parse(reader, "status", SYSCHAR_STATUS_EXISTS); oval_record_field_set_status(rf, status); ret = oscap_parser_text_value(reader, &_oval_record_field_value_consumer, rf); break; } default: dE("Impossible happened.\n"); } (*consumer) (rf, user); return ret; }