2
Unix SMB/CIFS implementation.
3
signal handling functions
5
Copyright (C) Andrew Tridgell 1998
7
This program is free software; you can redistribute it and/or modify
8
it under the terms of the GNU General Public License as published by
9
the Free Software Foundation; either version 2 of the License, or
10
(at your option) any later version.
12
This program is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
GNU General Public License for more details.
17
You should have received a copy of the GNU General Public License
18
along with this program; if not, write to the Free Software
19
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24
/****************************************************************************
25
Catch child exits and reap the child zombie status.
26
****************************************************************************/
28
static void sig_cld(int signum)
30
while (sys_waitpid((pid_t)-1,(int *)NULL, WNOHANG) > 0)
34
* Turns out it's *really* important not to
35
* restore the signal handler here if we have real POSIX
36
* signal handling. If we do, then we get the signal re-delivered
37
* immediately - hey presto - instant loop ! JRA.
40
#if !defined(HAVE_SIGACTION)
41
CatchSignal(SIGCLD, sig_cld);
45
/****************************************************************************
46
catch child exits - leave status;
47
****************************************************************************/
49
static void sig_cld_leave_status(int signum)
52
* Turns out it's *really* important not to
53
* restore the signal handler here if we have real POSIX
54
* signal handling. If we do, then we get the signal re-delivered
55
* immediately - hey presto - instant loop ! JRA.
58
#if !defined(HAVE_SIGACTION)
59
CatchSignal(SIGCLD, sig_cld_leave_status);
63
/*******************************************************************
65
********************************************************************/
67
void BlockSignals(BOOL block,int signum)
69
#ifdef HAVE_SIGPROCMASK
72
sigaddset(&set,signum);
73
sigprocmask(block?SIG_BLOCK:SIG_UNBLOCK,&set,NULL);
74
#elif defined(HAVE_SIGBLOCK)
76
sigblock(sigmask(signum));
78
sigsetmask(siggetmask() & ~sigmask(signum));
81
/* yikes! This platform can't block signals? */
84
DEBUG(0,("WARNING: No signal blocking available\n"));
90
/*******************************************************************
91
Catch a signal. This should implement the following semantics:
93
1) The handler remains installed after being called.
94
2) The signal should be blocked during handler execution.
95
********************************************************************/
97
void (*CatchSignal(int signum,void (*handler)(int )))(int)
100
struct sigaction act;
101
struct sigaction oldact;
105
act.sa_handler = handler;
108
* We *want* SIGALRM to interrupt a system call.
110
if(signum != SIGALRM)
111
act.sa_flags = SA_RESTART;
113
sigemptyset(&act.sa_mask);
114
sigaddset(&act.sa_mask,signum);
115
sigaction(signum,&act,&oldact);
116
return oldact.sa_handler;
117
#else /* !HAVE_SIGACTION */
118
/* FIXME: need to handle sigvec and systems with broken signal() */
119
return signal(signum, handler);
123
/*******************************************************************
124
Ignore SIGCLD via whatever means is necessary for this OS.
125
********************************************************************/
127
void CatchChild(void)
129
CatchSignal(SIGCLD, sig_cld);
132
/*******************************************************************
133
Catch SIGCLD but leave the child around so it's status can be reaped.
134
********************************************************************/
136
void CatchChildLeaveStatus(void)
138
CatchSignal(SIGCLD, sig_cld_leave_status);