X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fstatserv.c;h=dfba86b9b4fa3cdd5b7a633ec2a20d6f536b97e0;hb=1ee98ea192555da1959c4012736f7797cc5f91df;hp=aceecbf00bbe122f986e200211e01688d456b8da;hpb=8b2791efeb9e671fabf90c36c6828a5bf71c887b;p=yaz-moved-to-github.git diff --git a/src/statserv.c b/src/statserv.c index aceecbf..dfba86b 100644 --- a/src/statserv.c +++ b/src/statserv.c @@ -5,7 +5,7 @@ * NT threaded server code by * Chas Woodfield, Fretwell Downing Informatics. * - * $Id: statserv.c,v 1.23 2005-03-01 20:37:01 adam Exp $ + * $Id: statserv.c,v 1.29 2005-03-14 11:14:21 adam Exp $ */ /** @@ -38,6 +38,7 @@ #if HAVE_XML2 #include #include +#include #endif #if YAZ_POSIX_THREADS @@ -63,13 +64,17 @@ static IOCHAN pListener = NULL; +static char gfs_root_dir[FILENAME_MAX+1]; static struct gfs_server *gfs_server_list = 0; static struct gfs_listen *gfs_listen_list = 0; static NMEM gfs_nmem = 0; static char *me = "statserver"; /* log prefix */ static char *programname="statserver"; /* full program name */ -#if YAZ_POSIX_THREADS +#ifdef WIN32 +DWORD current_control_tls; +static int init_control_tls = 0; +#elif YAZ_POSIX_THREADS static pthread_key_t current_control_tls; static int init_control_tls = 0; #else @@ -212,6 +217,8 @@ static struct gfs_server * gfs_server_new() n->host = 0; n->listen_ref = 0; n->cql_transform = 0; + n->server_node_ptr = 0; + n->directory = 0; return n; } @@ -228,6 +235,21 @@ static struct gfs_listen * gfs_listen_new(const char *id, return n; } +static void gfs_server_chdir(struct gfs_server *gfs) +{ + if (gfs_root_dir[0]) + { + if (chdir(gfs_root_dir)) + yaz_log(YLOG_WARN|YLOG_ERRNO, "chdir %s", gfs_root_dir); + } + if (gfs->directory) + { + if (chdir(gfs->directory)) + yaz_log(YLOG_WARN|YLOG_ERRNO, "chdir %s", + gfs->directory); + } +} + int control_association(association *assoc, const char *host, int force_open) { char vhost[128], *cp; @@ -259,20 +281,28 @@ int control_association(association *assoc, const char *host, int force_open) { statserv_setcontrol(assoc->last_control); if (assoc->backend && assoc->init) + { + gfs_server_chdir(gfs); (assoc->last_control->bend_close)(assoc->backend); + } assoc->backend = 0; xfree(assoc->init); assoc->init = 0; } assoc->cql_transform = gfs->cql_transform; + assoc->server_node_ptr = gfs->server_node_ptr; assoc->last_control = &gfs->cb; statserv_setcontrol(&gfs->cb); + gfs_server_chdir(gfs); + yaz_log(YLOG_DEBUG, "server select: %s", gfs->cb.configname); return 1; } } statserv_setcontrol(0); assoc->last_control = 0; assoc->cql_transform = 0; + assoc->server_node_ptr = 0; + yaz_log(YLOG_DEBUG, "server select: no match"); return 0; } else @@ -280,6 +310,8 @@ int control_association(association *assoc, const char *host, int force_open) statserv_setcontrol(&control_block); assoc->last_control = &control_block; assoc->cql_transform = 0; + assoc->server_node_ptr = 0; + yaz_log(YLOG_DEBUG, "server select: config=%s", control_block.configname); return 1; } } @@ -295,9 +327,10 @@ static void xml_config_read() return; for (ptr = ptr->children; ptr; ptr = ptr->next) { + struct _xmlAttr *attr; if (ptr->type != XML_ELEMENT_NODE) continue; - struct _xmlAttr *attr = ptr->properties; + attr = ptr->properties; if (!strcmp((const char *) ptr->name, "listen")) { /* @@ -319,15 +352,23 @@ static void xml_config_read() } else if (!strcmp((const char *) ptr->name, "server")) { - xmlNodePtr ptr_children = ptr->children; + xmlNodePtr ptr_server = ptr; xmlNodePtr ptr; const char *listenref = 0; + const char *id = 0; for ( ; attr; attr = attr->next) - if (!strcmp(attr->name, "listenref") - && attr->children && attr->children->type == XML_TEXT_NODE) + if (!strcmp(attr->name, "listenref") && attr->children && + attr->children->type == XML_TEXT_NODE) listenref = nmem_dup_xml_content(gfs_nmem, attr->children); + else if (!strcmp(attr->name, "id") && attr->children && + attr->children->type == XML_TEXT_NODE) + id = nmem_dup_xml_content(gfs_nmem, attr->children); + else + yaz_log(YLOG_WARN, "Unknown attribute '%s' for server", + attr->name); *gfsp = gfs_server_new(); + (*gfsp)->server_node_ptr = ptr_server; if (listenref) { int id_no; @@ -342,7 +383,7 @@ static void xml_config_read() yaz_log(YLOG_WARN, "Non-existent listenref '%s' in server " "config element", listenref); } - for (ptr = ptr_children; ptr; ptr = ptr->next) + for (ptr = ptr_server->children; ptr; ptr = ptr->next) { if (ptr->type != XML_ELEMENT_NODE) continue; @@ -351,17 +392,22 @@ static void xml_config_read() (*gfsp)->host = nmem_dup_xml_content(gfs_nmem, ptr->children); } - if (!strcmp((const char *) ptr->name, "config")) + else if (!strcmp((const char *) ptr->name, "config")) { strcpy((*gfsp)->cb.configname, nmem_dup_xml_content(gfs_nmem, ptr->children)); } - if (!strcmp((const char *) ptr->name, "pqf2cql")) + else if (!strcmp((const char *) ptr->name, "cql2rpn")) { (*gfsp)->cql_transform = cql_transform_open_fname( nmem_dup_xml_content(gfs_nmem, ptr->children) ); } + else if (!strcmp((const char *) ptr->name, "directory")) + { + (*gfsp)->directory = + nmem_dup_xml_content(gfs_nmem, ptr->children); + } } gfsp = &(*gfsp)->next; } @@ -372,6 +418,19 @@ static void xml_config_read() static void xml_config_open() { + if (!getcwd(gfs_root_dir, FILENAME_MAX)) + { + yaz_log(YLOG_WARN|YLOG_ERRNO, "getcwd failed"); + gfs_root_dir[0] = '\0'; + } +#ifdef WIN32 + init_control_tls = 1; + current_control_tls = TlsAlloc(); +#elif YAZ_POSIX_THREADS + init_control_tls = 1; + pthread_key_create(¤t_control_tls, 0); +#endif + gfs_nmem = nmem_create(); #if HAVE_XML2 if (control_block.xml_config[0] == '\0') @@ -382,12 +441,21 @@ static void xml_config_open() xml_config_doc = xmlParseFile(control_block.xml_config); if (!xml_config_doc) { - yaz_log(YLOG_WARN, "Could not parse %s", control_block.xml_config); - return ; + yaz_log(YLOG_FATAL, "Could not parse %s", control_block.xml_config); + exit(1); + } + else + { + int noSubstitutions = xmlXIncludeProcess(xml_config_doc); + if (noSubstitutions == -1) + { + yaz_log(YLOG_WARN, "XInclude processing failed for config %s", + control_block.xml_config); + exit(1); + } } } xml_config_read(); - #endif } @@ -402,6 +470,13 @@ static void xml_config_close() #endif gfs_server_list = 0; nmem_destroy(gfs_nmem); +#ifdef WIN32 + if (init_control_tls) + TlsFree(current_control_tls); +#elif YAZ_POSIX_THREADS + if (init_control_tls) + pthread_key_delete(current_control_tls); +#endif } static void xml_config_add_listeners() @@ -427,7 +502,10 @@ static void xml_config_bend_start() gfs->cb.configname); statserv_setcontrol(&gfs->cb); if (control_block.bend_start) + { + gfs_server_chdir(gfs); (control_block.bend_start)(&gfs->cb); + } } } else @@ -437,7 +515,6 @@ static void xml_config_bend_start() if (control_block.bend_start) (*control_block.bend_start)(&control_block); } - } static void xml_config_bend_stop() @@ -669,7 +746,7 @@ static void listener(IOCHAN h, int event) yaz_log(YLOG_DEBUG, "Accept ok"); if (!(new_chan = iochan_create(cs_fileno(new_line), ir_session, - EVENT_INPUT, parent_chan->port))) + EVENT_INPUT, parent_chan->chan_id))) { yaz_log(YLOG_FATAL, "Failed to create iochan"); iochan_destroy(h); @@ -746,9 +823,6 @@ void statserv_closedown() iochan_destroy(p); } xml_config_close(); -#if YAZ_POSIX_THREADS - pthread_key_delete(current_control_tls); -#endif } void sigterm(int sig) @@ -1026,7 +1100,12 @@ static void catchchld(int num) statserv_options_block *statserv_getcontrol(void) { -#if YAZ_POSIX_THREADS +#ifdef WIN32 + if (init_control_tls) + return (statserv_options_block *) TlsGetValue(current_control_tls); + else + return &control_block; +#elif YAZ_POSIX_THREADS if (init_control_tls) return pthread_getspecific(current_control_tls); else @@ -1040,7 +1119,11 @@ statserv_options_block *statserv_getcontrol(void) void statserv_setcontrol(statserv_options_block *block) { -#if YAZ_POSIX_THREADS + chdir(gfs_root_dir); +#ifdef WIN32 + if (init_control_tls) + TlsSetValue(current_control_tls, block); +#elif YAZ_POSIX_THREADS if (init_control_tls) pthread_setspecific(current_control_tls, block); #else @@ -1076,11 +1159,6 @@ int statserv_start(int argc, char **argv) if (control_block.options_func(argc, argv)) return 1; -#if YAZ_POSIX_THREADS - init_control_tls = 1; - pthread_key_create(¤t_control_tls, 0); -#endif - xml_config_open(); xml_config_bend_start();