42 #include <libxml/xpath.h>
43 #include <libxml/xmlreader.h>
47 static const char* parser_str =
"parser";
55 parse_zonelist_element(xmlXPathContextPtr xpathCtx, xmlChar* expr)
57 xmlXPathObjectPtr xpathObj = NULL;
58 const char* str = NULL;
63 xpathObj = xmlXPathEvalExpression(expr, xpathCtx);
64 if (xpathObj == NULL) {
69 str = (
const char*) xmlXPathCastToString(xpathObj);
70 xmlXPathFreeObject(xpathObj);
80 zlp_adapter(xmlNode* curNode,
adapter_mode type,
int inbound)
82 const char* file = NULL;
85 file = (
const char*) xmlNodeGetContent(curNode);
88 inbound?
"input":
"output");
106 xmlXPathObjectPtr xpathObj = NULL;
107 xmlNode* curNode = NULL;
111 if (!xpathCtx || !expr) {
115 xpathObj = xmlXPathEvalExpression(expr, xpathCtx);
116 if (xpathObj == NULL) {
122 if (xpathObj->nodesetval) {
123 for (i=0; i < xpathObj->nodesetval->nodeNr; i++) {
124 curNode = xpathObj->nodesetval->nodeTab[i]->xmlChildrenNode;
126 if (xmlStrEqual(curNode->name, (
const xmlChar*)
"File")) {
132 curNode = curNode->next;
136 xmlXPathFreeObject(xpathObj);
146 parse_zonelist_adapters(xmlXPathContextPtr xpathCtx,
zone_type* zone)
148 xmlChar* i_expr = (xmlChar*)
"//Zone/Adapters/Input";
149 xmlChar* o_expr = (xmlChar*)
"//Zone/Adapters/Output";
151 if (!xpathCtx || !zone) {
168 char* tag_name = NULL;
169 char* zone_name = NULL;
173 xmlTextReaderPtr reader = NULL;
174 xmlDocPtr doc = NULL;
175 xmlXPathContextPtr xpathCtx = NULL;
177 xmlChar* name_expr = (
unsigned char*)
"name";
178 xmlChar* policy_expr = (
unsigned char*)
"//Zone/Policy";
179 xmlChar* signconf_expr = (
unsigned char*)
"//Zone/SignerConfiguration";
195 reader = xmlNewTextReaderFilename(zlfile);
197 ods_log_error(
"[%s] unable to open file %s", parser_str, zlfile);
201 ret = xmlTextReaderRead(reader);
202 while (ret == XML_READER_TYPE_ELEMENT) {
203 tag_name = (
char*) xmlTextReaderLocalName(reader);
206 xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT) {
208 zone_name = (
char*) xmlTextReaderGetAttribute(reader,
210 if (!zone_name || strlen(zone_name) <= 0) {
212 "zonelist", parser_str);
214 free((
void*) zone_name);
216 free((
void*) tag_name);
217 ret = xmlTextReaderRead(reader);
222 xmlTextReaderExpand(reader);
223 doc = xmlTextReaderCurrentDoc(reader);
225 xpathCtx = xmlXPathNewContext(doc);
227 if (doc == NULL || xpathCtx == NULL) {
229 parser_str, zone_name);
230 ret = xmlTextReaderRead(reader);
231 free((
void*) zone_name);
232 free((
void*) tag_name);
234 xmlXPathFreeContext(xpathCtx);
241 new_zone =
zone_create(zone_name, LDNS_RR_CLASS_IN);
242 new_zone->
policy_name = parse_zonelist_element(xpathCtx,
246 parse_zonelist_adapters(xpathCtx, new_zone);
251 ods_log_crit(
"[%s] unable to create zone %s", parser_str,
262 xmlXPathFreeContext(xpathCtx);
264 free((
void*) zone_name);
266 free((
void*) tag_name);
273 free((
void*) tag_name);
274 ret = xmlTextReaderRead(reader);
278 xmlFreeTextReader(reader);
283 ods_log_error(
"[%s] error parsing file %s", parser_str, zlfile);
void zone_cleanup(zone_type *zone)
void ods_log_debug(const char *format,...)
enum ods_enum_status ods_status
void ods_log_error(const char *format,...)
int ods_strcmp(const char *s1, const char *s2)
zone_type * zone_create(char *name, ldns_rr_class klass)
adapter_type * adoutbound
void ods_log_crit(const char *format,...)
zone_type * zonelist_add_zone(zonelist_type *zlist, zone_type *zone)
adapter_type * adapter_create(const char *str, adapter_mode type, int inbound)
const char * signconf_filename
enum adapter_mode_enum adapter_mode
adapter_type * parse_zonelist_adapter(xmlXPathContextPtr xpathCtx, xmlChar *expr, int inbound)
ods_status parse_zonelist_zones(struct zonelist_struct *zlist, const char *zlfile)
#define ods_log_assert(x)