- if (ptr->type == XML_ELEMENT_NODE
- && !strcmp((const char *) ptr->name, "log"))
- {
- const char *v = m_cp->get_text(ptr);
- *log_mask = 0;
- while (v && *v)
- {
- const char *cp = v;
- while (*cp && *cp != ',' && !isspace(*cp))
- cp++;
- size_t len = cp - v;
- if (m_cp->mycmp(v, "client-apdu", len))
- *log_mask |= PROXY_LOG_APDU_CLIENT;
- if (m_cp->mycmp(v, "server-apdu", len))
- *log_mask |= PROXY_LOG_APDU_SERVER;
- if (m_cp->mycmp(v, "client-requests", len))
- *log_mask |= PROXY_LOG_REQ_CLIENT;
- if (m_cp->mycmp(v, "server-requests", len))
- *log_mask |= PROXY_LOG_REQ_SERVER;
- if (isdigit(*v))
- *log_mask |= atoi(v);
- if (*cp == ',')
- cp++;
- while (*cp && isspace(*cp))
- cp++;
- v = cp;
- }
- }
- if (ptr->type == XML_ELEMENT_NODE &&
- !strcmp((const char *) ptr->name, "max-clients"))
- {
- const char *t = m_cp->get_text(ptr);
- if (t)
- {
- *max_clients = atoi(t);
- if (*max_clients < 1)
- *max_clients = 1;
- }
- }
+ if (ptr->type == XML_ELEMENT_NODE
+ && !strcmp((const char *) ptr->name, "log"))
+ {
+ const char *v = m_cp->get_text(ptr);
+ *log_mask = 0;
+ while (v && *v)
+ {
+ const char *cp = v;
+ while (*cp && *cp != ',' && !isspace(*cp))
+ cp++;
+ size_t len = cp - v;
+ if (m_cp->mycmp(v, "client-apdu", len))
+ *log_mask |= PROXY_LOG_APDU_CLIENT;
+ if (m_cp->mycmp(v, "server-apdu", len))
+ *log_mask |= PROXY_LOG_APDU_SERVER;
+ if (m_cp->mycmp(v, "client-requests", len))
+ *log_mask |= PROXY_LOG_REQ_CLIENT;
+ if (m_cp->mycmp(v, "server-requests", len))
+ *log_mask |= PROXY_LOG_REQ_SERVER;
+ if (m_cp->mycmp(v, "client-ip", len))
+ *log_mask |= PROXY_LOG_IP_CLIENT;
+ if (isdigit(*v))
+ *log_mask |= atoi(v);
+ if (*cp == ',')
+ cp++;
+ while (*cp && isspace(*cp))
+ cp++;
+ v = cp;
+ }
+ }
+ else if (ptr->type == XML_ELEMENT_NODE &&
+ !strcmp((const char *) ptr->name, "max-clients"))
+ {
+ const char *t = m_cp->get_text(ptr);
+ if (t)
+ {
+ *max_clients = atoi(t);
+ if (*max_clients < 1)
+ *max_clients = 1;
+ }
+ }
+ else if (ptr->type == XML_ELEMENT_NODE &&
+ !strcmp((const char *) ptr->name, "period-connect"))
+ {
+ const char *t = m_cp->get_text(ptr);
+ if (t)
+ *period_connect = atoi(t);
+ }
+ else if (ptr->type == XML_ELEMENT_NODE &&
+ !strcmp((const char *) ptr->name, "max-connect"))
+ {
+ const char *t = m_cp->get_text(ptr);
+ if (t)
+ {
+ *max_connect = atoi(t);
+ }
+ }
+ else if (ptr->type == XML_ELEMENT_NODE &&
+ !strcmp((const char *) ptr->name, "limit-connect"))
+ {
+ const char *t = m_cp->get_text(ptr);
+ if (t)
+ {
+ *limit_connect = atoi(t);
+ }
+ }
+ else if (ptr->type == XML_ELEMENT_NODE &&
+ !strcmp((const char *) ptr->name, "target"))
+ ;
+ else if (ptr->type == XML_ELEMENT_NODE &&
+ !strcmp((const char *) ptr->name, "docpath"))
+ ;
+ else if (ptr->type == XML_ELEMENT_NODE)
+ {
+ yaz_log(YLOG_WARN, "0 Unknown element %s in yazproxy config",
+ ptr->name);
+ }
+ }
+#endif
+}
+
+#if HAVE_XSLT
+int Yaz_ProxyConfigP::get_explain_ptr(const char *host, const char *db,
+ xmlNodePtr *ptr_target,
+ xmlNodePtr *ptr_explain)
+{
+ xmlNodePtr ptr;
+ if (!m_proxyPtr)
+ return 0;
+ if (!db)
+ return 0;
+ for (ptr = m_proxyPtr->children; ptr; ptr = ptr->next)
+ {
+ if (ptr->type == XML_ELEMENT_NODE &&
+ !strcmp((const char *) ptr->name, "target"))
+ {
+ *ptr_target = ptr;
+ xmlNodePtr ptr = (*ptr_target)->children;
+ for (; ptr; ptr = ptr->next)
+ {
+ if (ptr->type == XML_ELEMENT_NODE &&
+ !strcmp((const char *) ptr->name, "explain"))
+ {
+ *ptr_explain = ptr;
+ xmlNodePtr ptr = (*ptr_explain)->children;
+
+ for (; ptr; ptr = ptr->next)
+ if (ptr->type == XML_ELEMENT_NODE &&
+ !strcmp((const char *) ptr->name, "serverInfo"))
+ break;
+ if (!ptr)
+ continue;
+ for (ptr = ptr->children; ptr; ptr = ptr->next)
+ if (ptr->type == XML_ELEMENT_NODE &&
+ !strcmp((const char *) ptr->name, "database"))
+ break;
+
+ if (!ptr)
+ continue;
+ for (ptr = ptr->children; ptr; ptr = ptr->next)
+ if (ptr->type == XML_TEXT_NODE &&
+ ptr->content &&
+ !strcmp((const char *) ptr->content, db))
+ break;
+ if (!ptr)
+ continue;
+ return 1;
+ }
+ }
+ }
+ }
+ return 0;
+}
+#endif
+
+const char *Yaz_ProxyConfig::get_explain_name(const char *db,
+ const char **backend_db)
+{
+#if HAVE_XSLT
+ xmlNodePtr ptr_target, ptr_explain;
+ if (m_cp->get_explain_ptr(0, db, &ptr_target, &ptr_explain)
+ && ptr_target)
+ {
+ struct _xmlAttr *attr;
+ const char *name = 0;
+
+ for (attr = ptr_target->properties; attr; attr = attr->next)
+ if (!strcmp((const char *) attr->name, "name")
+ && attr->children
+ && attr->children->type==XML_TEXT_NODE
+ && attr->children->content
+ && attr->children->content[0])
+ {
+ name = (const char *)attr->children->content;
+ break;
+ }
+ if (name)
+ {
+ for (attr = ptr_target->properties; attr; attr = attr->next)
+ if (!strcmp((const char *) attr->name, "database"))
+ {
+ if (attr->children
+ && attr->children->type==XML_TEXT_NODE
+ && attr->children->content)
+ *backend_db = (const char *) attr->children->content;
+ }
+ return name;
+ }