Fix segv on Solaris which don't like NULLs for %s
[pazpar2-moved-to-github.git] / src / settings.c
index 7b70782..491ad08 100644 (file)
@@ -198,12 +198,16 @@ int settings_read_node_x(xmlNode *n,
             continue;
         if (!strcmp((const char *) n->name, "set"))
         {
+            xmlNode *root = n->children;
             struct setting set;
             char *name = (char *) xmlGetProp(n, (xmlChar *) "name");
             char *target = (char *) xmlGetProp(n, (xmlChar *) "target");
             char *value = (char *) xmlGetProp(n, (xmlChar *) "value");
             char *user = (char *) xmlGetProp(n, (xmlChar *) "user");
             char *precedence = (char *) xmlGetProp(n, (xmlChar *) "precedence");
+            xmlChar *buf_out = 0;
+
+            set.next = 0;
 
             if (precedence)
                 set.precedence = atoi((char *) precedence);
@@ -214,8 +218,33 @@ int settings_read_node_x(xmlNode *n,
 
             set.target = target ? target : targeta;
             set.name = name ? name : namea;
-            set.value = value ? value : valuea;
-            set.next = 0;
+
+            while (root && root->type != XML_ELEMENT_NODE)
+                root = root->next;
+            if (!root)
+                set.value = value ? value : valuea;
+            else
+            {   /* xml document content for this setting */
+                xmlDoc *doc = xmlNewDoc(BAD_CAST "1.0");
+                if (!doc)
+                {
+                    if (set.name)
+                        yaz_log(YLOG_WARN, "bad XML content for setting "
+                                "name=%s", set.name);
+                    else
+                        yaz_log(YLOG_WARN, "bad XML content for setting");
+                    ret_val = -1;
+                }
+                else
+                {
+                    int len_out;
+                    xmlDocSetRootElement(doc, xmlCopyNode(root, 1));
+                    xmlDocDumpMemory(doc, &buf_out, &len_out);
+                    /* xmlDocDumpMemory 0-terminates */
+                    set.value = (char *) buf_out; 
+                    xmlFreeDoc(doc);
+                }
+            }
 
             if (set.name && set.value && set.target)
                 (*fun)(client_data, &set);
@@ -228,6 +257,7 @@ int settings_read_node_x(xmlNode *n,
                     yaz_log(YLOG_WARN, "missing name/value/target for setting");
                 ret_val = -1;
             }
+            xmlFree(buf_out);
             xmlFree(name);
             xmlFree(precedence);
             xmlFree(value);
@@ -342,7 +372,7 @@ void expand_settings_array(struct setting ***set_ar, int *num, int offset,
     }
 }
 
-void expand_settings_array2(struct settings *settings, int offset, NMEM nmem)
+void expand_settings_array2(struct settings_array *settings, int offset, NMEM nmem)
 {
     assert(offset >= 0);
     assert(settings);
@@ -359,7 +389,7 @@ void expand_settings_array2(struct settings *settings, int offset, NMEM nmem)
     }
 }
 
-static void update_settings(struct setting *set, struct settings *settings, int offset, NMEM nmem)
+static void update_settings(struct setting *set, struct settings_array *settings, int offset, NMEM nmem)
 {
     struct setting **sp;
     yaz_log(YLOG_LOG, "update service settings offset %d with %s=%s", offset, set->name, set->value);