+static struct setting_dictionary *dictionary = 0;
+
+int settings_offset(const char *name)
+{
+ int i;
+
+ for (i = 0; i < dictionary->num; i++)
+ if (!strcmp(name, dictionary->dict[i]))
+ return i;
+ return -1;
+}
+
+char *settings_name(int offset)
+{
+ return dictionary->dict[offset];
+}
+
+static int isdir(const char *path)
+{
+ struct stat st;
+
+ if (stat(path, &st) < 0)
+ {
+ yaz_log(YLOG_FATAL|YLOG_ERRNO, "%s", path);
+ exit(1);
+ }
+ return st.st_mode & S_IFDIR;
+}
+
+// Read settings from an XML file, calling handler function for each setting
+static void read_settings_file(const char *path,
+ void (*fun)(struct setting *set))
+{
+ xmlDoc *doc = xmlParseFile(path);
+ xmlNode *n;
+ xmlChar *namea, *targeta, *valuea, *usera, *precedencea;
+
+ if (!doc)
+ {
+ yaz_log(YLOG_FATAL, "Failed to parse %s", path);
+ exit(1);
+ }
+ n = xmlDocGetRootElement(doc);
+ namea = xmlGetProp(n, (xmlChar *) "name");
+ targeta = xmlGetProp(n, (xmlChar *) "target");
+ valuea = xmlGetProp(n, (xmlChar *) "value");
+ usera = xmlGetProp(n, (xmlChar *) "user");
+ precedencea = xmlGetProp(n, (xmlChar *) "precedence");
+ for (n = n->children; n; n = n->next)
+ {
+ if (n->type != XML_ELEMENT_NODE)
+ continue;
+ if (!strcmp(n->name, (xmlChar *) "set"))
+ {
+ char *name, *target, *value, *user, *precedence;
+
+ name = xmlGetProp(n, (xmlChar *) "name");
+ target = xmlGetProp(n, (xmlChar *) "target");
+ value = xmlGetProp(n, (xmlChar *) "value");
+ user = xmlGetProp(n, (xmlChar *) "user");
+ precedence = xmlGetProp(n, (xmlChar *) "precedence");
+
+ if ((!name && !namea) || (!value && !valuea) || (!target && !targeta))
+ {
+ yaz_log(YLOG_FATAL, "set must specify name, value, and target");
+ exit(1);
+ }
+ else
+ {
+ struct setting set;
+ char nameb[1024];
+ char targetb[1024];
+ char userb[1024];
+ char valueb[1024];
+
+ // Copy everything into a temporary buffer -- we decide
+ // later if we are keeping it.
+ if (precedence)
+ set.precedence = atoi((char *) precedence);
+ else if (precedencea)
+ set.precedence = atoi((char *) precedencea);
+ else
+ set.precedence = 0;
+ set.user = userb;
+ if (user)
+ strcpy(userb, user);
+ else if (usera)
+ strcpy(userb, usera);
+ else
+ set.user = "";
+ if (target)
+ strcpy(targetb, target);
+ else
+ strcpy(targetb, targeta);
+ set.target = targetb;
+ if (name)
+ strcpy(nameb, name);
+ else
+ strcpy(nameb, namea);
+ set.name = nameb;
+ if (value)
+ strcpy(valueb, value);
+ else
+ strcpy(valueb, valuea);
+ set.value = valueb;
+ set.next = 0;
+ (*fun)(&set);
+ }
+ xmlFree(name);
+ xmlFree(precedence);
+ xmlFree(value);
+ xmlFree(user);
+ xmlFree(target);
+ }
+ else
+ {
+ yaz_log(YLOG_FATAL, "Unknown element %s in settings file", (char*) n->name);
+ exit(1);
+ }
+ }
+ xmlFree(namea);
+ xmlFree(precedencea);
+ xmlFree(valuea);
+ xmlFree(usera);
+ xmlFree(targeta);
+}
+