From: Adam Dickmeiss Date: Wed, 11 Aug 2010 07:27:40 +0000 (+0200) Subject: Merge branch 'master' into solr_client X-Git-Tag: v4.1.0~40^2~22 X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=commitdiff_plain;h=88c65669e62d0735931e64392b7c59129f6e68bc;hp=aca4eb82b50d781d4ab636cfc15412a2aca3e903 Merge branch 'master' into solr_client --- diff --git a/configure.ac b/configure.ac index 6e50432..c31a5e9 100644 --- a/configure.ac +++ b/configure.ac @@ -21,7 +21,7 @@ dnl YAZ_DOC dnl dnl -AC_CHECK_HEADERS([dirent.h fnmatch.h wchar.h locale.h langinfo.h pwd.h unistd.h sys/select.h sys/socket.h sys/stat.h sys/time.h sys/times.h sys/types.h sys/un.h sys/wait.h netdb.h arpa/inet.h netinet/tcp.h netinet/in_systm.h],[],[],[]) +AC_CHECK_HEADERS([dirent.h fnmatch.h wchar.h locale.h langinfo.h pwd.h unistd.h sys/select.h sys/socket.h sys/stat.h sys/time.h sys/times.h sys/types.h sys/un.h sys/wait.h sys/prctl.h netdb.h arpa/inet.h netinet/tcp.h netinet/in_systm.h],[],[],[]) AC_CHECK_HEADERS([net/if.h netinet/in.h netinet/if_ether.h],[],[],[ #if HAVE_SYS_TYPES_H #include diff --git a/src/daemon.c b/src/daemon.c index a4d0fd4..69c2330 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -33,6 +33,10 @@ #include #endif +#if HAVE_SYS_PRCTL_H +#include +#endif + #include #include #include @@ -199,6 +203,13 @@ int yaz_daemon(const char *progname, yaz_log(YLOG_FATAL|YLOG_ERRNO, "setuid"); exit(1); } + /* Linux don't produce core dumps evern if the limit is right and + files are writable.. This fixes this. See prctl(2) */ +#if HAVE_SYS_PRCTL_H +#ifdef PR_SET_DUMPABLE + prctl(PR_SET_DUMPABLE, 1, 0, 0); +#endif +#endif } if (flags & YAZ_DAEMON_FORK) diff --git a/src/eventl.c b/src/eventl.c index 5e219ca..b5ef123 100644 --- a/src/eventl.c +++ b/src/eventl.c @@ -88,11 +88,6 @@ int iochan_event_loop(IOCHAN *iochans) int res; time_t now = time(0); - if (statserv_must_terminate()) - { - for (p = *iochans; p; p = p->next) - p->force_event = EVENT_TIMEOUT; - } for (p = *iochans; p; p = p->next) no_fds++; fds = (struct yaz_poll_fd *) xmalloc(no_fds * sizeof(*fds)); @@ -129,11 +124,6 @@ int iochan_event_loop(IOCHAN *iochans) { if (yaz_errno() == EINTR) { - if (statserv_must_terminate()) - { - for (p = *iochans; p; p = p->next) - p->force_event = EVENT_TIMEOUT; - } xfree(fds); continue; } diff --git a/src/pquery.c b/src/pquery.c index 3004c24..65dcdd1 100644 --- a/src/pquery.c +++ b/src/pquery.c @@ -826,24 +826,20 @@ Z_AttributeList *yaz_pqf_scan_attribute_list(YAZ_PQF_Parser p, ODR o, static Z_FacetField* parse_facet(ODR odr, const char *facet, int length) { YAZ_PQF_Parser pqf_parser = yaz_pqf_create(); - char buffer[length+1]; + char *buffer = odr_strdupn(odr, facet, length); Odr_oid *attributeSetId; - Z_FacetField *facet_field; - Z_AttributeList *attribute_list; - memcpy(buffer, facet, length); - buffer[length] = '\0'; - attribute_list = yaz_pqf_scan_attribute_list(pqf_parser, odr, &attributeSetId, buffer); - - if (!attribute_list) { - printf("Invalid facet definition: %s", facet); - return 0; + Z_FacetField *facet_field = 0; + Z_AttributeList *attribute_list = + yaz_pqf_scan_attribute_list(pqf_parser, odr, &attributeSetId, buffer); + + if (attribute_list) + { + facet_field = odr_malloc(odr, sizeof(*facet_field)); + facet_field->attributes = attribute_list; + facet_field->num_terms = 0; + facet_field->terms = 0; } - facet_field = odr_malloc(odr, sizeof(*facet_field)); - facet_field->attributes = attribute_list; - facet_field->num_terms = 0; - facet_field->terms = 0; - //debug_add_facet_term(odr, facet_field); - + yaz_pqf_destroy(pqf_parser); return facet_field; } diff --git a/src/session.h b/src/session.h index 0007e76..c66676f 100644 --- a/src/session.h +++ b/src/session.h @@ -148,8 +148,6 @@ void request_delq(request_q *q); request *request_get(request_q *q); void request_release(request *r); -int statserv_must_terminate(void); - int control_association(association *assoc, const char *host, int force); int ir_read(IOCHAN h, int event); diff --git a/src/statserv.c b/src/statserv.c index db60db7..8598891 100644 --- a/src/statserv.c +++ b/src/statserv.c @@ -61,6 +61,7 @@ #include "eventl.h" #include "session.h" #include +#include static IOCHAN pListener = NULL; @@ -853,22 +854,11 @@ static void listener(IOCHAN h, int event) } } -int statserv_must_terminate(void) -{ - return 0; -} - #else /* ! WIN32 */ -static int term_flag = 0; /* To save having an #ifdef in event_loop we need to define this empty function */ -int statserv_must_terminate(void) -{ - return term_flag; -} - void statserv_remove(IOCHAN pIOChannel) { } @@ -885,11 +875,6 @@ static void statserv_closedown(void) xml_config_close(); } -void sigterm(int sig) -{ - term_flag = 1; -} - static void *new_session(void *vp); static int no_sessions = 0; @@ -1205,6 +1190,12 @@ static void statserv_reset(void) { } +static void daemon_handler(void *data) +{ + IOCHAN *pListener = data; + iochan_event_loop(pListener); +} + static int statserv_sc_main(yaz_sc_t s, int argc, char **argv) { char sep; @@ -1233,128 +1224,38 @@ static int statserv_sc_main(yaz_sc_t s, int argc, char **argv) xml_config_bend_start(); + if (control_block.inetd) + { #ifdef WIN32 - xml_config_add_listeners(); - - yaz_log(log_server, "Starting server %s", me); - if (!pListener && *control_block.default_listen) - add_listener(control_block.default_listen, 0); + ; /* no inetd on Windows */ #else -/* UNIX */ - if (control_block.inetd) inetd_connection(control_block.default_proto); +#endif + } else { - static int hand[2]; - if (control_block.background) - { - /* create pipe so that parent waits until child has created - PID (or failed) */ - if (pipe(hand) < 0) - { - yaz_log(YLOG_FATAL|YLOG_ERRNO, "pipe"); - return 1; - } - switch (fork()) - { - case 0: - break; - case -1: - return 1; - default: - close(hand[1]); - while(1) - { - char dummy[1]; - int res = read(hand[0], dummy, 1); - if (res < 0 && yaz_errno() != EINTR) - { - yaz_log(YLOG_FATAL|YLOG_ERRNO, "read fork handshake"); - break; - } - else if (res >= 0) - break; - } - close(hand[0]); - _exit(0); - } - /* child */ - close(hand[0]); - if (setsid() < 0) - return 1; - - close(0); - close(1); - close(2); - open("/dev/null", O_RDWR); - if (dup(0) == -1) - return 1; - if (dup(0) == -1) - return 1; - } xml_config_add_listeners(); if (!pListener && *control_block.default_listen) add_listener(control_block.default_listen, 0); - - if (!pListener) - return 1; - - if (*control_block.pid_fname) - { - FILE *f = fopen(control_block.pid_fname, "w"); - if (!f) - { - yaz_log(YLOG_FATAL|YLOG_ERRNO, "Couldn't create %s", - control_block.pid_fname); - exit(0); - } - fprintf(f, "%ld", (long) getpid()); - fclose(f); - } - - if (control_block.background) - close(hand[1]); - - 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); - /* missing... */ -#endif +#ifndef WIN32 if (control_block.dynamic) signal(SIGCHLD, catchchld); - } - signal(SIGPIPE, SIG_IGN); - signal(SIGTERM, sigterm); - if (*control_block.setuid) - { - struct passwd *pw; - - if (!(pw = getpwnam(control_block.setuid))) - { - yaz_log(YLOG_FATAL, "%s: Unknown user", control_block.setuid); - return(1); - } - if (setuid(pw->pw_uid) < 0) - { - yaz_log(YLOG_FATAL|YLOG_ERRNO, "setuid"); - exit(1); - } - } -/* UNIX */ #endif + } if (pListener == NULL) return 1; if (s) yaz_sc_running(s); yaz_log(YLOG_DEBUG, "Entering event loop."); - return iochan_event_loop(&pListener); + + yaz_daemon(programname, + (control_block.background ? YAZ_DAEMON_FORK : 0), + daemon_handler, &pListener, + *control_block.pid_fname ? control_block.pid_fname : 0, + *control_block.setuid ? control_block.setuid : 0); + return 0; } static void option_copy(char *dst, const char *src) diff --git a/win/makefile b/win/makefile index 7933622..5405807 100644 --- a/win/makefile +++ b/win/makefile @@ -473,6 +473,7 @@ MISC_OBJS= \ $(OBJDIR)\srw.obj \ $(OBJDIR)\srwutil.obj \ $(OBJDIR)\zoom-c.obj \ + $(OBJDIR)\facet.obj \ $(OBJDIR)\zoom-opt.obj \ $(OBJDIR)\zoom-socket.obj \ $(OBJDIR)\initopt.obj \ @@ -544,7 +545,8 @@ Z3950_OBJS= \ $(OBJDIR)\prt-ext.obj \ $(OBJDIR)\z-charneg.obj \ $(OBJDIR)\z-mterm2.obj \ - $(OBJDIR)\z-oclcui.obj + $(OBJDIR)\z-oclcui.obj \ + $(OBJDIR)\z-facet-1.obj ILL_OBJS= \ $(OBJDIR)\ill-get.obj\ @@ -599,6 +601,10 @@ MTERM2_C_FILES = $(Z3950_C_DIR)\z-mterm2.c OCLCUI_H_FILES = $(INCLDIR)\yaz\z-oclcui.h OCLCUI_C_FILES = $(Z3950_C_DIR)\z-oclcui.c +# Files generated from facet.asn +FACET_H_FILES = $(INCLDIR)\yaz\z-facet-1.h +FACET_C_FILES = $(Z3950_C_DIR)\z-facet-1.c + # Files created from z3950v3.asn Z3950V3_H_FILES= \ $(INCLDIR)\yaz\z-accdes1.h \ @@ -653,6 +659,7 @@ ITEM_REQ_FILES= $(ITEM_REQ_C_FILES) $(ITEM_REQ_H_FILES) CHARNEG_FILES = $(CHARNEG_C_FILES) $(CHARNEG_H_FILES) MTERM2_FILES = $(MTERM2_C_FILES) $(MTERM2_H_FILES) OCLCUI_FILES = $(OCLCUI_C_FILES) $(OCLCUI_H_FILES) +FACET_FILES = $(FACET_C_FILES) $(FACET_H_FILES) GENERATED_C_FILES= \ $(Z3950V3_C_FILES) \ @@ -663,6 +670,7 @@ GENERATED_C_FILES= \ $(CHARNEG_C_FILES) \ $(MTERM2_C_FILES) \ $(OCLCUI_C_FILES) \ + $(FACET_C_FILES) \ $(ILL_CORE_C_FILES) \ $(ITEM_REQ_C_FILES) @@ -675,6 +683,7 @@ GENERATED_H_FILES= \ $(CHARNEG_H_FILES) \ $(MTERM2_H_FILES) \ $(OCLCUI_H_FILES) \ + $(FACET_H_FILES) \ $(ILL_CORE_H_FILES) \ $(ITEM_REQ_H_FILES) @@ -760,6 +769,11 @@ $(OCLCUI_FILES): $(SRCDIR)\oclcui.asn $(TCL) $(TCLOPT) -d z.tcl oclcui.asn @cd $(WINDIR) +$(FACET_FILES): $(SRCDIR)\facet.asn + @cd $(SRCDIR) + $(TCL) $(TCLOPT) -d z.tcl facet.asn + @cd $(WINDIR) + $(ILL_CORE_FILES): $(SRCDIR)\ill9702.asn @cd $(SRCDIR) $(TCL) $(TCLOPT) -d ill.tcl ill9702.asn diff --git a/ztest/ztest.c b/ztest/ztest.c index 6397831..50872a3 100644 --- a/ztest/ztest.c +++ b/ztest/ztest.c @@ -232,7 +232,7 @@ static void addterms(ODR odr, Z_FacetField *facet_field, const char *facet_name) int index; int freq = 100; int length = strlen(facet_name) + 10; - char key[length]; + char *key = odr_malloc(odr, length); key[0] = '\0'; for (index = 0; index < facet_field->num_terms; index++) { Z_Term *term;