41 #include <libxml/xpath.h>
42 #include <libxml/relaxng.h>
43 #include <libxml/xmlreader.h>
47 static const char* parser_str =
"parser";
58 xmlDocPtr rngdoc = NULL;
59 xmlRelaxNGParserCtxtPtr rngpctx = NULL;
60 xmlRelaxNGValidCtxtPtr rngctx = NULL;
61 xmlRelaxNGPtr schema = NULL;
64 if (!cfgfile || !rngfile) {
70 ods_log_debug(
"[%s] check cfgfile %s with rngfile %s", parser_str,
74 doc = xmlParseFile(cfgfile);
81 rngdoc = xmlParseFile(rngfile);
89 rngpctx = xmlRelaxNGNewDocParserCtxt(rngdoc);
90 if (rngpctx == NULL) {
93 ods_log_error(
"[%s] unable to create XML RelaxNGs parser context",
100 schema = xmlRelaxNGParse(rngpctx);
101 if (schema == NULL) {
102 ods_log_error(
"[%s] unable to parse a schema definition resource",
104 xmlRelaxNGFreeParserCtxt(rngpctx);
110 rngctx = xmlRelaxNGNewValidCtxt(schema);
111 if (rngctx == NULL) {
112 ods_log_error(
"[%s] unable to create RelaxNGs validation context",
114 xmlRelaxNGFree(schema);
115 xmlRelaxNGFreeParserCtxt(rngpctx);
121 status = xmlRelaxNGValidateDoc(rngctx,doc);
123 ods_log_error(
"[%s] cfgfile validation failed %s", parser_str,
125 xmlRelaxNGFreeValidCtxt(rngctx);
126 xmlRelaxNGFree(schema);
127 xmlRelaxNGFreeParserCtxt(rngpctx);
132 xmlRelaxNGFreeValidCtxt(rngctx);
133 xmlRelaxNGFree(schema);
134 xmlRelaxNGFreeParserCtxt(rngpctx);
151 char* tag_name = NULL;
156 xmlTextReaderPtr reader = NULL;
157 xmlDocPtr doc = NULL;
158 xmlXPathContextPtr xpathCtx = NULL;
160 xmlChar* expr = (xmlChar*)
"//Adapter";
165 reader = xmlNewTextReaderFilename(cfgfile);
167 ods_log_error(
"[%s] unable to open file %s", parser_str, cfgfile);
171 ret = xmlTextReaderRead(reader);
174 while (ret == XML_READER_TYPE_ELEMENT) {
175 if (adcount >=
ADMAX) {
177 "skipping additional adapters", parser_str, cfgfile);
181 tag_name = (
char*) xmlTextReaderLocalName(reader);
188 xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT) {
192 xmlTextReaderExpand(reader);
193 doc = xmlTextReaderCurrentDoc(reader);
195 xpathCtx = xmlXPathNewContext(doc);
197 if (doc == NULL || xpathCtx == NULL) {
200 ret = xmlTextReaderRead(reader);
201 free((
void*) tag_name);
208 xmlXPathFreeContext(xpathCtx);
210 free((
void*) tag_name);
211 ret = xmlTextReaderRead(reader);
216 xmlFreeTextReader(reader);
221 ods_log_error(
"[%s] error parsing file %s", parser_str, cfgfile);
224 *count = (int) adcount;
236 xmlDocPtr doc = NULL;
237 xmlXPathContextPtr xpathCtx = NULL;
238 xmlXPathObjectPtr xpathObj = NULL;
239 xmlChar *xexpr = NULL;
240 const char*
string = NULL;
246 doc = xmlParseFile(cfgfile);
251 xpathCtx = xmlXPathNewContext(doc);
252 if (xpathCtx == NULL) {
253 ods_log_error(
"[%s] unable to create new XPath context for cfgile "
254 "%s expr %s", parser_str, cfgfile, (
char*) expr);
259 xexpr = (
unsigned char*) expr;
260 xpathObj = xmlXPathEvalExpression(xexpr, xpathCtx);
261 if (xpathObj == NULL || xpathObj->nodesetval == NULL ||
262 xpathObj->nodesetval->nodeNr <= 0) {
264 ods_log_error(
"[%s] unable to evaluate required element %s in "
265 "cfgfile %s", parser_str, (
char*) xexpr, cfgfile);
267 xmlXPathFreeContext(xpathCtx);
269 xmlXPathFreeObject(xpathObj);
274 if (xpathObj->nodesetval != NULL &&
275 xpathObj->nodesetval->nodeNr > 0) {
276 string = (
const char*) xmlXPathCastToString(xpathObj);
277 xmlXPathFreeContext(xpathCtx);
278 xmlXPathFreeObject(xpathObj);
282 xmlXPathFreeContext(xpathCtx);
283 xmlXPathFreeObject(xpathObj);
292 const char* dup = NULL;
295 "//Configuration/Common/ZoneListFile",
309 const char* dup = NULL;
312 "//Configuration/Common/ZoneFetchFile",
326 const char* dup = NULL;
328 "//Configuration/Common/Logging/Syslog/Facility",
332 "//Configuration/Common/Logging/File/Filename",
346 const char* dup = NULL;
349 "//Configuration/Signer/PidFile",
365 const char* dup = NULL;
368 "//Configuration/Signer/NotifyCommand",
382 const char* dup = NULL;
385 "//Configuration/Signer/SocketFile",
401 const char* dup = NULL;
404 "//Configuration/Signer/WorkingDirectory",
420 const char* dup = NULL;
423 "//Configuration/Signer/Privileges/User",
437 const char* dup = NULL;
440 "//Configuration/Signer/Privileges/Group",
454 const char* dup = NULL;
457 "//Configuration/Signer/Privileges/Directory",
476 "//Configuration/Common/Logging/Syslog/Facility",
488 int verbosity = ODS_SE_VERBOSITY;
490 "//Configuration/Common/Logging/Verbosity",
493 if (strlen(str) > 0) {
494 verbosity = atoi(str);
505 int numwt = ODS_SE_WORKERTHREADS;
507 "//Configuration/Signer/WorkerThreads",
510 if (strlen(str) > 0) {
522 int numwt = ODS_SE_WORKERTHREADS;
524 "//Configuration/Signer/SignerThreads",
527 if (strlen(str) > 0) {