X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fstatserv.c;h=db60db7d7ad1f7f8fb5014d4427150ef97ab8fb8;hp=c5c416a87e94e5485a2eefe7fa7304e4b0822af6;hb=c2d4d247b3fe28f7c191fbc3644c8e011e1a4fea;hpb=e255616521c8ba665309bcaeccabb35b6efe35d7 diff --git a/src/statserv.c b/src/statserv.c index c5c416a..db60db7 100644 --- a/src/statserv.c +++ b/src/statserv.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2008 Index Data + * Copyright (C) 1995-2010 Index Data * See the file LICENSE for details. */ @@ -53,6 +53,7 @@ #include #include #include +#include #ifdef USE_XTIMOSI #include #endif @@ -94,7 +95,7 @@ statserv_options_block control_block = { "", /* diagnostic output to stderr */ "tcp:@:9999", /* default listener port */ PROTO_Z3950, /* default application protocol */ - 15, /* idle timeout (minutes) */ + 900, /* idle timeout (seconds) */ 1024*1024, /* maximum PDU size (approx.) to allow */ "default-config", /* configuration name to pass to backend */ "", /* set user id */ @@ -208,6 +209,7 @@ static char *nmem_dup_xml_content(NMEM n, xmlNodePtr ptr) } #endif +#if YAZ_HAVE_XML2 static struct gfs_server * gfs_server_new(void) { struct gfs_server *n = (struct gfs_server *) @@ -222,12 +224,12 @@ static struct gfs_server * gfs_server_new(void) n->directory = 0; n->docpath = 0; n->stylesheet = 0; -#if YAZ_HAVE_XML2 n->retrieval = yaz_retrieval_create(); -#endif return n; } +#endif +#if YAZ_HAVE_XML2 static struct gfs_listen * gfs_listen_new(const char *id, const char *address) { @@ -241,6 +243,7 @@ static struct gfs_listen * gfs_listen_new(const char *id, n->address = nmem_strdup(gfs_nmem, address); return n; } +#endif static void gfs_server_chdir(struct gfs_server *gfs) { @@ -326,11 +329,11 @@ int control_association(association *assoc, const char *host, int force_open) return 1; } +#if YAZ_HAVE_XML2 static void xml_config_read(void) { struct gfs_server **gfsp = &gfs_server_list; struct gfs_listen **gfslp = &gfs_listen_list; -#if YAZ_HAVE_XML2 xmlNodePtr ptr = xml_config_get_root(); if (!ptr) @@ -475,9 +478,9 @@ static void xml_config_read(void) gfsp = &(*gfsp)->next; } } -#endif *gfsp = 0; } +#endif static void xml_config_open(void) { @@ -767,9 +770,9 @@ static void statserv_closedown() xml_config_close(); } -void __cdecl event_loop_thread (IOCHAN iochan) +void __cdecl event_loop_thread(IOCHAN iochan) { - iochan_event_loop (&iochan); + iochan_event_loop(&iochan); } /* WIN32 listener */ @@ -887,7 +890,7 @@ void sigterm(int sig) term_flag = 1; } -static void *new_session (void *vp); +static void *new_session(void *vp); static int no_sessions = 0; /* UNIX listener */ @@ -957,20 +960,20 @@ static void listener(IOCHAN h, int event) { #if YAZ_POSIX_THREADS pthread_t child_thread; - pthread_create (&child_thread, 0, new_session, new_line); - pthread_detach (child_thread); + pthread_create(&child_thread, 0, new_session, new_line); + pthread_detach(child_thread); #elif YAZ_GNU_THREADS pth_attr_t attr; pth_t child_thread; - attr = pth_attr_new (); - pth_attr_set (attr, PTH_ATTR_JOINABLE, FALSE); - pth_attr_set (attr, PTH_ATTR_STACK_SIZE, 32*1024); - pth_attr_set (attr, PTH_ATTR_NAME, "session"); - yaz_log (YLOG_DEBUG, "pth_spawn begin"); - child_thread = pth_spawn (attr, new_session, new_line); - yaz_log (YLOG_DEBUG, "pth_spawn finish"); - pth_attr_destroy (attr); + attr = pth_attr_new(); + pth_attr_set(attr, PTH_ATTR_JOINABLE, FALSE); + pth_attr_set(attr, PTH_ATTR_STACK_SIZE, 32*1024); + pth_attr_set(attr, PTH_ATTR_NAME, "session"); + yaz_log(YLOG_DEBUG, "pth_spawn begin"); + child_thread = pth_spawn(attr, new_session, new_line); + yaz_log(YLOG_DEBUG, "pth_spawn finish"); + pth_attr_destroy(attr); #else new_session(new_line); #endif @@ -990,9 +993,9 @@ static void listener(IOCHAN h, int event) } } -static void *new_session (void *vp) +static void *new_session(void *vp) { - char *a; + const char *a; association *newas; IOCHAN new_chan; COMSTACK new_line = (COMSTACK) vp; @@ -1035,6 +1038,7 @@ static void *new_session (void *vp) #else a = 0; #endif + yaz_log_xml_errors(0, YLOG_WARN); yaz_log(log_session, "Session - OK %d %s %ld", no_sessions, a ? a : "[Unknown]", (long) getpid()); if (max_sessions && no_sessions >= max_sessions) @@ -1059,7 +1063,7 @@ static void inetd_connection(int what) COMSTACK line; IOCHAN chan; association *assoc; - char *addr; + const char *addr; if ((line = cs_createbysocket(0, tcpip_type, 0, what))) { @@ -1130,14 +1134,14 @@ static int add_listener(char *where, int listen_id) else yaz_log(YLOG_FATAL, "Failed to bind to %s: %s", where, cs_strerror(l)); - cs_close (l); + cs_close(l); return -1; } if (!(lst = iochan_create(cs_fileno(l), listener, EVENT_INPUT | EVENT_EXCEPT, listen_id))) { yaz_log(YLOG_FATAL|YLOG_ERRNO, "Failed to create IOCHAN-type"); - cs_close (l); + cs_close(l); return -1; } iochan_setdata(lst, l); /* user-defined data for listener is COMSTACK */ @@ -1181,7 +1185,11 @@ statserv_options_block *statserv_getcontrol(void) void statserv_setcontrol(statserv_options_block *block) { - chdir(gfs_root_dir); + if (gfs_root_dir[0]) + { + if (chdir(gfs_root_dir)) + yaz_log(YLOG_WARN|YLOG_ERRNO, "chdir %s", gfs_root_dir); + } #ifdef WIN32 if (init_control_tls) TlsSetValue(current_control_tls, block); @@ -1212,7 +1220,7 @@ static int statserv_sc_main(yaz_sc_t s, int argc, char **argv) #else sep = '/'; #endif - if ((me = strrchr (argv[0], sep))) + if ((me = strrchr(argv[0], sep))) me++; /* get the basename */ else me = argv[0]; @@ -1228,7 +1236,7 @@ static int statserv_sc_main(yaz_sc_t s, int argc, char **argv) #ifdef WIN32 xml_config_add_listeners(); - yaz_log (log_server, "Starting server %s", me); + yaz_log(log_server, "Starting server %s", me); if (!pListener && *control_block.default_listen) add_listener(control_block.default_listen, 0); #else @@ -1279,7 +1287,10 @@ static int statserv_sc_main(yaz_sc_t s, int argc, char **argv) close(1); close(2); open("/dev/null", O_RDWR); - dup(0); dup(0); + if (dup(0) == -1) + return 1; + if (dup(0) == -1) + return 1; } xml_config_add_listeners(); @@ -1306,21 +1317,21 @@ static int statserv_sc_main(yaz_sc_t s, int argc, char **argv) close(hand[1]); - yaz_log (log_server, "Starting server %s pid=%ld", programname, - (long) getpid()); + yaz_log(log_server, "Starting server %s pid=%ld", programname, + (long) getpid()); #if 0 sigset_t sigs_to_block; sigemptyset(&sigs_to_block); - sigaddset (&sigs_to_block, SIGTERM); - pthread_sigmask (SIG_BLOCK, &sigs_to_block, 0); + sigaddset(&sigs_to_block, SIGTERM); + pthread_sigmask(SIG_BLOCK, &sigs_to_block, 0); /* missing... */ #endif if (control_block.dynamic) signal(SIGCHLD, catchchld); } - signal (SIGPIPE, SIG_IGN); - signal (SIGTERM, sigterm); + signal(SIGPIPE, SIG_IGN); + signal(SIGTERM, sigterm); if (*control_block.setuid) { struct passwd *pw; @@ -1359,7 +1370,6 @@ int check_options(int argc, char **argv) yaz_log_init_level(yaz_log_mask_str(STAT_DEFAULT_LOG_LEVEL)); - yaz_log_xml_errors(0, YLOG_WARN); get_logbits(1); while ((ret = options("1a:iszSTl:v:u:c:w:t:k:d:A:p:DC:f:m:r:", @@ -1379,8 +1389,8 @@ int check_options(int argc, char **argv) control_block.default_proto = PROTO_Z3950; break; case 's': - fprintf (stderr, "%s: SR protocol no longer supported\n", me); - exit (1); + fprintf(stderr, "%s: SR protocol no longer supported\n", me); + exit(1); break; case 'S': control_block.dynamic = 0; @@ -1433,7 +1443,7 @@ int check_options(int argc, char **argv) fprintf(stderr, "%s: Specify positive timeout for -t.\n", me); return(1); } - control_block.idle_timeout = r; + control_block.idle_timeout = strchr(arg, 's') ? r : 60 * r; break; case 'k': if (!arg || !(r = atoi(arg))) @@ -1522,6 +1532,7 @@ int statserv_main(int argc, char **argv, /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab