static struct oval_variable *oval_probe_variable_objgetvar(struct oval_object *obj) { struct oval_entity *ent; struct oval_object_content *con; struct oval_object_content_iterator *cit; struct oval_variable *var; char *ent_name; var = NULL; cit = oval_object_get_object_contents(obj); while (oval_object_content_iterator_has_more(cit)) { con = oval_object_content_iterator_next(cit); if (oval_object_content_get_type(con) != OVAL_OBJECTCONTENT_ENTITY) continue; ent = oval_object_content_get_entity(con); ent_name = oval_entity_get_name(ent); if (strcmp(ent_name, "var_ref") != 0) continue; var = oval_entity_get_variable(ent); break; } oval_object_content_iterator_free(cit); return(var); }
static struct oval_value *oval_object_getentval(struct oval_object *obj, const char *name) { struct oval_value *val; struct oval_entity *ent; struct oval_object_content *con; struct oval_object_content_iterator *cit; char *ent_name; cit = oval_object_get_object_contents(obj); val = NULL; while (oval_object_content_iterator_has_more(cit)) { con = oval_object_content_iterator_next(cit); if (oval_object_content_get_type(con) != OVAL_OBJECTCONTENT_ENTITY) continue; ent = oval_object_content_get_entity(con); ent_name = oval_entity_get_name(ent); if (strcmp(ent_name, name) != 0) continue; val = oval_entity_get_value(ent); break; } oval_object_content_iterator_free(cit); return(val); }
void oval_definition_model_optimize_by_filter_propagation(struct oval_definition_model *model) { struct oval_object_iterator *obj_itr; struct oval_string_map *processed_obj_map; processed_obj_map = oval_string_map_new(); obj_itr = oval_definition_model_get_objects(model); while (oval_object_iterator_has_more(obj_itr)) { struct oval_object *obj; char *obj_id; struct oval_object_content_iterator *cont_itr; struct oval_object_content *cont; struct oval_setobject *set; struct oval_filter_iterator *filter_itr; obj = oval_object_iterator_next(obj_itr); obj_id = oval_object_get_id(obj); if (oval_string_map_get_value(processed_obj_map, obj_id) != NULL) continue; oval_string_map_put(processed_obj_map, obj_id, obj); cont_itr = oval_object_get_object_contents(obj); if (!oval_object_content_iterator_has_more(cont_itr)) { oval_object_content_iterator_free(cont_itr); continue; } cont = oval_object_content_iterator_next(cont_itr); oval_object_content_iterator_free(cont_itr); if (oval_object_content_get_type(cont) != OVAL_OBJECTCONTENT_SET) continue; set = oval_object_content_get_setobject(cont); if (oval_setobject_get_type(set) == OVAL_SET_AGGREGATE) { _fp_set_recurse(model, set, obj_id); continue; } filter_itr = oval_setobject_get_filters(set); if (!oval_filter_iterator_has_more(filter_itr)) { oval_filter_iterator_free(filter_itr); continue; } oval_filter_iterator_free(filter_itr); oval_set_propagate_filters(model, set, obj_id); } oval_object_iterator_free(obj_itr); oval_string_map_free(processed_obj_map, NULL); }
int oval_object_to_sexp(void *sess, const char *typestr, struct oval_syschar *syschar, SEXP_t **out_sexp) { unsigned int ent_cnt, varref_cnt; int ret; SEXP_t *obj_sexp, *elm, *varrefs, *ent_lst, *lst, *stmp; SEXP_t *r0, *r1, *r2, *obj_attr, sm0, sm1; struct oval_object *object; struct oval_object_content_iterator *cit; struct oval_behavior_iterator *bit; struct oval_object_content *content; struct oval_entity *entity; char obj_name[128]; const char *obj_id; object = oval_syschar_get_object(syschar); /* * Object name & attributes (id) */ ret = snprintf(obj_name, sizeof obj_name, "%s_object", typestr); if (ret<0 || (unsigned int) ret > sizeof obj_name) { dE("obj_name length too short"); return -1; } // even though it returns const char* it has to be freed :-( char *obj_over = (char*)oval_schema_version_to_cstr(oval_object_get_platform_schema_version(object)); obj_id = oval_object_get_id(object); obj_attr = probe_attr_creat("id", SEXP_string_new_r(&sm0, obj_id, strlen(obj_id)), "oval_version", SEXP_string_new_r(&sm1, obj_over, strlen(obj_over)), NULL); free(obj_over); obj_sexp = probe_obj_new(obj_name, obj_attr); SEXP_free_r(&sm0); SEXP_free_r(&sm1); SEXP_free(obj_attr); /* * Object content */ ent_lst = SEXP_list_new(NULL); varrefs = NULL; ent_cnt = varref_cnt = 0; cit = oval_object_get_object_contents(object); while (oval_object_content_iterator_has_more(cit)) { oval_check_t ochk; oval_entity_varref_type_t vr_type; content = oval_object_content_iterator_next(cit); elm = NULL; lst = ent_lst; switch (oval_object_content_get_type(content)) { case OVAL_OBJECTCONTENT_ENTITY: entity = oval_object_content_get_entity(content); elm = oval_entity_to_sexp(entity); if (elm == NULL) break; ochk = oval_object_content_get_varCheck(content); if (ochk != OVAL_CHECK_UNKNOWN) { probe_ent_attr_add(elm, "var_check", r0 = SEXP_number_newu_32(ochk)); SEXP_free(r0); } ret = 0; vr_type = oval_entity_get_varref_type(entity); if (vr_type == OVAL_ENTITY_VARREF_ATTRIBUTE) { const char *var_id = oval_variable_get_id(oval_entity_get_variable(entity)); const char *field_name = oval_object_content_get_field_name(content); dI("Object '%s' references variable '%s' in '%s' field.", obj_id, var_id, field_name); ret = oval_varref_attr_to_sexp(sess, entity, syschar, &stmp); if (ret == 0) { if (varrefs == NULL) varrefs = SEXP_list_new(NULL); SEXP_list_add(varrefs, stmp); SEXP_free(stmp); // todo: don't add duplicates ++varref_cnt; lst = obj_sexp; ++ent_cnt; } } else if (vr_type == OVAL_ENTITY_VARREF_ELEMENT) { SEXP_t *val_lst; struct oval_variable *var; oval_datatype_t dt; var = oval_entity_get_variable(entity); dt = oval_entity_get_datatype(entity); ret = oval_varref_elm_to_sexp(sess, var, dt, &val_lst, syschar); if (ret == 0) { SEXP_list_add(elm, val_lst); SEXP_free(val_lst); } } if (ret != 0) { SEXP_t s_flag; SEXP_number_newi_32_r(&s_flag, SYSCHAR_FLAG_DOES_NOT_EXIST); probe_item_attr_add(obj_sexp, "skip_eval", &s_flag); SEXP_free_r(&s_flag); SEXP_free(elm); SEXP_free(ent_lst); if (varrefs != NULL) SEXP_free(varrefs); oval_object_content_iterator_free(cit); *out_sexp = obj_sexp; return (0); } break; case OVAL_OBJECTCONTENT_SET: elm = oval_set_to_sexp(oval_object_content_get_setobject(content)); break; case OVAL_OBJECTCONTENT_FILTER: { struct oval_filter *filter = oval_object_content_get_filter(content); struct oval_state *ste = oval_filter_get_state(filter); const char *ste_id = oval_state_get_id(ste); oval_filter_action_t action = oval_filter_get_filter_action(filter); const char *action_text = oval_filter_action_get_text(action); dI("Object '%s' has a filter that %ss items conforming to state '%s'.", obj_id, action_text, ste_id); elm = oval_filter_to_sexp(filter); } break; case OVAL_OBJECTCONTENT_UNKNOWN: break; } if (elm == NULL) { SEXP_free(obj_sexp); SEXP_free(ent_lst); if (varrefs != NULL) SEXP_free(varrefs); oval_object_content_iterator_free(cit); return -1; } SEXP_list_add(lst, elm); SEXP_free(elm); } if (varrefs != NULL) { // todo: SEXP_list_push() stmp = SEXP_list_new(r0 = SEXP_string_new("varrefs", 7), r1 = SEXP_number_newu(varref_cnt), r2 = SEXP_number_newu(ent_cnt), NULL); SEXP_vfree(r0, r1, r2, NULL); r0 = SEXP_list_join(stmp, varrefs); SEXP_list_add(obj_sexp, r0); SEXP_vfree(stmp, varrefs, r0, NULL); } stmp = SEXP_list_join(obj_sexp, ent_lst); SEXP_free(obj_sexp); SEXP_free(ent_lst); obj_sexp = stmp; oval_object_content_iterator_free(cit); /* * Object behaviors */ bit = oval_object_get_behaviors(object); if (oval_behavior_iterator_has_more(bit)) { elm = oval_behaviors_to_sexp(bit); SEXP_list_add(obj_sexp, elm); SEXP_free(elm); } oval_behavior_iterator_free(bit); *out_sexp = obj_sexp; return (0); }