]> jfr.im git - solanum.git/blame - ircd/ircd_signal.c
ircd/authproc.c: avoid crash on lack of any configured DNSBLs
[solanum.git] / ircd / ircd_signal.c
CommitLineData
212380e3
AC
1/************************************************************************
2 * IRC - Internet Relay Chat, src/ircd_signal.c
3 * Copyright (C) 1990 Jarkko Oikarinen and
4 * University of Oulu, Computing Center
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 1, or (at your option)
9 * any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
212380e3
AC
19 */
20
21#include "stdinc.h"
22#include "ircd_signal.h"
23#include "ircd.h" /* dorehash */
24#include "restart.h" /* server_reboot */
4016731b 25#include "logger.h"
212380e3
AC
26#include "s_conf.h"
27#include "client.h"
28#include "send.h"
4f5056dd
AC
29#include <sys/types.h>
30#include <sys/wait.h>
31
212380e3
AC
32/*
33 * dummy_handler - don't know if this is really needed but if alarm is still
34 * being used we probably will
35 */
36static void
37dummy_handler(int sig)
38{
39 /* Empty */
40}
41
42
43static void
44sigchld_handler(int sig)
45{
3eabb958
JT
46 int status, olderrno;
47
48 olderrno = errno;
49 while (waitpid(-1, &status, WNOHANG) > 0)
50 ;
51 errno = olderrno;
212380e3 52}
3eabb958 53
212380e3
AC
54/*
55 * sigterm_handler - exit the server
56 */
e8399195
AJ
57static void
58sigterm_handler(int sig) __attribute__((noreturn));
59
212380e3
AC
60static void
61sigterm_handler(int sig)
62{
fd5af3d0 63 ircd_shutdown("Received SIGTERM");
212380e3
AC
64}
65
55abcbb2 66/*
212380e3
AC
67 * sighup_handler - reread the server configuration
68 */
69static void
70sighup_handler(int sig)
71{
1b916de5 72 dorehash = true;
212380e3
AC
73}
74
75/*
76 * sigusr1_handler - reread the motd file
77 */
78static void
79sigusr1_handler(int sig)
80{
1b916de5 81 doremotd = true;
212380e3
AC
82}
83
84static void
85sigusr2_handler(int sig)
86{
1b916de5 87 dorehashbans = true;
212380e3
AC
88}
89
90/*
91 * sigint_handler - restart the server
92 */
93static void
94sigint_handler(int sig)
95{
1b916de5 96 static bool restarting = false;
212380e3
AC
97
98 if(server_state_foreground)
99 {
100 ilog(L_MAIN, "Server exiting on SIGINT");
101 exit(0);
102 }
103 else
104 {
105 ilog(L_MAIN, "Server Restarting on SIGINT");
1b916de5 106 if(!restarting)
212380e3 107 {
1b916de5 108 restarting = true;
212380e3
AC
109 server_reboot();
110 }
111 }
112}
113
114/*
115 * setup_signals - initialize signal handlers for server
116 */
117void
118setup_signals()
119{
f8904200 120 sigset_t sigs;
212380e3
AC
121 struct sigaction act;
122
f8904200 123 sigemptyset(&sigs);
212380e3
AC
124 act.sa_flags = 0;
125 act.sa_handler = SIG_IGN;
126 sigemptyset(&act.sa_mask);
127 sigaddset(&act.sa_mask, SIGPIPE);
128 sigaddset(&act.sa_mask, SIGALRM);
129#ifdef SIGTRAP
130 sigaddset(&act.sa_mask, SIGTRAP);
131#endif
132
133# ifdef SIGWINCH
134 sigaddset(&act.sa_mask, SIGWINCH);
135 sigaction(SIGWINCH, &act, 0);
136# endif
137 sigaction(SIGPIPE, &act, 0);
138#ifdef SIGTRAP
139 sigaction(SIGTRAP, &act, 0);
140#endif
141
142 act.sa_handler = dummy_handler;
143 sigaction(SIGALRM, &act, 0);
f8904200 144 sigaddset(&sigs, SIGALRM);
212380e3
AC
145
146 act.sa_handler = sighup_handler;
147 sigemptyset(&act.sa_mask);
148 sigaddset(&act.sa_mask, SIGHUP);
149 sigaction(SIGHUP, &act, 0);
f8904200 150 sigaddset(&sigs, SIGHUP);
212380e3
AC
151
152 act.sa_handler = sigint_handler;
153 sigaddset(&act.sa_mask, SIGINT);
154 sigaction(SIGINT, &act, 0);
f8904200 155 sigaddset(&sigs, SIGINT);
212380e3
AC
156
157 act.sa_handler = sigterm_handler;
158 sigaddset(&act.sa_mask, SIGTERM);
159 sigaction(SIGTERM, &act, 0);
f8904200 160 sigaddset(&sigs, SIGTERM);
212380e3
AC
161
162 act.sa_handler = sigusr1_handler;
163 sigaddset(&act.sa_mask, SIGUSR1);
164 sigaction(SIGUSR1, &act, 0);
f8904200 165 sigaddset(&sigs, SIGUSR1);
212380e3
AC
166
167 act.sa_handler = sigusr2_handler;
168 sigaddset(&act.sa_mask, SIGUSR2);
169 sigaction(SIGUSR2, &act, 0);
f8904200 170 sigaddset(&sigs, SIGUSR2);
212380e3
AC
171
172 act.sa_handler = sigchld_handler;
173 sigaddset(&act.sa_mask, SIGCHLD);
174 sigaction(SIGCHLD, &act, 0);
f8904200 175 sigaddset(&sigs, SIGCHLD);
212380e3 176
f8904200 177 sigprocmask(SIG_UNBLOCK, &sigs, NULL);
212380e3 178}