X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fp2_config.cpp;fp=src%2Fp2_config.cpp;h=0000000000000000000000000000000000000000;hb=4d01797cadc9a0ac99876553a6ee2ef3529a4d27;hp=de50049c3dfd1e37d7af1e81534d92036c418a8e;hpb=495881ec0c538d38f680be81db9ac2b2bed84530;p=yazproxy-moved-to-github.git diff --git a/src/p2_config.cpp b/src/p2_config.cpp deleted file mode 100644 index de50049..0000000 --- a/src/p2_config.cpp +++ /dev/null @@ -1,383 +0,0 @@ -/* $Id: p2_config.cpp,v 1.1 2005-10-05 12:07:14 adam Exp $ - Copyright (c) 1998-2005, Index Data. - -This file is part of the yaz-proxy. - -YAZ proxy is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later -version. - -YAZ proxy is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with YAZ proxy; see the file LICENSE. If not, write to the -Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. - */ - -#include -#include -#include -#include -#include -#include "p2_config.h" - -#if HAVE_XSLT -#include -#include -#include -#include -#include -#endif - -#include - -using namespace std; - -class P2_Config::Rep { - -public: - Rep(); - ~Rep(); -public: -#if HAVE_XSLT - xmlDocPtr m_docPtr; - xmlNodePtr m_proxyPtr; -#endif -}; - -P2_Config::Rep::Rep() -{ -#if HAVE_XSLT - m_docPtr = 0; - m_proxyPtr = 0; -#endif -} - -P2_Config::Rep::~Rep() -{ -#if HAVE_XSLT - if (m_docPtr) - xmlFreeDoc(m_docPtr); -#endif -} - -P2_Config::P2_Config() -{ - m_max_clients = 500; - m_client_idletime = 600; - m_debug_mode = 0; - m_no_limit_files = 0; - m_no_threads = 20; - m_target_idletime = 600; - - m_rep = new Rep(); -} - -bool P2_Config::parse_options(int argc, char **argv) -{ - char *arg; - int ret; - bool show_config = false; - while ((ret = options("o:a:t:v:c:u:i:m:l:T:p:n:h:XS", - argv, argc, &arg)) != -2) - { - switch (ret) - { - case 0: - if (m_listen_address.length()) - { - yaz_log(YLOG_FATAL, "Multiple listener address given"); - return false; - } - m_listen_address = arg; - break; - case 'a': - m_apdu_log = arg; - break; - case 'c': - if (m_xml_fname.length()) - { - yaz_log(YLOG_FATAL, "Multiple -c options given"); - return false; - } - if (!read_xml_config(arg)) - { - return false; - } - m_xml_fname = arg; - break; - case 'i': - m_client_idletime = atoi(arg); - break; - case 'l': - m_log_file = arg; - break; - case 'm': - m_max_clients = atoi(arg); - break; - case 'n': - m_no_limit_files = atoi(arg); - break; - case 'h': - m_no_threads = atoi(arg); - break; - case 'o': - m_optimize_flags = arg; - break; - case 'p': - if (m_pid_fname.length()) - { - yaz_log(YLOG_LOG, "Multiple -p options given"); - return false; - } - m_pid_fname = arg; - break; - case 't': - if (m_default_target.length()) - { - yaz_log(YLOG_LOG, "Multiple -t options given"); - return false; - } - m_default_target = arg; - break; - case 'T': - m_target_idletime = atoi(arg); - break; - case 'u': - if (m_uid.length()) - { - yaz_log(YLOG_FATAL, "-u specified more than once"); - return false; - } - m_uid = arg; - break; - case 'v': - yaz_log_init_level(yaz_log_mask_str(arg)); - break; - case 'X': - m_debug_mode = 1; - break; - case 'S': - show_config = true; - break; - default: - yaz_log(YLOG_FATAL, "Bad option %s", arg); - return false; - } - } - if (m_log_file.length()) - yaz_log_init_file(m_log_file.c_str()); - if (show_config) - print(); - return true; -} - -bool P2_Config::parse_xml_text(void *xml_ptr, bool &val) -{ - string v; - if (!parse_xml_text(xml_ptr, v)) - return false; - if (v.length() == 1 && v[0] == '1') - val = true; - else - val = false; - return true; -} - -bool P2_Config::parse_xml_text(void *xml_ptr, string &val) -{ - xmlNodePtr ptr = (xmlNodePtr) xml_ptr; - bool found = false; - string v; - for(ptr = ptr->children; ptr; ptr = ptr->next) - if (ptr->type == XML_TEXT_NODE) - { - xmlChar *t = ptr->content; - if (t) - { - v += (const char *) t; - found = true; - } - } - if (found) - val = v; - return found; -} - -void P2_Config::parse_xml_element_target(void *xml_ptr, - P2_ConfigTarget *t) -{ - xmlNodePtr ptr = (xmlNodePtr) xml_ptr; - - for (ptr = ptr->children; ptr; ptr = ptr->next) - { - if (ptr->type != XML_ELEMENT_NODE) - continue; - if (!strcmp((const char *) ptr->name, "url")) - { - parse_xml_text(ptr, t->m_target_address); - } - else if (!strcmp((const char *) ptr->name, "database")) - { - parse_xml_text(ptr, t->m_target_database); - } - else - { - yaz_log(YLOG_WARN, "Unknown element '%s' inside target", - (const char *) ptr->name); - m_errors++; - } - } -} - -void P2_Config::parse_xml_element_proxy(void *xml_ptr) -{ - xmlNodePtr ptr = (xmlNodePtr) xml_ptr; - - for (ptr = ptr->children; ptr; ptr = ptr->next) - { - if (ptr->type != XML_ELEMENT_NODE) - continue; - if (!strcmp((const char *) ptr->name, "target")) - { - P2_ConfigTarget *t = new P2_ConfigTarget(); - - struct _xmlAttr *attr; - for (attr = ptr->properties; attr; attr = attr->next) - if (!strcmp((const char *) attr->name, "name") - || !strcmp((const char *) attr->name, "host")) - { - parse_xml_text(attr, t->m_virt_address); - } - else if (!strcmp((const char *) attr->name, "database")) - { - parse_xml_text(attr, t->m_virt_database); - } - else if (!strcmp((const char *) attr->name, "default")) - { - parse_xml_text(attr, t->m_default); - } - else if (!strcmp((const char *) attr->name, "type")) - { - parse_xml_text(attr, t->m_type); - } - else - { - yaz_log(YLOG_WARN, "Unknown attribute '%s' for " - "element proxy", - (const char *) attr->name); - m_errors++; - } - parse_xml_element_target(ptr, t); - m_target_list.push_back(t); - } - else if (!strcmp((const char *) ptr->name, "max-clients")) - { - string v; - if (parse_xml_text(ptr, v)) - m_max_clients = atoi(v.c_str()); - } - else if (!strcmp((const char *) ptr->name, "module")) - { - P2_ConfigModule *t = new P2_ConfigModule(); - - string v; - if (parse_xml_text(ptr, v)) - { - t->m_fname = v; - m_modules.push_back(t); - } - } - else - { - yaz_log(YLOG_WARN, "Unknown element '%s' inside proxy", ptr->name); - m_errors++; - } - } -} - -void P2_Config::print() -{ - cout << "max_clients=" << m_max_clients << endl; - list::const_iterator it; - - for (it = m_target_list.begin(); it != m_target_list.end(); it++) - { - cout << "type=" << (*it)->m_type << " "; - cout << "v-address=" << (*it)->m_virt_address << " "; - cout << "v-db=" << (*it)->m_virt_database << " "; - cout << "t-address=" << (*it)->m_target_address << " "; - cout << "t-db=" << (*it)->m_target_database << " "; - cout << "default=" << (*it)->m_default << endl; - } -} - -bool P2_Config::read_xml_config(const char *fname) -{ - xmlDocPtr ndoc = xmlParseFile(fname); - - if (!ndoc) - { - yaz_log(YLOG_WARN, "Config file %s not found or parse error", fname); - return false; - } - int noSubstitutions = xmlXIncludeProcess(ndoc); - if (noSubstitutions == -1) - yaz_log(YLOG_WARN, "XInclude processing failed on config %s", fname); - - xmlNodePtr proxyPtr = xmlDocGetRootElement(ndoc); - if (!proxyPtr || proxyPtr->type != XML_ELEMENT_NODE || - strcmp((const char *) proxyPtr->name, "proxy")) - { - yaz_log(YLOG_WARN, "No proxy element in %s", fname); - xmlFreeDoc(ndoc); - return false; - } - m_rep->m_proxyPtr = proxyPtr; - - // OK: release previous and make it the current one. - if (m_rep->m_docPtr) - xmlFreeDoc(m_rep->m_docPtr); - m_rep->m_docPtr = ndoc; - - m_errors = 0; - parse_xml_element_proxy(proxyPtr); - if (m_errors && !m_debug_mode) - return false; - return true; -} - -P2_Config::~P2_Config() -{ - delete m_rep; -} - -P2_ConfigTarget::P2_ConfigTarget() -{ - m_default = false; -} - -P2_ConfigTarget *P2_Config::find_target(string db) -{ - list::const_iterator it; - for (it = m_target_list.begin(); it != m_target_list.end(); it++) - { - if ((*it)->m_virt_database == db) - return (*it); - } - return 0; -} - - -/* - * Local variables: - * c-basic-offset: 4 - * indent-tabs-mode: nil - * End: - * vim: shiftwidth=4 tabstop=8 expandtab - */