1 /* $Id: config.c,v 1.2 2006-12-27 21:11:10 quinn Exp $ */
5 #include <libxml/parser.h>
6 #include <libxml/tree.h>
8 #include <yaz/yaz-util.h>
11 #define CONFIG_NOEXTERNS
16 struct conf_config *config = 0;
18 static struct conf_service *parse_service(xmlNode *node)
21 struct conf_service *r = nmem_malloc(nmem, sizeof(struct conf_service));
25 for (n = node->children; n; n = n->next)
27 if (n->type != XML_ELEMENT_NODE)
29 if (!strcmp(n->name, "termlist"))
31 struct conf_termlist *tl = nmem_malloc(nmem, sizeof(struct conf_termlist));
32 xmlChar *name = xmlGetProp(n, "name");
35 yaz_log(YLOG_WARN, "Missing name attribute in termlist");
38 tl->name = nmem_strdup(nmem, name);
39 tl->next = r->termlists;
44 yaz_log(YLOG_FATAL, "Bad element: %s", n->name);
51 static struct conf_server *parse_server(xmlNode *node)
54 struct conf_server *r = nmem_malloc(nmem, sizeof(struct conf_server));
63 for (n = node->children; n; n = n->next)
65 if (n->type != XML_ELEMENT_NODE)
67 if (!strcmp(n->name, "listen"))
69 xmlChar *port = xmlGetProp(n, "port");
70 xmlChar *host = xmlGetProp(n, "host");
74 r->host = nmem_strdup(nmem, host);
76 else if (!strcmp(n->name, "proxy"))
78 xmlChar *port = xmlGetProp(n, "port");
79 xmlChar *host = xmlGetProp(n, "host");
81 r->proxy_port = atoi(port);
83 r->proxy_host = nmem_strdup(nmem, host);
85 else if (!strcmp(n->name, "service"))
87 struct conf_service *s = parse_service(n);
94 yaz_log(YLOG_FATAL, "Bad element: %s", n->name);
101 static struct conf_config *parse_config(xmlNode *root)
104 struct conf_config *r = nmem_malloc(nmem, sizeof(struct conf_config));
107 r->queryprofiles = 0;
108 r->retrievalprofiles = 0;
110 for (n = root->children; n; n = n->next)
112 if (n->type != XML_ELEMENT_NODE)
114 if (!strcmp(n->name, "server"))
116 struct conf_server *tmp = parse_server(n);
119 tmp->next = r->servers;
122 else if (!strcmp(n->name, "queryprofile"))
125 else if (!strcmp(n->name, "retrievalprofile"))
130 yaz_log(YLOG_FATAL, "Bad element: %s", n->name);
137 int read_config(const char *fname)
139 xmlDoc *doc = xmlReadFile(fname, NULL, 0);
141 nmem = nmem_create();
144 yaz_log(YLOG_FATAL, "Failed to read %s", fname);
147 if ((config = parse_config(xmlDocGetRootElement(doc))))
157 * indent-tabs-mode: nil
159 * vim: shiftwidth=4 tabstop=8 expandtab