diff options
author | Sumit Bose <sbose@nb.localdomain> | 2008-12-15 10:13:52 +0100 |
---|---|---|
committer | Sumit Bose <sbose@nb.localdomain> | 2008-12-15 10:13:52 +0100 |
commit | 11771dace7d8340601b6ec9bb2a38e26b94e8a4b (patch) | |
tree | ec0254a697f0edc3f8b107b57a6d805773dd638d | |
parent | f8925be13096eb1932dfb78a32492699a15ad631 (diff) | |
download | ipa_policy-11771dace7d8340601b6ec9bb2a38e26b94e8a4b.tar.gz ipa_policy-11771dace7d8340601b6ec9bb2a38e26b94e8a4b.tar.xz ipa_policy-11771dace7d8340601b6ec9bb2a38e26b94e8a4b.zip |
added xml search path
-rw-r--r-- | worker/worker.c | 8 | ||||
-rw-r--r-- | worker/xml_helper.c | 113 | ||||
-rw-r--r-- | worker/xml_helper.h | 5 |
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); + |