40 #include <libxml/xpath.h> 41 #include <libxml/xmlreader.h> 45 static const char* parser_str =
"parser";
53 parse_zonelist_element(xmlXPathContextPtr xpathCtx, xmlChar* expr)
55 xmlXPathObjectPtr xpathObj = NULL;
56 const char* str = NULL;
58 ods_log_assert(xpathCtx);
61 xpathObj = xmlXPathEvalExpression(expr, xpathCtx);
62 if (xpathObj == NULL) {
63 ods_log_error(
"[%s] unable to evaluate xpath expression %s",
67 str = (
const char*) xmlXPathCastToString(xpathObj);
68 xmlXPathFreeObject(xpathObj);
78 zlp_adapter(xmlNode* curNode,
adapter_mode type,
unsigned inbound)
80 const char* file = NULL;
82 file = (
const char*) xmlNodeGetContent(curNode);
84 ods_log_error(
"[%s] unable to read %s adapter", parser_str,
85 inbound?
"input":
"output");
102 xmlXPathObjectPtr xpathObj = NULL;
103 xmlNode* curNode = NULL;
104 xmlChar* type = NULL;
108 if (!xpathCtx || !expr) {
111 xpathObj = xmlXPathEvalExpression(expr, xpathCtx);
112 if (xpathObj == NULL) {
113 ods_log_error(
"[%s] unable to parse adapter: xmlPathEvalExpression() " 114 "failed (expr %s)", parser_str, expr);
117 if (xpathObj->nodesetval) {
118 for (i=0; i < xpathObj->nodesetval->nodeNr; i++) {
119 curNode = xpathObj->nodesetval->nodeTab[i]->xmlChildrenNode;
121 if (xmlStrEqual(curNode->name, (
const xmlChar*)
"File")) {
123 }
else if (xmlStrEqual(curNode->name,
124 (
const xmlChar*)
"Adapter")) {
125 type = xmlGetProp(curNode, (
const xmlChar*)
"type");
126 if (xmlStrEqual(type, (
const xmlChar*)
"File")) {
128 }
else if (xmlStrEqual(type, (
const xmlChar*)
"DNS")) {
129 adapter = zlp_adapter(curNode,
ADAPTER_DNS, inbound);
131 ods_log_error(
"[%s] unable to parse %s adapter: " 132 "unknown type", parser_str, (
const char*) type);
138 xmlXPathFreeObject(xpathObj);
141 curNode = curNode->next;
145 xmlXPathFreeObject(xpathObj);
155 parse_zonelist_adapters(xmlXPathContextPtr xpathCtx,
zone_type* zone)
157 xmlChar* i_expr = (xmlChar*)
"//Zone/Adapters/Input";
158 xmlChar* o_expr = (xmlChar*)
"//Zone/Adapters/Output";
160 if (!xpathCtx || !zone) {
175 char* tag_name = NULL;
176 char* zone_name = NULL;
180 xmlTextReaderPtr reader = NULL;
181 xmlDocPtr doc = NULL;
182 xmlXPathContextPtr xpathCtx = NULL;
183 xmlChar* name_expr = (
unsigned char*)
"name";
184 xmlChar* policy_expr = (
unsigned char*)
"//Zone/Policy";
185 xmlChar* signconf_expr = (
unsigned char*)
"//Zone/SignerConfiguration";
187 if (!zlist || !zlfile) {
188 return ODS_STATUS_ASSERT_ERR;
190 reader = xmlNewTextReaderFilename(zlfile);
192 ods_log_error(
"[%s] unable to parse zonelist: failed to open file %s",
194 return ODS_STATUS_XML_ERR;
196 ret = xmlTextReaderRead(reader);
197 while (ret == XML_READER_TYPE_ELEMENT) {
198 tag_name = (
char*) xmlTextReaderLocalName(reader);
199 if (ods_strcmp(tag_name,
"Zone") == 0 &&
200 ods_strcmp(tag_name,
"ZoneList") != 0 &&
201 xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT) {
203 zone_name = (
char*) xmlTextReaderGetAttribute(reader,
205 if (!zone_name || strlen(zone_name) <= 0) {
206 ods_log_alert(
"[%s] unable to extract zone name from " 207 "zonelist %s, skipping...", parser_str, zlfile);
209 free((
void*) zone_name);
211 free((
void*) tag_name);
212 ret = xmlTextReaderRead(reader);
216 xmlTextReaderExpand(reader);
217 doc = xmlTextReaderCurrentDoc(reader);
219 xpathCtx = xmlXPathNewContext(doc);
221 if (doc == NULL || xpathCtx == NULL) {
222 ods_log_alert(
"[%s] unable to read zone %s, skipping...",
223 parser_str, zone_name);
224 ret = xmlTextReaderRead(reader);
225 free((
void*) zone_name);
226 free((
void*) tag_name);
230 new_zone =
zone_create(zone_name, LDNS_RR_CLASS_IN);
232 new_zone->
policy_name = parse_zonelist_element(xpathCtx,
236 parse_zonelist_adapters(xpathCtx, new_zone);
241 ods_log_crit(
"[%s] unable to create zone %s", parser_str,
246 ods_log_crit(
"[%s] unable to add zone %s", parser_str,
253 ods_log_crit(
"[%s] unable to create zone %s", parser_str,
257 xmlXPathFreeContext(xpathCtx);
259 free((
void*) zone_name);
261 free((
void*) tag_name);
266 ods_log_debug(
"[%s] zone %s added", parser_str, new_zone->
name);
268 free((
void*) tag_name);
269 ret = xmlTextReaderRead(reader);
272 ods_log_debug(
"[%s] no more zones", parser_str);
273 xmlFreeTextReader(reader);
278 ods_log_error(
"[%s] unable to parse zonelist: parse error in %s",
280 return ODS_STATUS_PARSE_ERR;
282 return ODS_STATUS_OK;
void zone_cleanup(zone_type *zone)
zone_type * zone_create(char *name, ldns_rr_class klass)
adapter_type * adoutbound
zone_type * zonelist_add_zone(zonelist_type *zlist, zone_type *zone)
adapter_type * adapter_create(const char *str, adapter_mode type, unsigned in)
ods_status parse_zonelist_zones(void *zlist, const char *zlfile)
const char * signconf_filename
enum adapter_mode_enum adapter_mode
adapter_type * parse_zonelist_adapter(xmlXPathContextPtr xpathCtx, xmlChar *expr, int inbound)