X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fstatserv.c;h=4b80162afb48924a27a8c2b9dc440b47d15128db;hp=bed22d04ef355268f07478c487515b63e849175c;hb=2979c8fc3b5c53c06facad850dcae09645b43044;hpb=926357dcfb7a359cc7a23766460cef5fe21156ee diff --git a/src/statserv.c b/src/statserv.c index bed22d0..4b80162 100644 --- a/src/statserv.c +++ b/src/statserv.c @@ -1,11 +1,11 @@ /* - * Copyright (C) 1995-2006, Index Data ApS + * Copyright (C) 1995-2007, Index Data ApS * See the file LICENSE for details. * * NT threaded server code by * Chas Woodfield, Fretwell Downing Informatics. * - * $Id: statserv.c,v 1.41 2006-09-06 09:35:42 adam Exp $ + * $Id: statserv.c,v 1.52 2007-11-12 08:57:45 adam Exp $ */ /** @@ -85,15 +85,13 @@ static statserv_options_block *current_control_block = 0; /* * default behavior. */ -#define STAT_DEFAULT_LOG_LEVEL "none,fatal,warn,log,server,session,request" -/* the 'none' clears yaz' own default settings, including [log] */ +#define STAT_DEFAULT_LOG_LEVEL "server,session,request" int check_options(int argc, char **argv); statserv_options_block control_block = { 1, /* dynamic mode */ 0, /* threaded mode */ 0, /* one shot (single session) */ - 0, /* __UNUSED_loglevel */ "", /* no PDUs */ "", /* diagnostic output to stderr */ "tcp:@:9999", /* default listener port */ @@ -151,7 +149,7 @@ static xmlDocPtr xml_config_doc = 0; #endif #if YAZ_HAVE_XML2 -static xmlNodePtr xml_config_get_root() +static xmlNodePtr xml_config_get_root(void) { xmlNodePtr ptr = 0; if (xml_config_doc) @@ -185,7 +183,7 @@ static char *nmem_dup_xml_content(NMEM n, xmlNodePtr ptr) len += xmlStrlen(p->content); } /* now allocate for the string */ - str = nmem_malloc(n, len); + str = (unsigned char *) nmem_malloc(n, len); *str = '\0'; /* so we can use strcat */ for (p = ptr; p; p = p->next) { @@ -212,14 +210,16 @@ static char *nmem_dup_xml_content(NMEM n, xmlNodePtr ptr) } #endif -static struct gfs_server * gfs_server_new() +static struct gfs_server * gfs_server_new(void) { - struct gfs_server *n = nmem_malloc(gfs_nmem, sizeof(*n)); + struct gfs_server *n = (struct gfs_server *) + nmem_malloc(gfs_nmem, sizeof(*n)); memcpy(&n->cb, &control_block, sizeof(control_block)); n->next = 0; n->host = 0; n->listen_ref = 0; n->cql_transform = 0; + n->ccl_transform = 0; n->server_node_ptr = 0; n->directory = 0; n->docpath = 0; @@ -233,7 +233,8 @@ static struct gfs_server * gfs_server_new() static struct gfs_listen * gfs_listen_new(const char *id, const char *address) { - struct gfs_listen *n = nmem_malloc(gfs_nmem, sizeof(*n)); + struct gfs_listen *n = (struct gfs_listen *) + nmem_malloc(gfs_nmem, sizeof(*n)); if (id) n->id = nmem_strdup(gfs_nmem, id); else @@ -327,7 +328,7 @@ int control_association(association *assoc, const char *host, int force_open) return 1; } -static void xml_config_read() +static void xml_config_read(void) { struct gfs_server **gfsp = &gfs_server_list; struct gfs_listen **gfslp = &gfs_listen_list; @@ -416,6 +417,20 @@ static void xml_config_read() nmem_dup_xml_content(gfs_nmem, ptr->children) ); } + else if (!strcmp((const char *) ptr->name, "ccl2rpn")) + { + char *name; + FILE *f; + + name = nmem_dup_xml_content(gfs_nmem, ptr->children); + if ((f = fopen(name, "r")) == 0) { + yaz_log(YLOG_FATAL, "can't open CCL file '%s'", name); + exit(1); + } + gfs->ccl_transform = ccl_qual_mk(); + ccl_qual_file (gfs->ccl_transform, f); + fclose(f); + } else if (!strcmp((const char *) ptr->name, "directory")) { gfs->directory = @@ -434,7 +449,7 @@ static void xml_config_read() else if (!strcmp((const char *) ptr->name, "stylesheet")) { char *s = nmem_dup_xml_content(gfs_nmem, ptr->children); - gfs->stylesheet = + gfs->stylesheet = (char *) nmem_malloc(gfs_nmem, strlen(s) + 2); sprintf(gfs->stylesheet, "/%s", s); } @@ -466,7 +481,7 @@ static void xml_config_read() *gfsp = 0; } -static void xml_config_open() +static void xml_config_open(void) { if (!getcwd(gfs_root_dir, FILENAME_MAX)) { @@ -509,7 +524,7 @@ static void xml_config_open() #endif } -static void xml_config_close() +static void xml_config_close(void) { #if YAZ_HAVE_XML2 if (xml_config_doc) @@ -529,7 +544,7 @@ static void xml_config_close() #endif } -static void xml_config_add_listeners() +static void xml_config_add_listeners(void) { struct gfs_listen *gfs = gfs_listen_list; int id_no; @@ -541,7 +556,7 @@ static void xml_config_add_listeners() } } -static void xml_config_bend_start() +static void xml_config_bend_start(void) { if (control_block.xml_config[0]) { @@ -567,7 +582,7 @@ static void xml_config_bend_start() } } -static void xml_config_bend_stop() +static void xml_config_bend_stop(void) { if (control_block.xml_config[0]) { @@ -756,7 +771,7 @@ void statserv_closedown() void __cdecl event_loop_thread (IOCHAN iochan) { - event_loop (&iochan); + iochan_event_loop (&iochan); } /* WIN32 listener */ @@ -770,27 +785,21 @@ static void listener(IOCHAN h, int event) if (event == EVENT_INPUT) { + COMSTACK new_line; + IOCHAN new_chan; + if ((res = cs_listen(line, 0, 0)) < 0) { - yaz_log(YLOG_FATAL, "cs_listen failed"); + yaz_log(YLOG_FATAL|YLOG_ERRNO, "cs_listen failed"); return; } else if (res == 1) - return; + return; /* incomplete */ yaz_log(YLOG_DEBUG, "listen ok"); - iochan_setevent(h, EVENT_OUTPUT); - iochan_setflags(h, EVENT_OUTPUT | EVENT_EXCEPT); /* set up for acpt */ - } - else if (event == EVENT_OUTPUT) - { - COMSTACK new_line = cs_accept(line); - IOCHAN new_chan; - char *a = NULL; - - if (!new_line) + new_line = cs_accept(line); + if (!new_line) { yaz_log(YLOG_FATAL, "Accept failed."); - iochan_setflags(h, EVENT_INPUT | EVENT_EXCEPT); return; } yaz_log(YLOG_DEBUG, "Accept ok"); @@ -989,7 +998,7 @@ static void *new_session (void *vp) association *newas; IOCHAN new_chan; COMSTACK new_line = (COMSTACK) vp; - IOCHAN parent_chan = new_line->user; + IOCHAN parent_chan = (IOCHAN) new_line->user; unsigned cs_get_mask, cs_accept_mask, mask = ((new_line->io_pending & CS_WANT_WRITE) ? EVENT_OUTPUT : 0) | @@ -1034,7 +1043,7 @@ static void *new_session (void *vp) control_block.one_shot = 1; if (control_block.threads) { - event_loop(&new_chan); + iochan_event_loop(&new_chan); } else { @@ -1118,7 +1127,11 @@ static int add_listener(char *where, int listen_id) if (cs_bind(l, ap, CS_SERVER) < 0) { - yaz_log(YLOG_FATAL|YLOG_ERRNO, "Failed to bind to %s", where); + if (cs_errno(l) == CSYSERR) + yaz_log(YLOG_FATAL|YLOG_ERRNO, "Failed to bind to %s", where); + else + yaz_log(YLOG_FATAL, "Failed to bind to %s: %s", where, + cs_strerror(l)); cs_close (l); return -1; } @@ -1157,7 +1170,8 @@ statserv_options_block *statserv_getcontrol(void) return &control_block; #elif YAZ_POSIX_THREADS if (init_control_tls) - return pthread_getspecific(current_control_tls); + return (statserv_options_block *) + pthread_getspecific(current_control_tls); else return &control_block; #else @@ -1329,7 +1343,7 @@ int statserv_start(int argc, char **argv) if (pListener == NULL) return 1; yaz_log(YLOG_DEBUG, "Entering event loop."); - return event_loop(&pListener); + return iochan_event_loop(&pListener); } static void option_copy(char *dst, const char *src) @@ -1343,19 +1357,10 @@ int check_options(int argc, char **argv) int ret = 0, r; char *arg; - if (getenv("YAZ_LOG") == 0) { - /* - * Set default log level. We want to avoid doing this if the - * user has already explicitly specified a preferred default - * log-level, hence the inelegant peek at the YAZ_LOG - * environment variable that will subsequently be interpreted - * by the YAZ logging module itself. - */ - yaz_log_init_level(yaz_log_mask_str(STAT_DEFAULT_LOG_LEVEL)); - } - + yaz_log_init_level(yaz_log_mask_str(STAT_DEFAULT_LOG_LEVEL)); get_logbits(1); - while ((ret = options("1a:iszSTl:v:u:c:w:t:k:d:A:p:DC:f:m:", + + while ((ret = options("1a:iszSTl:v:u:c:w:t:k:d:A:p:DC:f:m:r:", argv, argc, &arg)) != -2) { switch (ret) @@ -1401,12 +1406,10 @@ int check_options(int argc, char **argv) } yaz_log_time_format(arg); break; - case 'v': { - int default_level = yaz_log_mask_str(STAT_DEFAULT_LOG_LEVEL); - yaz_log_init_level(yaz_log_mask_str_x(arg, default_level)); + case 'v': + yaz_log_init_level(yaz_log_mask_str(arg)); get_logbits(1); break; - } case 'a': option_copy(control_block.apdufile, arg); break; @@ -1465,6 +1468,14 @@ int check_options(int argc, char **argv) case 'D': control_block.background = 1; break; + case 'r': + if (!arg || !(r = atoi(arg))) + { + fprintf(stderr, "%s: Specify positive size for -r.\n", me); + return(1); + } + yaz_log_init_max_size(r * 1024); + break; default: fprintf(stderr, "Usage: %s [ -a -v " " -l -u -c -t "