1 /*
2  * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
3  *	All rights reserved.
4  * Copyright (c) 1983, 1995-1997 Eric P. Allman.  All rights reserved.
5  * Copyright (c) 1988, 1993
6  *	The Regents of the University of California.  All rights reserved.
7  *
8  * By using this file, you agree to the terms and conditions set
9  * forth in the LICENSE file which can be found at the top level of
10  * the sendmail distribution.
11  *
12  *	$Id: signal.h,v 1.16 2001/07/20 19:48:21 gshapiro Exp $
13  */
14 
15 #pragma ident	"%Z%%M%	%I%	%E% SMI"
16 
17 /*
18 **  SIGNAL.H -- libsm (and sendmail) signal facilities
19 **		Extracted from sendmail/conf.h and focusing
20 **		on signal configuration.
21 */
22 
23 #ifndef SM_SIGNAL_H
24 #define SM_SIGNAL_H 1
25 
26 #include <sys/types.h>
27 #include <limits.h>
28 #include <signal.h>
29 #include <sm/cdefs.h>
30 #include <sm/conf.h>
31 
32 /*
33 **  Critical signal sections
34 */
35 
36 #define PEND_SIGHUP	0x0001
37 #define PEND_SIGINT	0x0002
38 #define PEND_SIGTERM	0x0004
39 #define PEND_SIGUSR1	0x0008
40 
41 #define ENTER_CRITICAL()	InCriticalSection++
42 
43 #define LEAVE_CRITICAL()						\
44 do									\
45 {									\
46 	if (InCriticalSection > 0)					\
47 		InCriticalSection--;					\
48 } while (0)
49 
50 #define CHECK_CRITICAL(sig)						\
51 do									\
52 {									\
53 	if (InCriticalSection > 0 && (sig) != 0)			\
54 	{								\
55 		pend_signal((sig));					\
56 		return SIGFUNC_RETURN;					\
57 	}								\
58 } while (0)
59 
60 /* variables */
61 extern unsigned int	volatile InCriticalSection;	/* >0 if in critical section */
62 extern int		volatile PendingSignal;	/* pending signal to resend */
63 
64 /* functions */
65 extern void		pend_signal __P((int));
66 
67 /* reset signal in case System V semantics */
68 #ifdef SYS5SIGNALS
69 # define FIX_SYSV_SIGNAL(sig, handler)					\
70 {									\
71 	if ((sig) != 0)							\
72 		(void) sm_signal((sig), (handler));			\
73 }
74 #else /* SYS5SIGNALS */
75 # define FIX_SYSV_SIGNAL(sig, handler)	{ /* EMPTY */ }
76 #endif /* SYS5SIGNALS */
77 
78 extern void		sm_allsignals __P((bool));
79 extern int		sm_blocksignal __P((int));
80 extern int		sm_releasesignal __P((int));
81 extern sigfunc_t	sm_signal __P((int, sigfunc_t));
82 extern SIGFUNC_DECL	sm_signal_noop __P((int));
83 #endif /* SM_SIGNAL_H */
84