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 <sys/types.h>
#include <pwd.h>
#endif
+#if HAVE_SYS_PRCTL_H
+#include <sys/prctl.h>
+#endif
+
#include <yaz/daemon.h>
#include <yaz/log.h>
#include <yaz/snprintf.h>
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)
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));
{
if (yaz_errno() == EINTR)
{
- if (statserv_must_terminate())
- {
- for (p = *iochans; p; p = p->next)
- p->force_event = EVENT_TIMEOUT;
- }
xfree(fds);
continue;
}
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;
}
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);
#include "eventl.h"
#include "session.h"
#include <yaz/statserv.h>
+#include <yaz/daemon.h>
static IOCHAN pListener = NULL;
}
}
-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)
{
}
xml_config_close();
}
-void sigterm(int sig)
-{
- term_flag = 1;
-}
-
static void *new_session(void *vp);
static int no_sessions = 0;
{
}
+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;
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)
$(OBJDIR)\srw.obj \
$(OBJDIR)\srwutil.obj \
$(OBJDIR)\zoom-c.obj \
+ $(OBJDIR)\facet.obj \
$(OBJDIR)\zoom-opt.obj \
$(OBJDIR)\zoom-socket.obj \
$(OBJDIR)\initopt.obj \
$(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\
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 \
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) \
$(CHARNEG_C_FILES) \
$(MTERM2_C_FILES) \
$(OCLCUI_C_FILES) \
+ $(FACET_C_FILES) \
$(ILL_CORE_C_FILES) \
$(ITEM_REQ_C_FILES)
$(CHARNEG_H_FILES) \
$(MTERM2_H_FILES) \
$(OCLCUI_H_FILES) \
+ $(FACET_H_FILES) \
$(ILL_CORE_H_FILES) \
$(ITEM_REQ_H_FILES)
$(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
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;