37 #include <libxml/xpath.h>
38 #include <libxml/xmlreader.h>
42 static const char* parser_str =
"parser";
50 parse_addns_remote(
allocator_type* allocator,
const char* filename,
60 xmlXPathContextPtr xpathCtx = NULL;
61 xmlXPathObjectPtr xpathObj = NULL;
62 xmlNode* curNode = NULL;
63 xmlChar* xexpr = NULL;
65 if (!allocator || !filename || !expr) {
69 doc = xmlParseFile(filename);
71 ods_log_error(
"[%s] could not parse %s: xmlParseFile() failed",
76 xpathCtx = xmlXPathNewContext(doc);
77 if(xpathCtx == NULL) {
79 ods_log_error(
"[%s] could not parse %s: xmlXPathNewContext() failed",
84 xexpr = (xmlChar*) expr;
85 xpathObj = xmlXPathEvalExpression(xexpr, xpathCtx);
86 if(xpathObj == NULL) {
87 xmlXPathFreeContext(xpathCtx);
89 ods_log_error(
"[%s] could not parse %s: xmlXPathEvalExpression() "
90 "failed", parser_str, expr);
94 if (xpathObj->nodesetval && xpathObj->nodesetval->nodeNr > 0) {
95 for (i = 0; i < xpathObj->nodesetval->nodeNr; i++) {
100 curNode = xpathObj->nodesetval->nodeTab[i]->xmlChildrenNode;
102 if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Address")) {
103 address = (
char *) xmlNodeGetContent(curNode);
104 }
else if (xmlStrEqual(curNode->name,
105 (
const xmlChar *)
"Port")) {
106 port = (
char *) xmlNodeGetContent(curNode);
107 }
else if (xmlStrEqual(curNode->name,
108 (
const xmlChar *)
"Key")) {
109 key = (
char *) xmlNodeGetContent(curNode);
111 curNode = curNode->next;
114 new_acl =
acl_create(allocator, address, port, key, tsig);
117 "%s: acl_create() failed", parser_str, address,
118 port?port:
"", key?key:
"", (
char*) expr);
123 parser_str, address, port?port:
"", key?key:
"",
127 free((
void*)address);
132 xmlXPathFreeObject(xpathObj);
133 xmlXPathFreeContext(xpathCtx);
154 xmlDocPtr doc = NULL;
155 xmlXPathContextPtr xpathCtx = NULL;
156 xmlXPathObjectPtr xpathObj = NULL;
157 xmlNode* curNode = NULL;
158 xmlChar* xexpr = NULL;
160 if (!allocator || !filename || !expr) {
164 doc = xmlParseFile(filename);
166 ods_log_error(
"[%s] could not parse %s: xmlParseFile() failed",
171 xpathCtx = xmlXPathNewContext(doc);
172 if(xpathCtx == NULL) {
174 ods_log_error(
"[%s] could not parse %s: xmlXPathNewContext() failed",
179 xexpr = (xmlChar*) expr;
180 xpathObj = xmlXPathEvalExpression(xexpr, xpathCtx);
181 if(xpathObj == NULL) {
182 xmlXPathFreeContext(xpathCtx);
184 ods_log_error(
"[%s] could not parse %s: xmlXPathEvalExpression() "
185 "failed", parser_str, expr);
189 if (xpathObj->nodesetval && xpathObj->nodesetval->nodeNr > 0) {
190 for (i = 0; i < xpathObj->nodesetval->nodeNr; i++) {
194 curNode = xpathObj->nodesetval->nodeTab[i]->xmlChildrenNode;
196 if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Prefix")) {
197 prefix = (
char *) xmlNodeGetContent(curNode);
198 }
else if (xmlStrEqual(curNode->name,
199 (
const xmlChar *)
"Key")) {
200 key = (
char *) xmlNodeGetContent(curNode);
202 curNode = curNode->next;
205 new_acl =
acl_create(allocator, prefix, NULL, key, tsig);
208 "%s: acl_create() failed", parser_str, prefix?prefix:
"",
209 key?key:
"", (
char*) expr);
214 parser_str, prefix?prefix:
"", key?key:
"", (
char*) expr);
221 xmlXPathFreeObject(xpathObj);
222 xmlXPathFreeContext(xpathCtx);
235 parse_addns_tsig_static(
allocator_type* allocator,
const char* filename,
244 xmlDocPtr doc = NULL;
245 xmlXPathContextPtr xpathCtx = NULL;
246 xmlXPathObjectPtr xpathObj = NULL;
247 xmlNode* curNode = NULL;
248 xmlChar* xexpr = NULL;
250 if (!allocator || !filename || !expr) {
254 doc = xmlParseFile(filename);
256 ods_log_error(
"[%s] could not parse %s: xmlParseFile() failed",
261 xpathCtx = xmlXPathNewContext(doc);
262 if(xpathCtx == NULL) {
264 ods_log_error(
"[%s] could not parse %s: xmlXPathNewContext() failed",
269 xexpr = (xmlChar*) expr;
270 xpathObj = xmlXPathEvalExpression(xexpr, xpathCtx);
271 if(xpathObj == NULL) {
272 xmlXPathFreeContext(xpathCtx);
274 ods_log_error(
"[%s] could not parse %s: xmlXPathEvalExpression() "
275 "failed", parser_str, expr);
279 if (xpathObj->nodesetval && xpathObj->nodesetval->nodeNr > 0) {
280 for (i = 0; i < xpathObj->nodesetval->nodeNr; i++) {
285 curNode = xpathObj->nodesetval->nodeTab[i]->xmlChildrenNode;
287 if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Name")) {
288 name = (
char *) xmlNodeGetContent(curNode);
289 }
else if (xmlStrEqual(curNode->name,
290 (
const xmlChar *)
"Algorithm")) {
291 algo = (
char *) xmlNodeGetContent(curNode);
292 }
else if (xmlStrEqual(curNode->name,
293 (
const xmlChar *)
"Secret")) {
294 secret = (
char *) xmlNodeGetContent(curNode);
296 curNode = curNode->next;
298 if (name && algo && secret) {
299 new_tsig =
tsig_create(allocator, name, algo, secret);
302 "tsig_create() failed", parser_str, name);
304 new_tsig->
next = tsig;
307 parser_str, name, (
char*) expr);
315 xmlXPathFreeObject(xpathObj);
316 xmlXPathFreeContext(xpathCtx);
332 return parse_addns_remote(allocator, filename, tsig,
333 "//Adapter/DNS/Inbound/RequestTransfer/Remote"
346 return parse_addns_acl(allocator, filename, tsig,
347 "//Adapter/DNS/Inbound/AllowNotify/Peer"
360 return parse_addns_acl(allocator, filename, tsig,
361 "//Adapter/DNS/Outbound/ProvideTransfer/Peer"
374 return parse_addns_remote(allocator, filename, tsig,
375 "//Adapter/DNS/Outbound/Notify/Remote"
387 return parse_addns_tsig_static(allocator, filename,