32 #include "adapter/adapter.h" 36 #include "signer/zonelist.h" 37 #include "signer/zone.h" 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) {
67 str = (
const char*) xmlXPathCastToString(xpathObj);
68 xmlXPathFreeObject(xpathObj);
84 parse_zonelist_adapter_file(xmlNode* curNode,
int inbound)
86 const char* file = NULL;
87 adapter_type* adapter = NULL;
89 file = (
const char*) xmlNodeGetContent(curNode);
91 ods_log_error(
"[%s] unable to read %s file adapter", parser_str,
92 inbound?
"input":
"output");
96 adapter = adapter_create(file, ADAPTER_FILE, inbound);
107 parse_zonelist_adapter(xmlXPathContextPtr xpathCtx, xmlChar* expr,
110 xmlXPathObjectPtr xpathObj = NULL;
111 xmlNode* curNode = NULL;
112 adapter_type* adapter = NULL;
115 if (!xpathCtx || !expr) {
119 xpathObj = xmlXPathEvalExpression(expr, xpathCtx);
120 if (xpathObj == NULL) {
126 if (xpathObj->nodesetval) {
127 for (i=0; i < xpathObj->nodesetval->nodeNr; i++) {
128 curNode = xpathObj->nodesetval->nodeTab[i]->xmlChildrenNode;
130 if (xmlStrEqual(curNode->name, (
const xmlChar*)
"File")) {
131 adapter = parse_zonelist_adapter_file(curNode, inbound);
136 curNode = curNode->next;
140 xmlXPathFreeObject(xpathObj);
150 parse_zonelist_adapters(xmlXPathContextPtr xpathCtx, zone_type*
zone)
152 xmlChar* i_expr = (xmlChar*)
"//Zone/Adapters/Input";
153 xmlChar* o_expr = (xmlChar*)
"//Zone/Adapters/Output";
155 if (!xpathCtx || !zone) {
159 zone->adinbound = parse_zonelist_adapter(xpathCtx, i_expr, 1);
160 zone->adoutbound = parse_zonelist_adapter(xpathCtx, o_expr, 0);
171 char* tag_name = NULL;
173 zone_type* new_zone = NULL;
176 xmlTextReaderPtr reader = NULL;
177 xmlDocPtr doc = NULL;
178 xmlXPathContextPtr xpathCtx = NULL;
180 xmlChar* name_expr = (
unsigned char*)
"name";
181 xmlChar* policy_expr = (
unsigned char*)
"//Zone/Policy";
182 xmlChar* signconf_expr = (
unsigned char*)
"//Zone/SignerConfiguration";
187 return ODS_STATUS_ASSERT_ERR;
189 ods_log_assert(zlist);
194 return ODS_STATUS_ASSERT_ERR;
196 ods_log_assert(zlfile);
198 reader = xmlNewTextReaderFilename(zlfile);
200 ods_log_error(
"[%s] unable to open file %s", parser_str, zlfile);
201 return ODS_STATUS_XML_ERR;
204 ret = xmlTextReaderRead(reader);
205 while (ret == XML_READER_TYPE_ELEMENT) {
206 tag_name = (
char*) xmlTextReaderLocalName(reader);
207 if (strcmp(tag_name,
"Zone") == 0 &&
208 strcmp(tag_name,
"ZoneList") != 0 &&
209 xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT) {
211 zone_name = (
char*) xmlTextReaderGetAttribute(reader,
213 if (!zone_name || strlen(zone_name) <= 0) {
214 ods_log_error(
"[%s] unable to extract zone name from zonelist",
217 free((
void*) zone_name);
219 free((
void*) tag_name);
220 ret = xmlTextReaderRead(reader);
225 xmlTextReaderExpand(reader);
226 doc = xmlTextReaderCurrentDoc(reader);
228 xpathCtx = xmlXPathNewContext(doc);
230 if (doc == NULL || xpathCtx == NULL) {
232 parser_str, zone_name);
233 free((
void*) zone_name);
234 ret = xmlTextReaderRead(reader);
235 free((
void*) tag_name);
240 new_zone =
zone_create(zone_name, LDNS_RR_CLASS_IN);
241 new_zone->policy_name = parse_zonelist_element(xpathCtx,
243 new_zone->signconf_filename = parse_zonelist_element(xpathCtx,
245 parse_zonelist_adapters(xpathCtx, new_zone);
248 if (zonelist_add_zone((zonelist_type*) zlist, new_zone) == NULL) {
254 free((
void*) zone_name);
255 xmlXPathFreeContext(xpathCtx);
257 free((
void*) tag_name);
258 ret = xmlTextReaderRead(reader);
262 xmlFreeTextReader(reader);
267 ods_log_error(
"[%s] error parsing file %s", parser_str, zlfile);
268 return ODS_STATUS_PARSE_ERR;
270 return ODS_STATUS_OK;
void ods_log_debug(const char *format,...)
void ods_log_error(const char *format,...)
const char * zone_name(const zone_t *zone)
ods_status parse_zonelist_zones(struct zonelist_struct *zlist, const char *zlfile)
int zone_create(zone_t *zone)