X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fdaemon.c;h=7422599c89ce6d30d264a388f38e84d3173a97ba;hp=16f535705ec43c7ffabcbc359e4cb8254a7ccfcf;hb=9d12e94d17d3c31124221dc914aa36c9d8154643;hpb=4d95bcc1c92abde629616853b6a5d8e56444f5f3 diff --git a/src/daemon.c b/src/daemon.c index 16f5357..7422599 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2012 Index Data + * Copyright (C) Index Data * See the file LICENSE for details. */ @@ -83,13 +83,17 @@ static pid_t keepalive_pid = 0; static void keepalive(void (*work)(void *data), void *data) { + int no_sigill = 0; + int no_sigabrt = 0; + int no_sigsegv = 0; + int no_sigbus = 0; int run = 1; int cont = 1; void (*old_sighup)(int); void (*old_sigterm)(int); void (*old_sigusr1)(int); void (*old_sigusr2)(int); - + keepalive_pid = getpid(); /* keep signals in their original state and make sure that some signals @@ -115,25 +119,25 @@ static void keepalive(void (*work)(void *data), void *data) signal(SIGTERM, old_sigterm);/* restore */ signal(SIGUSR1, old_sigusr1);/* restore */ signal(SIGUSR2, old_sigusr2);/* restore */ - + work(data); exit(0); } - + /* enable signalling in kill_child_handler */ child_pid = p; - - p1 = wait(&status); - + + p1 = waitpid(p, &status, 0); + /* disable signalling in kill_child_handler */ child_pid = 0; - + if (p1 != p) { yaz_log(YLOG_FATAL, "p1=%d != p=%d", p1, p); exit(1); } - + if (WIFSIGNALED(status)) { /* keep the child alive in case of errors, but _log_ */ @@ -142,18 +146,22 @@ static void keepalive(void (*work)(void *data), void *data) case SIGILL: yaz_log(YLOG_WARN, "Received SIGILL from child %ld", (long) p); cont = 1; + no_sigill++; break; case SIGABRT: yaz_log(YLOG_WARN, "Received SIGABRT from child %ld", (long) p); cont = 1; + no_sigabrt++; break ; case SIGSEGV: yaz_log(YLOG_WARN, "Received SIGSEGV from child %ld", (long) p); cont = 1; + ++no_sigsegv; break; - case SIGBUS: + case SIGBUS: yaz_log(YLOG_WARN, "Received SIGBUS from child %ld", (long) p); cont = 1; + no_sigbus++; break; case SIGTERM: yaz_log(YLOG_LOG, "Received SIGTERM from child %ld", @@ -179,6 +187,14 @@ static void keepalive(void (*work)(void *data), void *data) sleep(1 + run/5); run++; } + if (no_sigill) + yaz_log(YLOG_WARN, "keepalive stop. %d SIGILL signal(s)", no_sigill); + if (no_sigabrt) + yaz_log(YLOG_WARN, "keepalive stop. %d SIGABRT signal(s)", no_sigabrt); + if (no_sigsegv) + yaz_log(YLOG_WARN, "keepalive stop. %d SIGSEGV signal(s)", no_sigsegv); + if (no_sigbus) + yaz_log(YLOG_WARN, "keepalive stop. %d SIGBUS signal(s)", no_sigbus); } #endif @@ -254,7 +270,7 @@ int yaz_daemon(const char *progname, } switch (fork()) { - case 0: + case 0: break; case -1: return 1; @@ -279,7 +295,7 @@ int yaz_daemon(const char *progname, close(hand[0]); if (setsid() < 0) return 1; - + close(0); close(1); close(2);