summaryrefslogtreecommitdiffstats
path: root/worker/xml_helper.c
diff options
context:
space:
mode:
Diffstat (limited to 'worker/xml_helper.c')
-rw-r--r--worker/xml_helper.c65
1 files changed, 37 insertions, 28 deletions
diff --git a/worker/xml_helper.c b/worker/xml_helper.c
index 8eff726..c4c80e8 100644
--- a/worker/xml_helper.c
+++ b/worker/xml_helper.c
@@ -44,68 +44,77 @@ xmlChar *default_namespace_prefix = (xmlChar *) "def";
*/
int validate_policy(const char *policy_file_name, char **ipa_policy_type, char **xslt_file_name) {
- xmlDocPtr doc;
- char *rng_file_name;
- xmlRelaxNGParserCtxtPtr rng_parser_context;
- xmlRelaxNGPtr rng_schema;
- xmlRelaxNGValidCtxtPtr rng_context;
+ xmlDocPtr doc=NULL;
+ char *rng_file_name=NULL;
+ xmlRelaxNGParserCtxtPtr rng_parser_context=NULL;
+ xmlRelaxNGPtr rng_schema=NULL;
+ xmlRelaxNGValidCtxtPtr rng_context=NULL;
xmlChar xpath_expr[XMLCHARLEN];
doc = xmlParseFile(policy_file_name);
- CHECK(doc, NULL, ("Cannot parse document %s!\n", policy_file_name), exit(1));
-
- xmlStrPrintf(xpath_expr, XMLCHARLEN, (xmlChar *) "//%s:ipa/*[2]",
- default_namespace_prefix);
- *ipa_policy_type = find_by_xpath(doc, xpath_expr, FIND_NAME);
- CHECK(*ipa_policy_type, NULL, ("Type of IPA policy not found.\n"), exit(1));
- DEBUG(3, ("Found IPA policy type: %s\n", *ipa_policy_type));
- if ( strncmp(*ipa_policy_type, "ipaconfig",9) != 0 &&
- strncmp(*ipa_policy_type, "iparole",7) != 0 &&
- strncmp(*ipa_policy_type, "ipaaction",9) != 0) {
- DEBUG(0,("unknown IPA ploicy type\n"));
- exit(1);
- }
+ CHECK(doc, NULL, ("Cannot parse document %s!\n", policy_file_name), return -1);
xmlStrPrintf(xpath_expr, XMLCHARLEN, (xmlChar *) "//%s:RNGfile",
default_namespace_prefix);
rng_file_name =
find_by_xpath(doc, xpath_expr, FIND_VALUE);
- CHECK(rng_file_name, NULL, ("Name of RELANX NG schema file not found.\n"), exit(1));
+ CHECK(rng_file_name, NULL, ("Name of RELANX NG schema file not found.\n"), goto failed);
DEBUG(3, ("Found name of RELAX NG schema file: %s\n", rng_file_name));
/* validate the document */
rng_parser_context = xmlRelaxNGNewParserCtxt(rng_file_name);
- CHECK(rng_parser_context, NULL, ("Failed to parse RNG file\n"), exit(1));
+ CHECK(rng_parser_context, NULL, ("Failed to parse RNG file\n"), goto failed);
rng_schema = xmlRelaxNGParse(rng_parser_context);
- CHECK(rng_schema, NULL, ("Failed to create RNG schema\n"), exit(1));
+ CHECK(rng_schema, NULL, ("Failed to create RNG schema\n"), goto failed);
rng_context = xmlRelaxNGNewValidCtxt(rng_schema);
- CHECK(rng_context, NULL, ("Failed to create RNG context\n"), exit(1));
+ CHECK(rng_context, NULL, ("Failed to create RNG context\n"), goto failed);
if (xmlRelaxNGValidateDoc(rng_context, doc) == 0) {
DEBUG(3, ("The document is valid.\n"));
} else {
DEBUG(0, ("Error during validation.\n"));
- exit(1);
+ goto failed;
}
- xmlRelaxNGFreeValidCtxt(rng_context);
- xmlRelaxNGFree(rng_schema);
- xmlRelaxNGFreeParserCtxt(rng_parser_context);
- free(rng_file_name);
+ xmlStrPrintf(xpath_expr, XMLCHARLEN, (xmlChar *) "//%s:ipa/*[2]",
+ default_namespace_prefix);
+ *ipa_policy_type = find_by_xpath(doc, xpath_expr, FIND_NAME);
+ CHECK(*ipa_policy_type, NULL, ("Type of IPA policy not found.\n"), goto failed);
+ DEBUG(3, ("Found IPA policy type: %s\n", *ipa_policy_type));
+ if ( strncmp(*ipa_policy_type, "ipaconfig",9) != 0 &&
+ strncmp(*ipa_policy_type, "iparole",7) != 0 &&
+ strncmp(*ipa_policy_type, "ipaaction",9) != 0) {
+ DEBUG(0,("unknown IPA ploicy type\n"));
+ exit(1);
+ }
if (strncmp(*ipa_policy_type, "ipaaction", 9)!=0) {
xmlStrPrintf(xpath_expr, XMLCHARLEN, (xmlChar *) "//%s:XSLTfile", default_namespace_prefix);
*xslt_file_name =
find_by_xpath(doc, xpath_expr, FIND_VALUE);
- CHECK(*xslt_file_name, NULL, ("Name of XSLT file not found.\n"), exit(1));
+ CHECK(*xslt_file_name, NULL, ("Name of XSLT file not found.\n"), goto failed);
DEBUG(3, ("Found name of XSLT file: %s\n", *xslt_file_name));
}
+ xmlRelaxNGFreeValidCtxt(rng_context);
+ xmlRelaxNGFree(rng_schema);
+ xmlRelaxNGFreeParserCtxt(rng_parser_context);
+ free(rng_file_name);
+
xmlFreeDoc(doc);
xmlCleanupParser();
return 0;
+failed:
+ xmlRelaxNGFreeValidCtxt(rng_context);
+ xmlRelaxNGFree(rng_schema);
+ xmlRelaxNGFreeParserCtxt(rng_parser_context);
+ free(rng_file_name);
+
+ xmlFreeDoc(doc);
+ xmlCleanupParser();
+ return -1;
}
/**