|
Packit |
517ee8 |
/**
|
|
Packit |
517ee8 |
* @file oval_resultSystem.c
|
|
Packit |
517ee8 |
* \brief Open Vulnerability and Assessment Language
|
|
Packit |
517ee8 |
*
|
|
Packit |
517ee8 |
* See more details at http://oval.mitre.org/
|
|
Packit |
517ee8 |
*/
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
/*
|
|
Packit |
517ee8 |
* Copyright 2009--2013 Red Hat Inc., Durham, North Carolina.
|
|
Packit |
517ee8 |
* All Rights Reserved.
|
|
Packit |
517ee8 |
*
|
|
Packit |
517ee8 |
* This library is free software; you can redistribute it and/or
|
|
Packit |
517ee8 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
517ee8 |
* License as published by the Free Software Foundation; either
|
|
Packit |
517ee8 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
517ee8 |
*
|
|
Packit |
517ee8 |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
517ee8 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
517ee8 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
517ee8 |
* Lesser General Public License for more details.
|
|
Packit |
517ee8 |
*
|
|
Packit |
517ee8 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
517ee8 |
* License along with this library; if not, write to the Free Software
|
|
Packit |
517ee8 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit |
517ee8 |
*
|
|
Packit |
517ee8 |
* Authors:
|
|
Packit |
517ee8 |
* "David Niemoller" <David.Niemoller@g2-inc.com>
|
|
Packit |
517ee8 |
* Šimon Lukašík
|
|
Packit |
517ee8 |
*/
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
517ee8 |
#include <config.h>
|
|
Packit |
517ee8 |
#endif
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
#include <stdlib.h>
|
|
Packit |
517ee8 |
#include <stdio.h>
|
|
Packit |
517ee8 |
#include <string.h>
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
#include "oval_agent_api_impl.h"
|
|
Packit |
517ee8 |
#include "results/oval_results_impl.h"
|
|
Packit |
517ee8 |
#include "adt/oval_collection_impl.h"
|
|
Packit |
517ee8 |
#include "public/oval_agent_api.h"
|
|
Packit |
517ee8 |
#include "common/util.h"
|
|
Packit |
517ee8 |
#include "common/debug_priv.h"
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
typedef struct oval_result_definition {
|
|
Packit |
517ee8 |
struct oval_definition *definition;
|
|
Packit |
517ee8 |
oval_result_t result;
|
|
Packit |
517ee8 |
struct oval_result_system *system;
|
|
Packit |
517ee8 |
struct oval_result_criteria_node *criteria;
|
|
Packit |
517ee8 |
struct oval_collection *messages;
|
|
Packit |
517ee8 |
int instance;
|
|
Packit |
517ee8 |
int variable_instance_hint; ///< A next possible variable_instance attribute
|
|
Packit |
517ee8 |
} oval_result_definition_t;
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
struct oval_result_definition *oval_result_definition_new(struct oval_result_system *sys, char *definition_id) {
|
|
Packit |
517ee8 |
oval_result_definition_t *definition = (oval_result_definition_t *)
|
|
Packit |
517ee8 |
malloc(sizeof(oval_result_definition_t));
|
|
Packit |
517ee8 |
if (definition == NULL)
|
|
Packit |
517ee8 |
return NULL;
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
definition->system = sys;
|
|
Packit |
517ee8 |
struct oval_syschar_model *syschar_model = oval_result_system_get_syschar_model(sys);
|
|
Packit |
517ee8 |
struct oval_definition_model *definition_model = oval_syschar_model_get_definition_model(syschar_model);
|
|
Packit |
517ee8 |
definition->definition = oval_definition_model_get_new_definition(definition_model, definition_id);
|
|
Packit |
517ee8 |
definition->result = OVAL_RESULT_NOT_EVALUATED;
|
|
Packit |
517ee8 |
definition->criteria = NULL;
|
|
Packit |
517ee8 |
definition->messages = oval_collection_new();
|
|
Packit |
517ee8 |
definition->variable_instance_hint = 1;
|
|
Packit |
517ee8 |
definition->instance = 1;
|
|
Packit |
517ee8 |
return definition;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
struct oval_result_definition *oval_result_definition_clone
|
|
Packit |
517ee8 |
(struct oval_result_system *new_system, struct oval_result_definition *old_definition) {
|
|
Packit |
517ee8 |
const char *id = oval_result_definition_get_id(old_definition);
|
|
Packit |
517ee8 |
struct oval_result_definition *new_definition = oval_result_definition_new(new_system, (char *) id);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
struct oval_result_criteria_node *old_crit = oval_result_definition_get_criteria(old_definition);
|
|
Packit |
517ee8 |
if (old_crit) {
|
|
Packit |
517ee8 |
struct oval_result_criteria_node *new_crit = oval_result_criteria_node_clone(new_system, old_crit);
|
|
Packit |
517ee8 |
oval_result_definition_set_criteria(new_definition, new_crit);
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
struct oval_message_iterator *old_messages = oval_result_definition_get_messages(old_definition);
|
|
Packit |
517ee8 |
while (oval_message_iterator_has_more(old_messages)) {
|
|
Packit |
517ee8 |
struct oval_message *old_message = oval_message_iterator_next(old_messages);
|
|
Packit |
517ee8 |
struct oval_message *new_message = oval_message_clone(old_message);
|
|
Packit |
517ee8 |
oval_result_definition_add_message(new_definition, new_message);
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
oval_message_iterator_free(old_messages);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
oval_result_definition_set_result(new_definition, oval_result_definition_get_result(old_definition));
|
|
Packit |
517ee8 |
oval_result_definition_set_instance(new_definition, oval_result_definition_get_instance(old_definition));
|
|
Packit |
517ee8 |
oval_result_definition_set_variable_instance_hint(new_definition, oval_result_definition_get_variable_instance_hint(old_definition));
|
|
Packit |
517ee8 |
return new_definition;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
void oval_result_definition_free(struct oval_result_definition *definition)
|
|
Packit |
517ee8 |
{
|
|
Packit |
517ee8 |
__attribute__nonnull__(definition);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
if (definition->criteria)
|
|
Packit |
517ee8 |
oval_result_criteria_node_free(definition->criteria);
|
|
Packit |
517ee8 |
oval_collection_free_items(definition->messages, (oscap_destruct_func) oval_message_free);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
definition->system = NULL;
|
|
Packit |
517ee8 |
definition->criteria = NULL;
|
|
Packit |
517ee8 |
definition->definition = NULL;
|
|
Packit |
517ee8 |
definition->messages = NULL;
|
|
Packit |
517ee8 |
definition->result = OVAL_RESULT_NOT_EVALUATED;
|
|
Packit |
517ee8 |
definition->instance = 1;
|
|
Packit |
517ee8 |
free(definition);
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit Service |
deda86 |
struct oval_result_definition *make_result_definition_from_oval_definition(struct oval_result_system *sys, struct oval_definition *oval_definition, struct oscap_list *visited_definitions, int variable_instance)
|
|
Packit Service |
deda86 |
{
|
|
Packit |
517ee8 |
char *defid = oval_definition_get_id(oval_definition);
|
|
Packit Service |
deda86 |
if (visited_definitions != NULL) {
|
|
Packit Service |
deda86 |
if (oscap_list_contains(visited_definitions, defid, (oscap_cmp_func) oscap_streq)) {
|
|
Packit Service |
deda86 |
dE("Circular dependency in OVAL definition '%s'.", defid);
|
|
Packit Service |
deda86 |
return NULL;
|
|
Packit Service |
deda86 |
}
|
|
Packit Service |
deda86 |
oscap_list_add(visited_definitions, strdup(defid));
|
|
Packit Service |
deda86 |
}
|
|
Packit |
517ee8 |
struct oval_result_definition *rslt_definition = oval_result_definition_new(sys, defid);
|
|
Packit |
517ee8 |
oval_result_definition_set_instance(rslt_definition, variable_instance);
|
|
Packit |
517ee8 |
struct oval_criteria_node *oval_criteria = oval_definition_get_criteria(oval_definition);
|
|
Packit |
517ee8 |
struct oval_result_criteria_node *rslt_criteria =
|
|
Packit Service |
deda86 |
make_result_criteria_node_from_oval_criteria_node(sys, oval_criteria, visited_definitions, variable_instance);
|
|
Packit |
517ee8 |
if (rslt_criteria)
|
|
Packit |
517ee8 |
oval_result_definition_set_criteria(rslt_definition, rslt_criteria);
|
|
Packit |
517ee8 |
return rslt_definition;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
struct oval_definition *oval_result_definition_get_definition(const struct oval_result_definition *definition) {
|
|
Packit |
517ee8 |
__attribute__nonnull__(definition);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
return definition->definition;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
struct oval_result_system *oval_result_definition_get_system(const struct oval_result_definition *definition) {
|
|
Packit |
517ee8 |
__attribute__nonnull__(definition);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
return definition->system;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
int oval_result_definition_get_instance(const struct oval_result_definition *definition) {
|
|
Packit |
517ee8 |
__attribute__nonnull__(definition);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
return definition->instance;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
oval_result_t oval_result_definition_eval(struct oval_result_definition * definition)
|
|
Packit |
517ee8 |
{
|
|
Packit |
517ee8 |
__attribute__nonnull__(definition);
|
|
Packit |
517ee8 |
const char *id = oval_result_definition_get_id(definition);
|
|
Packit |
517ee8 |
const char *title = oval_definition_get_title(oval_result_definition_get_definition(definition));
|
|
Packit |
517ee8 |
dI("Evaluating definition '%s': %s.", id, title);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
if (definition->result == OVAL_RESULT_NOT_EVALUATED) {
|
|
Packit |
517ee8 |
struct oval_result_criteria_node *criteria = oval_result_definition_get_criteria(definition);
|
|
Packit |
517ee8 |
if (criteria != NULL) {
|
|
Packit |
517ee8 |
dIndent(1);
|
|
Packit |
517ee8 |
definition->result = oval_result_criteria_node_eval(criteria);
|
|
Packit |
517ee8 |
dIndent(-1);
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
dI("Definition '%s' evaluated as %s.", id, oval_result_get_text(definition->result));
|
|
Packit |
517ee8 |
return definition->result;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
oval_result_t oval_result_definition_get_result(const struct oval_result_definition * definition)
|
|
Packit |
517ee8 |
{
|
|
Packit |
517ee8 |
__attribute__nonnull__(definition);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
return definition->result;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
struct oval_message_iterator *oval_result_definition_get_messages(const struct oval_result_definition *definition)
|
|
Packit |
517ee8 |
{
|
|
Packit |
517ee8 |
__attribute__nonnull__(definition);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
return (struct oval_message_iterator *)
|
|
Packit |
517ee8 |
oval_collection_iterator(definition->messages);
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
struct oval_result_criteria_node *oval_result_definition_get_criteria(const struct oval_result_definition *definition)
|
|
Packit |
517ee8 |
{
|
|
Packit |
517ee8 |
__attribute__nonnull__(definition);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
return definition->criteria;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
void oval_result_definition_set_result(struct oval_result_definition *definition, oval_result_t result)
|
|
Packit |
517ee8 |
{
|
|
Packit |
517ee8 |
__attribute__nonnull__(definition);
|
|
Packit |
517ee8 |
definition->result = result;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
void oval_result_definition_set_instance(struct oval_result_definition *definition, int instance)
|
|
Packit |
517ee8 |
{
|
|
Packit |
517ee8 |
__attribute__nonnull__(definition);
|
|
Packit |
517ee8 |
definition->instance = instance;
|
|
Packit |
517ee8 |
// When a new variable_instance is set, we usually want to reset the hint
|
|
Packit |
517ee8 |
definition->variable_instance_hint = instance;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
void oval_result_definition_set_criteria(struct oval_result_definition *definition, struct oval_result_criteria_node *criteria)
|
|
Packit |
517ee8 |
{
|
|
Packit |
517ee8 |
__attribute__nonnull__(definition);
|
|
Packit |
517ee8 |
if (definition->criteria) {
|
|
Packit |
517ee8 |
if (oval_result_criteria_node_get_type(criteria) == OVAL_NODETYPE_CRITERIA) {
|
|
Packit |
517ee8 |
oval_result_criteria_node_free(definition->criteria);
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
definition->criteria = criteria;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
void oval_result_definition_add_message(struct oval_result_definition *definition, struct oval_message *message) {
|
|
Packit |
517ee8 |
__attribute__nonnull__(definition);
|
|
Packit |
517ee8 |
if (message)
|
|
Packit |
517ee8 |
oval_collection_add(definition->messages, message);
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
static void _oval_result_definition_consume_criteria(struct oval_result_criteria_node *node, struct oval_result_definition *definition) {
|
|
Packit |
517ee8 |
oval_result_definition_set_criteria(definition, node);
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
static void _oval_result_definition_consume_message(struct oval_message *message, struct oval_result_definition *definition) {
|
|
Packit |
517ee8 |
oval_result_definition_add_message(definition, message);
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
static int oval_result_definition_parse(xmlTextReaderPtr reader, struct oval_parser_context *context, void *usr) {
|
|
Packit |
517ee8 |
int return_code = 0;
|
|
Packit |
517ee8 |
xmlChar *localName = xmlTextReaderLocalName(reader);
|
|
Packit |
517ee8 |
struct oval_result_system *sys = oval_result_definition_get_system((struct oval_result_definition *) usr);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
if (strcmp((const char *)localName, "criteria") == 0) {
|
|
Packit |
517ee8 |
return_code = oval_result_criteria_node_parse
|
|
Packit |
517ee8 |
(reader, context, sys, (oscap_consumer_func) _oval_result_definition_consume_criteria, usr);
|
|
Packit |
517ee8 |
} else if (strcmp((const char *)localName, "message") == 0) {
|
|
Packit |
517ee8 |
return_code = oval_message_parse_tag
|
|
Packit |
517ee8 |
(reader, context, (oscap_consumer_func) _oval_result_definition_consume_message, usr);
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
free(localName);
|
|
Packit |
517ee8 |
return return_code;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
int oval_result_definition_parse_tag(xmlTextReaderPtr reader, struct oval_parser_context *context, void *usr) {
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
struct oval_result_system *sys = (struct oval_result_system *) usr;
|
|
Packit |
517ee8 |
int return_code = 0;
|
|
Packit |
517ee8 |
struct oval_definition_model *dmod;
|
|
Packit |
517ee8 |
struct oval_definition *ddef;
|
|
Packit |
517ee8 |
struct oval_result_definition *definition;
|
|
Packit |
517ee8 |
xmlChar *definition_id = xmlTextReaderGetAttribute(reader, BAD_CAST "definition_id");
|
|
Packit |
517ee8 |
xmlChar *definition_version = xmlTextReaderGetAttribute(reader, BAD_CAST "version");
|
|
Packit |
517ee8 |
int resvsn = atoi((char *)definition_version);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
oval_result_t result = oval_result_parse(reader, "result", OVAL_ENUMERATION_INVALID);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
int instance = oval_parser_int_attribute(reader, "variable_instance", 1);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
dmod = context->definition_model;
|
|
Packit |
517ee8 |
ddef = oval_definition_model_get_new_definition(dmod, (char *) definition_id);
|
|
Packit |
517ee8 |
definition = oval_result_system_get_new_definition(sys, ddef, instance);
|
|
Packit |
517ee8 |
if (definition == NULL)
|
|
Packit |
517ee8 |
return -1;
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
int defvsn = oval_definition_get_version(definition->definition);
|
|
Packit |
517ee8 |
if (defvsn && resvsn != defvsn) {
|
|
Packit |
517ee8 |
dW("Definition versions don't match: definition id: %s, ovaldef vsn: %d, resdef vsn: %d.", definition_id, defvsn, resvsn);
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
oval_definition_set_version(definition->definition, resvsn);
|
|
Packit |
517ee8 |
// The following _set_instance() might be overabundant, since it should be already set
|
|
Packit |
517ee8 |
// by oval_result_system_get_new_definition() Let's see if the assert agrees over time:
|
|
Packit |
517ee8 |
assert(oval_result_definition_get_instance(definition) == instance);
|
|
Packit |
517ee8 |
oval_result_definition_set_instance(definition, instance);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
if ((int)result != OVAL_ENUMERATION_INVALID) {
|
|
Packit |
517ee8 |
oval_result_definition_set_result(definition, result);
|
|
Packit |
517ee8 |
} else {
|
|
Packit |
517ee8 |
dW("Can't resolve result attribute, definition id: %s.", definition_id);
|
|
Packit |
517ee8 |
oval_result_definition_set_result(definition, OVAL_RESULT_UNKNOWN);
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
return_code = oval_parser_parse_tag(reader, context, oval_result_definition_parse, definition);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
free(definition_id);
|
|
Packit |
517ee8 |
free(definition_version);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
return return_code;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
xmlNode *oval_result_definition_to_dom
|
|
Packit |
517ee8 |
(struct oval_result_definition * definition, oval_result_directive_content_t content,
|
|
Packit |
517ee8 |
xmlDocPtr doc, xmlNode * parent) {
|
|
Packit |
517ee8 |
xmlNs *ns_results = xmlSearchNsByHref(doc, parent, OVAL_RESULTS_NAMESPACE);
|
|
Packit |
517ee8 |
xmlNode *definition_node = xmlNewTextChild(parent, ns_results, BAD_CAST "definition", NULL);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
struct oval_definition *oval_definition = oval_result_definition_get_definition(definition);
|
|
Packit |
517ee8 |
char *definition_id = oval_definition_get_id(oval_definition);
|
|
Packit |
517ee8 |
xmlNewProp(definition_node, BAD_CAST "definition_id", BAD_CAST definition_id);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
oval_result_t result = oval_result_definition_get_result(definition);
|
|
Packit |
517ee8 |
const char *result_att = oval_result_get_text(result);
|
|
Packit |
517ee8 |
xmlNewProp(definition_node, BAD_CAST "result", BAD_CAST result_att);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
int version = oval_definition_get_version(oval_definition);
|
|
Packit |
517ee8 |
char version_att[10] = "";
|
|
Packit |
517ee8 |
snprintf(version_att, sizeof(version_att), "%d", version);
|
|
Packit |
517ee8 |
xmlNewProp(definition_node, BAD_CAST "version", BAD_CAST version_att);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
int instance = oval_result_definition_get_instance(definition);
|
|
Packit |
517ee8 |
if (instance != 1 ||
|
|
Packit |
517ee8 |
oval_result_definition_get_variable_instance_hint(definition) != instance) {
|
|
Packit |
517ee8 |
char instance_att[10] = "";
|
|
Packit |
517ee8 |
snprintf(instance_att, sizeof(instance_att), "%d", instance);
|
|
Packit |
517ee8 |
xmlNewProp(definition_node, BAD_CAST "variable_instance", BAD_CAST instance_att);
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
struct oval_message_iterator *messages = oval_result_definition_get_messages(definition);
|
|
Packit |
517ee8 |
while (oval_message_iterator_has_more(messages)) {
|
|
Packit |
517ee8 |
oval_message_to_dom(oval_message_iterator_next(messages), doc, definition_node);
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
oval_message_iterator_free(messages);
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
if (content == OVAL_DIRECTIVE_CONTENT_FULL) {
|
|
Packit |
517ee8 |
struct oval_result_criteria_node *criteria = oval_result_definition_get_criteria(definition);
|
|
Packit |
517ee8 |
if (criteria) {
|
|
Packit |
517ee8 |
oval_result_criteria_node_to_dom(criteria, doc, definition_node);
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
return definition_node;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
/**
|
|
Packit |
517ee8 |
* Get the value of the variable_instance hint.
|
|
Packit |
517ee8 |
* @memberof oval_result_definition
|
|
Packit |
517ee8 |
*/
|
|
Packit |
517ee8 |
int oval_result_definition_get_variable_instance_hint(const struct oval_result_definition *definition)
|
|
Packit |
517ee8 |
{
|
|
Packit |
517ee8 |
return definition->variable_instance_hint;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
/**
|
|
Packit |
517ee8 |
* This sets counter on next possible variable instance. The hint is later used
|
|
Packit |
517ee8 |
* to decide whether instanciate a new result_definition, and what variable_instance
|
|
Packit |
517ee8 |
* attribute assign to it.
|
|
Packit |
517ee8 |
* @memberof oval_result_definition
|
|
Packit |
517ee8 |
*/
|
|
Packit |
517ee8 |
void oval_result_definition_set_variable_instance_hint(struct oval_result_definition *definition, int new_hint_value)
|
|
Packit |
517ee8 |
{
|
|
Packit |
517ee8 |
definition->variable_instance_hint = new_hint_value;
|
|
Packit |
517ee8 |
}
|
|
Packit |
517ee8 |
|
|
Packit |
517ee8 |
const char *oval_result_definition_get_id(const struct oval_result_definition *rslt_definition)
|
|
Packit |
517ee8 |
{
|
|
Packit |
517ee8 |
__attribute__nonnull__(rslt_definition);
|
|
Packit |
517ee8 |
struct oval_definition *def = oval_result_definition_get_definition(rslt_definition);
|
|
Packit |
517ee8 |
return (def == NULL) ? NULL : oval_definition_get_id(def);
|
|
Packit |
517ee8 |
}
|