diff options
Diffstat (limited to 'worker/worker.c')
-rw-r--r-- | worker/worker.c | 193 |
1 files changed, 85 insertions, 108 deletions
diff --git a/worker/worker.c b/worker/worker.c index 23c3de3..d7b24b5 100644 --- a/worker/worker.c +++ b/worker/worker.c @@ -14,6 +14,8 @@ #include <libxslt/transform.h> #include <libxslt/xsltutils.h> +#include "util.h" + #define XMLCHARLEN 255 /* If a default namespace is defined * @@ -26,60 +28,57 @@ */ xmlChar *default_namespace_prefix = (xmlChar *) "def"; -char *find_value_by_xpath(xmlDocPtr doc, xmlChar * xpathExpr, +char *find_value_by_xpath(xmlDocPtr doc, xmlChar * xpath_expr, xmlChar * prefix, xmlChar * namespace) { - xmlXPathContextPtr xpathCtx; - xmlXPathObjectPtr xpathObj; + xmlXPathContextPtr xpath_context; + xmlXPathObjectPtr xpath_obj; char *result = NULL; /* Create xpath evaluation context */ - xpathCtx = xmlXPathNewContext(doc); - if (xpathCtx == NULL) { - fprintf(stderr, "Error: unable to create new XPath context\n"); - return (NULL); - } + xpath_context = xmlXPathNewContext(doc); + CHECK_NULL_FATAL(xpath_context, ("Error: unable to create new XPath context\n")) /* Register a namespace */ - if (xmlXPathRegisterNs(xpathCtx, prefix, namespace) != 0) { - fprintf(stderr, - "Error: unable to register NS with prefix=\"%s\" and href=\"%s\"\n", - "my", namespace); - xmlXPathFreeContext(xpathCtx); + if (xmlXPathRegisterNs(xpath_context, prefix, namespace) != 0) { + DEBUG(0, + ("Error: unable to register NS with prefix=\"%s\" and href=\"%s\"\n", + "my", namespace)); + xmlXPathFreeContext(xpath_context); return (NULL); } /* Evaluate xpath expression */ - xpathObj = xmlXPathEvalExpression(xpathExpr, xpathCtx); - if (xpathObj == NULL) { - fprintf(stderr, - "Error: unable to evaluate xpath expression \"%s\"\n", - xpathExpr); - xmlXPathFreeContext(xpathCtx); + xpath_obj = xmlXPathEvalExpression(xpath_expr, xpath_context); + if (xpath_obj == NULL) { + DEBUG(0, + ("Error: unable to evaluate xpath expression \"%s\"\n", + xpath_expr)); + xmlXPathFreeContext(xpath_context); return (NULL); } - if (xmlXPathNodeSetIsEmpty(xpathObj->nodesetval)) { - printf("Nothing found ...\n"); - xmlXPathFreeObject(xpathObj); - xmlXPathFreeContext(xpathCtx); + if (xmlXPathNodeSetIsEmpty(xpath_obj->nodesetval)) { + DEBUG(0, ("Nothing found for %s\n", xpath_expr)); + xmlXPathFreeObject(xpath_obj); + xmlXPathFreeContext(xpath_context); return (NULL); - } else if (xmlXPathNodeSetGetLength(xpathObj->nodesetval) != 1) { - fprintf(stderr, "More than one node found!"); - xmlXPathFreeObject(xpathObj); - xmlXPathFreeContext(xpathCtx); + } else if (xmlXPathNodeSetGetLength(xpath_obj->nodesetval) != 1) { + DEBUG(0, ("More than one node found for %s!", xpath_expr)); + xmlXPathFreeObject(xpath_obj); + xmlXPathFreeContext(xpath_context); return (NULL); } else { result = (char *) xmlNodeListGetString(doc, - xpathObj->nodesetval-> + xpath_obj->nodesetval-> nodeTab[0]->xmlChildrenNode, 1); } - xmlXPathFreeObject(xpathObj); - xmlXPathFreeContext(xpathCtx); + xmlXPathFreeObject(xpath_obj); + xmlXPathFreeContext(xpath_context); return result; } @@ -88,143 +87,121 @@ int main(int argc, char **argv) { xmlDocPtr doc; - xmlNodePtr rootNode; + xmlNodePtr root_node; xmlChar *default_namespace; - xmlChar xpathExpr[XMLCHARLEN]; - char *rngFileName; - char *xsltFileName; + xmlChar xpath_expr[XMLCHARLEN]; + char *rng_file_name; + char *xslt_file_name; char *output_file_name; char *output_file_owner; char *output_file_group; char *output_file_permission; - xmlRelaxNGValidCtxtPtr rngCtx; - xmlDocPtr xsltDoc; + xmlRelaxNGValidCtxtPtr rng_context; + xmlDocPtr xslt_doc; xsltStylesheetPtr cur = NULL; xmlDocPtr res; int ret; if (argc != 2) { - fprintf(stderr, - "missing or to many arguments, I expect a single filename!\n"); + DEBUG(0, + ("missing or to many arguments, I expect a single filename!\n")); exit(1); } doc = xmlParseFile(argv[1]); - if (doc == NULL) { - fprintf(stderr, "Cannot parse document %s!\n", argv[1]); - exit(1); - } + CHECK_NULL_FATAL(doc, ("Cannot parse document %s!\n", argv[1])) /* find the default namespace */ - rootNode = xmlDocGetRootElement(doc); - if (rootNode == NULL) { - fprintf(stderr, "Cannot find root node of document %s!\n", - argv[1]); - exit(1); - } - if (xmlStrncasecmp(rootNode->name, (xmlChar *) "IPA", XMLCHARLEN) != 0) { - fprintf(stderr, - "Name of root node of document %s has to be 'ipa'!\n", - argv[1]); - exit(1); - } - if (rootNode->ns->href == NULL) { - fprintf(stderr, - "Root node of document %s must define a namespace!\n", - argv[1]); - exit(1); - } - default_namespace = xmlStrndup(rootNode->ns->href, XMLCHARLEN); - if (default_namespace == NULL) { - fprintf(stderr, "Cannot copy namespace!\n"); + root_node = xmlDocGetRootElement(doc); + CHECK_NULL_FATAL(root_node, ("Cannot find root node of document %s!\n", argv[1])) + + if (xmlStrncasecmp(root_node->name, (xmlChar *) "IPA", XMLCHARLEN) != 0) { + DEBUG(0, + ("Name of root node of document %s has to be 'ipa'!\n", + argv[1])); exit(1); } + CHECK_NULL_FATAL(root_node->ns->href, ("Root node of document %s must define a namespace!\n", argv[1])) + + default_namespace = xmlStrndup(root_node->ns->href, XMLCHARLEN); + CHECK_NULL_FATAL(default_namespace, ("Cannot copy namespace!\n")) /* extract XSTLfile and RNGfile from document using XPath */ - xmlStrPrintf(xpathExpr, XMLCHARLEN, (xmlChar *) "//%s:XSLTfile", + xmlStrPrintf(xpath_expr, XMLCHARLEN, (xmlChar *) "//%s:XSLTfile", default_namespace_prefix); - xsltFileName = - find_value_by_xpath(doc, xpathExpr, default_namespace_prefix, + xslt_file_name = + find_value_by_xpath(doc, xpath_expr, default_namespace_prefix, default_namespace); - printf("--%s--\n", xsltFileName); - xmlStrPrintf(xpathExpr, XMLCHARLEN, (xmlChar *) "//%s:RNGfile", + CHECK_NULL_FATAL(rng_file_name, ("Name of XSLT file not found.\n")) + DEBUG(3, ("Found name of XSLT file: %s\n", xslt_file_name)); + + xmlStrPrintf(xpath_expr, XMLCHARLEN, (xmlChar *) "//%s:RNGfile", default_namespace_prefix); - rngFileName = - find_value_by_xpath(doc, xpathExpr, default_namespace_prefix, + rng_file_name = + find_value_by_xpath(doc, xpath_expr, default_namespace_prefix, default_namespace); - printf("--%s--\n", rngFileName); + CHECK_NULL_FATAL(rng_file_name, ("Name of RELANX NG schema file not found.\n")) + DEBUG(3, ("Found name of RELAX NG schema file: %s\n", rng_file_name)); /* validate the document */ - rngCtx = + rng_context = xmlRelaxNGNewValidCtxt(xmlRelaxNGParse - (xmlRelaxNGNewParserCtxt(rngFileName))); - if (rngCtx == NULL) { - fprintf(stderr, "Failed to create RNG context\n"); - exit(-1); - } + (xmlRelaxNGNewParserCtxt(rng_file_name))); + CHECK_NULL_FATAL(rng_context, ("Failed to create RNG context\n")) - if (xmlRelaxNGValidateDoc(rngCtx, doc) == 0) { - printf("The document is valid.\n"); + if (xmlRelaxNGValidateDoc(rng_context, doc) == 0) { + DEBUG(0, ("The document is valid.\n")); } else { - fprintf(stderr, "Error during validation.\n"); + DEBUG(0, ("Error during validation.\n")); } - xmlRelaxNGFreeValidCtxt(rngCtx); - free(rngFileName); + xmlRelaxNGFreeValidCtxt(rng_context); + free(rng_file_name); /* read the xslt file */ - xsltDoc = xmlParseFile(xsltFileName); - if (xsltDoc == NULL) { - fprintf(stderr, "Cannot parse file %s!\n", xsltFileName); - exit(1); - } + xslt_doc = xmlParseFile(xslt_file_name); + CHECK_NULL_FATAL(xslt_doc, ("Cannot parse file %s!\n", xslt_file_name)) output_file_name = - find_value_by_xpath(xsltDoc, (xmlChar *) "//md:output_handler/file/@name", + find_value_by_xpath(xslt_doc, (xmlChar *) "//md:output_handler/md:file/@md:name", (xmlChar *) "md", (xmlChar *) "http://freeipa.org/xsl/metadata/1.0"); output_file_owner = - find_value_by_xpath(xsltDoc, (xmlChar *) "//md:output_handler/file/@owner", + find_value_by_xpath(xslt_doc, (xmlChar *) "//md:output_handler/md:file/@md:owner", (xmlChar *) "md", (xmlChar *) "http://freeipa.org/xsl/metadata/1.0"); output_file_group = - find_value_by_xpath(xsltDoc, (xmlChar *) "//md:output_handler/file/@group", + find_value_by_xpath(xslt_doc, (xmlChar *) "//md:output_handler/md:file/@md:group", (xmlChar *) "md", (xmlChar *) "http://freeipa.org/xsl/metadata/1.0"); output_file_permission = - find_value_by_xpath(xsltDoc, - (xmlChar *) "//md:output_handler/file/@permission", + find_value_by_xpath(xslt_doc, + (xmlChar *) "//md:output_handler/md:file/@md:permission", (xmlChar *) "md", (xmlChar *) "http://freeipa.org/xsl/metadata/1.0"); - printf("-%s-\n", output_file_name); - printf("-%s-\n", output_file_owner); - printf("-%s-\n", output_file_group); - printf("-%s-\n", output_file_permission); - - cur = xsltParseStylesheetDoc(xsltDoc); - if (cur == NULL) { - fprintf(stderr, "Cannot parse stylesheet %s!\n", xsltFileName); - exit(1); - } + DEBUG(0, ("-%s-\n", output_file_name)); + DEBUG(0, ("-%s-\n", output_file_owner)); + DEBUG(0, ("-%s-\n", output_file_group)); + DEBUG(0, ("-%s-\n", output_file_permission)); + + cur = xsltParseStylesheetDoc(xslt_doc); + CHECK_NULL_FATAL(cur, ("Cannot parse stylesheet %s!\n", xslt_file_name)) res = xsltApplyStylesheet(cur, doc, NULL); - if (xsltDoc == NULL) { - fprintf(stderr, "Cannot apply stylesheet %s!\n", xsltFileName); - exit(1); - } + CHECK_NULL_FATAL(xslt_doc, ("Cannot apply stylesheet %s!\n", xslt_file_name)) ret = xsltSaveResultToFile(stdout, res, cur); if (ret == -1) { - fprintf(stderr, "Cannot save result!\n"); + DEBUG(0, ("Cannot save result!\n")); exit(1); } xmlFreeDoc(res); xsltFreeStylesheet(cur); - free(xsltFileName); + free(xslt_file_name); xmlFreeDoc(doc); |