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,
unsigned inbound)
82 const char* file = NULL;
84 file = (
const char*) xmlNodeGetContent(curNode);
87 inbound?
"input":
"output");
104 xmlXPathObjectPtr xpathObj = NULL;
105 xmlNode* curNode = NULL;
106 xmlChar* type = NULL;
110 if (!xpathCtx || !expr) {
113 xpathObj = xmlXPathEvalExpression(expr, xpathCtx);
114 if (xpathObj == NULL) {
115 ods_log_error(
"[%s] unable to parse adapter: xmlPathEvalExpression() "
116 "failed (expr %s)", parser_str, expr);
119 if (xpathObj->nodesetval) {
120 for (i=0; i < xpathObj->nodesetval->nodeNr; i++) {
121 curNode = xpathObj->nodesetval->nodeTab[i]->xmlChildrenNode;
123 if (xmlStrEqual(curNode->name, (
const xmlChar*)
"File")) {
125 }
else if (xmlStrEqual(curNode->name,
126 (
const xmlChar*)
"Adapter")) {
127 type = xmlGetProp(curNode, (
const xmlChar*)
"type");
128 if (xmlStrEqual(type, (
const xmlChar*)
"File")) {
130 }
else if (xmlStrEqual(type, (
const xmlChar*)
"DNS")) {
131 adapter = zlp_adapter(curNode,
ADAPTER_DNS, inbound);
134 "unknown type", parser_str, (
const char*) type);
142 curNode = curNode->next;
146 xmlXPathFreeObject(xpathObj);
156 parse_zonelist_adapters(xmlXPathContextPtr xpathCtx,
zone_type* zone)
158 xmlChar* i_expr = (xmlChar*)
"//Zone/Adapters/Input";
159 xmlChar* o_expr = (xmlChar*)
"//Zone/Adapters/Output";
161 if (!xpathCtx || !zone) {
177 char* tag_name = NULL;
178 char* zone_name = NULL;
182 xmlTextReaderPtr reader = NULL;
183 xmlDocPtr doc = NULL;
184 xmlXPathContextPtr xpathCtx = NULL;
185 xmlChar* name_expr = (
unsigned char*)
"name";
186 xmlChar* policy_expr = (
unsigned char*)
"//Zone/Policy";
187 xmlChar* signconf_expr = (
unsigned char*)
"//Zone/SignerConfiguration";
189 if (!zlist || !zlfile) {
192 reader = xmlNewTextReaderFilename(zlfile);
194 ods_log_error(
"[%s] unable to parse zonelist: failed to open file %s",
198 ret = xmlTextReaderRead(reader);
199 while (ret == XML_READER_TYPE_ELEMENT) {
200 tag_name = (
char*) xmlTextReaderLocalName(reader);
203 xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT) {
205 zone_name = (
char*) xmlTextReaderGetAttribute(reader,
207 if (!zone_name || strlen(zone_name) <= 0) {
209 "zonelist %s, skipping...", parser_str, zlfile);
211 free((
void*) zone_name);
213 free((
void*) tag_name);
214 ret = xmlTextReaderRead(reader);
218 xmlTextReaderExpand(reader);
219 doc = xmlTextReaderCurrentDoc(reader);
221 xpathCtx = xmlXPathNewContext(doc);
223 if (doc == NULL || xpathCtx == NULL) {
225 parser_str, zone_name);
226 ret = xmlTextReaderRead(reader);
227 free((
void*) zone_name);
228 free((
void*) tag_name);
232 new_zone =
zone_create(zone_name, LDNS_RR_CLASS_IN);
234 new_zone->
policy_name = parse_zonelist_element(xpathCtx,
238 parse_zonelist_adapters(xpathCtx, new_zone);
243 ods_log_crit(
"[%s] unable to create zone %s", parser_str,
255 ods_log_crit(
"[%s] unable to create zone %s", parser_str,
259 xmlXPathFreeContext(xpathCtx);
261 free((
void*) zone_name);
263 free((
void*) tag_name);
270 free((
void*) tag_name);
271 ret = xmlTextReaderRead(reader);
275 xmlFreeTextReader(reader);
280 ods_log_error(
"[%s] unable to parse zonelist: parse error in %s",