/************************************************************************ * IRC - Internet Relay Chat, ircd/ircd_signal.c * Copyright (C) 1990 Jarkko Oikarinen and * University of Oulu, Computing Center * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 1, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: ircd_signal.c,v 1.2 2003/10/07 17:34:40 chourf Exp $ */ #include "os.h" #include "s_defines.h" #define IRCD_SIGNAL_C #include "s_externs.h" #undef IRCD_SIGNAL_C RETSIGTYPE s_die(s) int s; { #ifdef USE_SYSLOG (void)syslog(LOG_CRIT, "Server Killed By SIGTERM"); (void)closelog(); #endif logfiles_close(); ircd_writetune(tunefile); flush_connections(me.fd); exit(-1); } #if defined(USE_IAUTH) RETSIGTYPE s_slave(s) int s; { # if POSIX_SIGNALS struct sigaction act; act.sa_handler = s_slave; act.sa_flags = 0; (void)sigemptyset(&act.sa_mask); (void)sigaddset(&act.sa_mask, SIGUSR1); (void)sigaction(SIGUSR1, &act, NULL); # else (void)signal(SIGUSR1, s_slave); # endif restart_iauth = 1; } #endif RETSIGTYPE s_rehash(s) int s; { #if POSIX_SIGNALS struct sigaction act; act.sa_handler = s_rehash; act.sa_flags = 0; (void)sigemptyset(&act.sa_mask); (void)sigaddset(&act.sa_mask, SIGHUP); (void)sigaction(SIGHUP, &act, NULL); #else (void)signal(SIGHUP, s_rehash); /* sysV -argv */ #endif dorehash = 1; } RETSIGTYPE s_restart(s) int s; { /* * TODO: logging here */ dorestart = 1; } RETSIGTYPE dummy(s) int s; { #ifndef HAVE_RELIABLE_SIGNALS (void)signal(SIGALRM, dummy); (void)signal(SIGPIPE, dummy); # ifndef HPUX /* Only 9k/800 series require this, but don't know how to.. */ # ifdef SIGWINCH (void)signal(SIGWINCH, dummy); # endif # endif #else # if POSIX_SIGNALS struct sigaction act; act.sa_handler = dummy; act.sa_flags = 0; (void)sigemptyset(&act.sa_mask); (void)sigaddset(&act.sa_mask, SIGALRM); (void)sigaddset(&act.sa_mask, SIGPIPE); # ifdef SIGWINCH (void)sigaddset(&act.sa_mask, SIGWINCH); # endif (void)sigaction(SIGALRM, &act, (struct sigaction *)NULL); (void)sigaction(SIGPIPE, &act, (struct sigaction *)NULL); # ifdef SIGWINCH (void)sigaction(SIGWINCH, &act, (struct sigaction *)NULL); # endif # endif #endif } void restore_sigchld() { #if POSIX_SIGNALS struct sigaction act; act.sa_handler = SIG_DFL; act.sa_flags = 0; (void)sigemptyset(&act.sa_mask); (void)sigaddset(&act.sa_mask, SIGCHLD); (void)sigaction(SIGCHLD, &act, NULL); #else /* POSIX_SIGNALS */ (void)signal(SIGCHLD, SIG_DFL); #endif /* POSIX_SIGNALS */ } void setup_signals() { #if POSIX_SIGNALS struct sigaction act; act.sa_handler = SIG_IGN; act.sa_flags = 0; (void)sigemptyset(&act.sa_mask); (void)sigaddset(&act.sa_mask, SIGPIPE); (void)sigaddset(&act.sa_mask, SIGALRM); # ifdef SIGWINCH (void)sigaddset(&act.sa_mask, SIGWINCH); (void)sigaction(SIGWINCH, &act, NULL); # endif (void)sigaction(SIGPIPE, &act, NULL); act.sa_handler = dummy; (void)sigaction(SIGALRM, &act, NULL); act.sa_handler = s_rehash; (void)sigemptyset(&act.sa_mask); (void)sigaddset(&act.sa_mask, SIGHUP); (void)sigaction(SIGHUP, &act, NULL); act.sa_handler = s_restart; (void)sigaddset(&act.sa_mask, SIGINT); (void)sigaction(SIGINT, &act, NULL); act.sa_handler = s_die; (void)sigaddset(&act.sa_mask, SIGTERM); (void)sigaction(SIGTERM, &act, NULL); # if defined(USE_IAUTH) act.sa_handler = s_slave; (void)sigaddset(&act.sa_mask, SIGUSR1); (void)sigaction(SIGUSR1, &act, NULL); act.sa_handler = SIG_IGN; # ifdef SA_NOCLDWAIT act.sa_flags = SA_NOCLDWAIT; # else act.sa_flags = 0; # endif (void)sigaddset(&act.sa_mask, SIGCHLD); (void)sigaction(SIGCHLD, &act, NULL); # endif #else /* POSIX_SIGNALS */ # ifndef HAVE_RELIABLE_SIGNALS (void)signal(SIGPIPE, dummy); # ifdef SIGWINCH (void)signal(SIGWINCH, dummy); # endif # else /* HAVE_RELIABLE_SIGNALS */ # ifdef SIGWINCH (void)signal(SIGWINCH, SIG_IGN); # endif (void)signal(SIGPIPE, SIG_IGN); # endif /* HAVE_RELIABLE_SIGNALS */ (void)signal(SIGALRM, dummy); (void)signal(SIGHUP, s_rehash); (void)signal(SIGTERM, s_die); (void)signal(SIGINT, s_restart); # if defined(USE_IAUTH) (void)signal(SIGUSR1, s_slave); (void)signal(SIGCHLD, SIG_IGN); # endif #endif /* POSIX_SIGNAL */ #ifdef RESTARTING_SYSTEMCALLS /* ** At least on Apollo sr10.1 it seems continuing system calls ** after signal is the default. The following 'siginterrupt' ** should change that default to interrupting calls. */ (void)siginterrupt(SIGALRM, 1); #endif }