2 * Copyright (c) 1999-2002 Sendmail, Inc. and its suppliers.
5 * By using this file, you agree to the terms and conditions set
6 * forth in the LICENSE file which can be found at the top level of
7 * the sendmail distribution.
12 SM_RCSID("@(#)$Id: signal.c,v 8.37 2002/03/23 00:55:19 ca Exp $")
14 #include "libmilter.h"
17 ** thread to handle signals
20 static smutex_t M_Mutex;
22 static int MilterStop = MILTER_CONT;
25 ** MI_STOP -- return value of MilterStop
31 ** value of MilterStop
40 ** MI_STOP_MILTERS -- set value of MilterStop
43 ** v -- new value for MilterStop.
53 (void) smutex_lock(&M_Mutex);
57 /* close listen socket */
59 (void) smutex_unlock(&M_Mutex);
62 ** MI_CLEAN_SIGNALS -- clean up signal handler thread
74 (void) smutex_destroy(&M_Mutex);
77 ** MI_SIGNAL_THREAD -- thread to deal with signals
80 ** name -- name of milter
87 mi_signal_thread(name)
94 sigaddset(&set, SIGHUP);
95 sigaddset(&set, SIGTERM);
97 /* Handle Ctrl-C gracefully for debugging */
98 sigaddset(&set, SIGINT);
104 #if defined(SOLARIS) || defined(__svr5__)
105 if ((sig = sigwait(&set)) < 0)
106 #else /* defined(SOLARIS) || defined(__svr5__) */
107 if (sigwait(&set, &sig) != 0)
108 #endif /* defined(SOLARIS) || defined(__svr5__) */
111 "%s: sigwait returned error: %d",
112 (char *)name, errno);
113 if (++errs > MAX_FAILS_T)
115 mi_stop_milters(MILTER_ABRT);
126 mi_stop_milters(MILTER_STOP);
129 mi_stop_milters(MILTER_ABRT);
133 "%s: sigwait returned unmasked signal: %d",
140 ** MI_SPAWN_SIGNAL_THREAD -- spawn thread to handle signals
143 ** name -- name of milter
146 ** MI_SUCCESS/MI_FAILURE
150 mi_spawn_signal_thread(name)
157 /* Mask HUP and KILL signals */
159 sigaddset(&set, SIGHUP);
160 sigaddset(&set, SIGTERM);
161 sigaddset(&set, SIGINT);
163 if (pthread_sigmask(SIG_BLOCK, &set, NULL) != 0)
166 "%s: Couldn't mask HUP and KILL signals", name);
169 r = thread_create(&tid, mi_signal_thread, (void *)name);
173 "%s: Couldn't start signal thread: %d",
180 ** MI_CONTROL_STARTUP -- startup for thread to handle signals
183 ** name -- name of milter
186 ** MI_SUCCESS/MI_FAILURE
190 mi_control_startup(name)
194 if (!smutex_init(&M_Mutex))
197 "%s: Couldn't initialize control pipe mutex", name);
202 ** spawn_signal_thread must happen before other threads are spawned
203 ** off so that it can mask the right signals and other threads
204 ** will inherit that mask.
206 if (mi_spawn_signal_thread(name) == MI_FAILURE)
209 "%s: Couldn't spawn signal thread", name);
210 (void) smutex_destroy(&M_Mutex);