/* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2013 Index Data
+ * Copyright (C) Index Data
* See the file LICENSE for details.
*/
if (child_pid)
{
/* relay signal to child */
- child_got_signal_from_us = 1;
kill(child_pid, num);
}
}
-static void immediate_exit_handler(int num)
+static void log_reopen_handler(int num)
{
- _exit(0);
+ yaz_log_reopen();
+ if (child_pid)
+ kill(child_pid, num);
+}
+
+static void sigusr2_handler(int num)
+{
+ child_got_signal_from_us = 1;
}
static pid_t keepalive_pid = 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);
+ struct sigaction sa2, sa1;
keepalive_pid = getpid();
/* keep signals in their original state and make sure that some signals
to parent process also gets sent to the child.. */
- old_sighup = signal(SIGHUP, normal_stop_handler);
old_sigterm = signal(SIGTERM, normal_stop_handler);
old_sigusr1 = signal(SIGUSR1, normal_stop_handler);
- old_sigusr2 = signal(SIGUSR2, immediate_exit_handler);
+
+ sigemptyset(&sa2.sa_mask);
+ sa2.sa_handler = sigusr2_handler;
+ sa2.sa_flags = 0;
+ sigaction(SIGUSR2, &sa2, &sa1);
+
while (cont && !child_got_signal_from_us)
{
pid_t p = fork();
else if (p == 0)
{
/* child */
- signal(SIGHUP, old_sighup); /* restore */
signal(SIGTERM, old_sigterm);/* restore */
signal(SIGUSR1, old_sigusr1);/* restore */
- signal(SIGUSR2, old_sigusr2);/* restore */
+ sigaction(SIGUSR2, &sa1, NULL);
work(data);
exit(0);
/* disable signalling in kill_child_handler */
child_pid = 0;
+ if (p1 == (pid_t)(-1))
+ {
+ if (errno != EINTR)
+ {
+ yaz_log(YLOG_FATAL|YLOG_ERRNO, "waitpid");
+ break;
+ }
+ continue;
+ }
if (p1 != p)
{
yaz_log(YLOG_FATAL, "p1=%d != p=%d", p1, p);
- exit(1);
+ break;
}
-
if (WIFSIGNALED(status))
{
/* keep the child alive in case of errors, but _log_ */
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);
+ yaz_log(YLOG_LOG, "keepalive stop");
}
#endif
yaz_log(YLOG_FATAL, "%s: Unknown user", uid);
exit(1);
}
+ if (flags & YAZ_DAEMON_LOG_REOPEN)
+ {
+ FILE *f = yaz_log_file();
+ if (f)
+ {
+ if (fchown(fileno(f), pw->pw_uid, -1))
+ yaz_log(YLOG_WARN|YLOG_ERRNO, "fchown logfile");
+ }
+ }
if (setuid(pw->pw_uid) < 0)
{
yaz_log(YLOG_FATAL|YLOG_ERRNO, "setuid");
write_pidfile(pid_fd);
+ if (flags & YAZ_DAEMON_LOG_REOPEN)
+ {
+ signal(SIGHUP, log_reopen_handler);
+ }
if (flags & YAZ_DAEMON_KEEPALIVE)
{
keepalive(work, data);