diff options
| author | cvs2svn <cvs2svn@FreeBSD.org> | 2005-06-14 02:23:15 +0000 | 
|---|---|---|
| committer | cvs2svn <cvs2svn@FreeBSD.org> | 2005-06-14 02:23:15 +0000 | 
| commit | a3949f0034fc918cf70aad34a7a26fc5dbe25af2 (patch) | |
| tree | 478650075bb5f29f06f2042ebbbcf9f386e2bff5 /contrib/sendmail/libmilter/signal.c | |
| parent | 0c97652c0b3dbc161167bac72bd860ec7d0f48ab (diff) | |
Diffstat (limited to 'contrib/sendmail/libmilter/signal.c')
| -rw-r--r-- | contrib/sendmail/libmilter/signal.c | 221 | 
1 files changed, 0 insertions, 221 deletions
| diff --git a/contrib/sendmail/libmilter/signal.c b/contrib/sendmail/libmilter/signal.c deleted file mode 100644 index d55ab57e9b56..000000000000 --- a/contrib/sendmail/libmilter/signal.c +++ /dev/null @@ -1,221 +0,0 @@ -/* - *  Copyright (c) 1999-2004 Sendmail, Inc. and its suppliers. - *	All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#include <sm/gen.h> -SM_RCSID("@(#)$Id: signal.c,v 8.42 2004/08/20 21:10:30 ca Exp $") - -#include "libmilter.h" - -/* -**  thread to handle signals -*/ - -static smutex_t M_Mutex; - -static int MilterStop = MILTER_CONT; - -static void	*mi_signal_thread __P((void *)); -static int	 mi_spawn_signal_thread __P((char *)); - -/* -**  MI_STOP -- return value of MilterStop -** -**	Parameters: -**		none. -** -**	Returns: -**		value of MilterStop -*/ - -int -mi_stop() -{ -	return MilterStop; -} -/* -**  MI_STOP_MILTERS -- set value of MilterStop -** -**	Parameters: -**		v -- new value for MilterStop. -** -**	Returns: -**		none. -*/ - -void -mi_stop_milters(v) -	int v; -{ -	(void) smutex_lock(&M_Mutex); -	if (MilterStop < v) -		MilterStop = v; - -	/* close listen socket */ -	mi_closener(); -	(void) smutex_unlock(&M_Mutex); -} -/* -**  MI_CLEAN_SIGNALS -- clean up signal handler thread -** -**	Parameters: -**		none. -** -**	Returns: -**		none. -*/ - -void -mi_clean_signals() -{ -	(void) smutex_destroy(&M_Mutex); -} -/* -**  MI_SIGNAL_THREAD -- thread to deal with signals -** -**	Parameters: -**		name -- name of milter -** -**	Returns: -**		NULL -*/ - -static void * -mi_signal_thread(name) -	void *name; -{ -	int sig, errs; -	sigset_t set; - -	(void) sigemptyset(&set); -	(void) sigaddset(&set, SIGHUP); -	(void) sigaddset(&set, SIGTERM); - -	/* Handle Ctrl-C gracefully for debugging */ -	(void) sigaddset(&set, SIGINT); -	errs = 0; - -	for (;;) -	{ -		sig = 0; -#if defined(SOLARIS) || defined(__svr5__) -		if ((sig = sigwait(&set)) < 0) -#else /* defined(SOLARIS) || defined(__svr5__) */ -		if (sigwait(&set, &sig) != 0) -#endif /* defined(SOLARIS) || defined(__svr5__) */ -		{ -			/* this can happen on OSF/1 (at least) */ -			if (errno == EINTR) -				continue; -			smi_log(SMI_LOG_ERR, -				"%s: sigwait returned error: %d", -				(char *)name, errno); -			if (++errs > MAX_FAILS_T) -			{ -				mi_stop_milters(MILTER_ABRT); -				return NULL; -			} -			continue; -		} -		errs = 0; - -		switch (sig) -		{ -		  case SIGHUP: -		  case SIGTERM: -			mi_stop_milters(MILTER_STOP); -			return NULL; -		  case SIGINT: -			mi_stop_milters(MILTER_ABRT); -			return NULL; -		  default: -			smi_log(SMI_LOG_ERR, -				"%s: sigwait returned unmasked signal: %d", -				(char *)name, sig); -			break; -		} -	} -	/* NOTREACHED */ -} -/* -**  MI_SPAWN_SIGNAL_THREAD -- spawn thread to handle signals -** -**	Parameters: -**		name -- name of milter -** -**	Returns: -**		MI_SUCCESS/MI_FAILURE -*/ - -static int -mi_spawn_signal_thread(name) -	char *name; -{ -	sthread_t tid; -	int r; -	sigset_t set; - -	/* Mask HUP and KILL signals */ -	(void) sigemptyset(&set); -	(void) sigaddset(&set, SIGHUP); -	(void) sigaddset(&set, SIGTERM); -	(void) sigaddset(&set, SIGINT); - -	if (pthread_sigmask(SIG_BLOCK, &set, NULL) != 0) -	{ -		smi_log(SMI_LOG_ERR, -			"%s: Couldn't mask HUP and KILL signals", name); -		return MI_FAILURE; -	} -	r = thread_create(&tid, mi_signal_thread, (void *)name); -	if (r != 0) -	{ -		smi_log(SMI_LOG_ERR, -			"%s: Couldn't start signal thread: %d", -			name, r); -		return MI_FAILURE; -	} -	return MI_SUCCESS; -} -/* -**  MI_CONTROL_STARTUP -- startup for thread to handle signals -** -**	Parameters: -**		name -- name of milter -** -**	Returns: -**		MI_SUCCESS/MI_FAILURE -*/ - -int -mi_control_startup(name) -	char *name; -{ - -	if (!smutex_init(&M_Mutex)) -	{ -		smi_log(SMI_LOG_ERR, -			"%s: Couldn't initialize control pipe mutex", name); -		return MI_FAILURE; -	} - -	/* -	**  spawn_signal_thread must happen before other threads are spawned -	**  off so that it can mask the right signals and other threads -	**  will inherit that mask. -	*/ -	if (mi_spawn_signal_thread(name) == MI_FAILURE) -	{ -		smi_log(SMI_LOG_ERR, -			"%s: Couldn't spawn signal thread", name); -		(void) smutex_destroy(&M_Mutex); -		return MI_FAILURE; -	} -	return MI_SUCCESS; -} | 
