summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSumit Bose <sbose@nb.localdomain>2008-12-15 10:13:52 +0100
committerSumit Bose <sbose@nb.localdomain>2008-12-15 10:13:52 +0100
commit11771dace7d8340601b6ec9bb2a38e26b94e8a4b (patch)
treeec0254a697f0edc3f8b107b57a6d805773dd638d
parentf8925be13096eb1932dfb78a32492699a15ad631 (diff)
downloadipa_policy-11771dace7d8340601b6ec9bb2a38e26b94e8a4b.tar.gz
ipa_policy-11771dace7d8340601b6ec9bb2a38e26b94e8a4b.tar.xz
ipa_policy-11771dace7d8340601b6ec9bb2a38e26b94e8a4b.zip
added xml search path
-rw-r--r--worker/worker.c8
-rw-r--r--worker/xml_helper.c113
-rw-r--r--worker/xml_helper.h5
3 files changed, 126 insertions, 0 deletions
diff --git a/worker/worker.c b/worker/worker.c
index d30f7c0..9a95343 100644
--- a/worker/worker.c
+++ b/worker/worker.c
@@ -55,6 +55,12 @@ int main(int argc, char **argv)
policy_file_name=strdup(argv[1]);
+ setup_xml_search_path("wqwdwqdqwd/");
+ setup_xml_search_path("qwqwWQ/");
+
+ setup_xml_search_path("../policy_metadata/");
+ print_xml_search_path();
+
ret=validate_policy(policy_file_name, &ipa_policy_type, &xslt_file_name);
if ( ret == -1 ) {
DEBUG(0,("Invalid policy, aborting.\n"));
@@ -74,6 +80,8 @@ int main(int argc, char **argv)
free(xslt_file_name);
}
+ free_xml_search_path();
+
free(ipa_policy_type);
free(policy_file_name);
xmlCleanupParser();
diff --git a/worker/xml_helper.c b/worker/xml_helper.c
index c4c80e8..7850e80 100644
--- a/worker/xml_helper.c
+++ b/worker/xml_helper.c
@@ -1,4 +1,5 @@
#include <string.h>
+#include <limits.h>
#include <libxml/tree.h>
#include <libxml/parser.h>
@@ -235,3 +236,115 @@ failed:
xmlXPathFreeContext(xpath_context);
return NULL;
}
+
+struct search_list {
+ char *path;
+ struct search_list *next;
+};
+static struct search_list *search_list_head = NULL;
+static xmlExternalEntityLoader default_entity_loader = NULL;
+
+xmlParserInputPtr xml_external_entity_loader(const char *url, const char *id,
+ xmlParserCtxtPtr ctxt) {
+
+ const char *filename;
+ char new_path[PATH_MAX];
+ xmlParserInputPtr input_ptr;
+ warningSAXFunc saved_warning = NULL;
+ errorSAXFunc saved_error = NULL;
+
+
+ CHECK(default_entity_loader, NULL,
+ ("No default entity loader, have you called setup_xml_search_path?\n"),
+ return NULL);
+
+ filename=strrchr(url, '/');
+ if (filename == NULL) filename=url;
+ DEBUG(3,("looking for file %s.\n", filename));
+
+ if (ctxt != NULL && ctxt->sax != NULL) {
+ saved_warning = ctxt->sax->warning;
+ ctxt->sax->warning = NULL;
+ saved_error = ctxt->sax->error;
+ ctxt->sax->error = NULL;
+ }
+
+ input_ptr=default_entity_loader(url, id, ctxt);
+ if (input_ptr != NULL) {
+ DEBUG(3, ("found: %s %s\n",url, id));
+ if (saved_warning != NULL) ctxt->sax->warning = saved_warning;
+ if (saved_error != NULL) ctxt->sax->error = saved_error;
+ return input_ptr;
+ }
+
+ new_path[0]='\0';
+ strncat(new_path, "../policy_metadata/", PATH_MAX-1);
+ strncat(new_path, filename, PATH_MAX-strlen(new_path)-1);
+
+ input_ptr=default_entity_loader(new_path, id, ctxt);
+ if (input_ptr != NULL) {
+ DEBUG(3, ("found: %s %s\n",new_path, id));
+ if (saved_warning != NULL) ctxt->sax->warning = saved_warning;
+ if (saved_error != NULL) ctxt->sax->error = saved_error;
+ return input_ptr;
+ }
+
+ DEBUG(0, ("entity NOT found: %s %s\n",new_path, id));
+ if (saved_warning != NULL) ctxt->sax->warning = saved_warning;
+ if (saved_error != NULL) ctxt->sax->error = saved_error;
+ return NULL;
+
+}
+
+int setup_xml_search_path(char *path) {
+ struct search_list *path_ptr;
+
+ if (default_entity_loader==NULL) {
+ default_entity_loader = xmlGetExternalEntityLoader();
+ CHECK(default_entity_loader, NULL,
+ ("Cannot find default entity loader.\n"), return -1);
+
+ xmlSetExternalEntityLoader(xml_external_entity_loader);
+ }
+
+ if (path != NULL ) {
+ path_ptr = search_list_head;
+ while ( path_ptr != NULL ) {
+ path_ptr = path_ptr->next;
+ }
+ path_ptr = malloc(sizeof(struct search_list));
+ path_ptr->path=strdup(path);
+ path_ptr->next=search_list_head;
+
+ search_list_head=path_ptr;
+ }
+
+
+ return 0;
+}
+
+int print_xml_search_path(void) {
+ struct search_list *path_ptr;
+ path_ptr = search_list_head;
+ while ( path_ptr != NULL ) {
+ DEBUG(0,("search path element: %s\n",path_ptr->path));
+ path_ptr = path_ptr->next;
+ }
+
+ return 0;
+}
+
+int free_xml_search_path(void) {
+ struct search_list *path_ptr;
+ struct search_list *next_path_ptr;
+ path_ptr = search_list_head;
+ while ( path_ptr != NULL ) {
+ DEBUG(0,("freeing search path element: %s\n",path_ptr->path));
+ next_path_ptr = path_ptr->next;
+ free(path_ptr->path);
+ free(path_ptr);
+ path_ptr=next_path_ptr;
+ }
+
+ return 0;
+}
diff --git a/worker/xml_helper.h b/worker/xml_helper.h
index 0d6155b..974ab07 100644
--- a/worker/xml_helper.h
+++ b/worker/xml_helper.h
@@ -23,3 +23,8 @@ int validate_policy(const char *policy_file_name, char **ipa_policy_type, char *
int print_all_attributes(const xmlNode *node);
char *find_by_xpath(const xmlDocPtr doc, const xmlChar * xpath_expr, const int type);
+
+int setup_xml_search_path(char *path);
+int print_xml_search_path(void);
+int free_xml_search_path(void);
+