]>
git.ipfire.org Git - thirdparty/squid.git/blob - tools/purge/signal.cc
2ccb0cf0d6a7dbbc64dc2836b57abca6b99be5db
2 * Copyright (C) 1996-2016 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
9 // Author: Jens-S. V?ckler <voeckler@rvs.uni-hannover.de>
11 // Date: Sat Feb 28 1998
12 // Compiler: gcc 2.7.2.x series
14 // Books: W. Richard Steven, "Advanced Programming in the UNIX Environment",
15 // Addison-Wesley, 1992.
17 // (c) 1998 Lehrgebiet Rechnernetze und Verteilte Systeme
18 // Universit?t Hannover, Germany
20 // Permission to use, copy, modify, distribute, and sell this software
21 // and its documentation for any purpose is hereby granted without fee,
22 // provided that (i) the above copyright notices and this permission
23 // notice appear in all copies of the software and related documentation,
24 // and (ii) the names of the Lehrgebiet Rechnernetze und Verteilte
25 // Systeme and the University of Hannover may not be used in any
26 // advertising or publicity relating to the software without the
27 // specific, prior written permission of Lehrgebiet Rechnernetze und
28 // Verteilte Systeme and the University of Hannover.
30 // THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
31 // EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
32 // WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
34 // IN NO EVENT SHALL THE LEHRGEBIET RECHNERNETZE UND VERTEILTE SYSTEME OR
35 // THE UNIVERSITY OF HANNOVER BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
36 // INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
37 // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT
38 // ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY,
39 // ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
42 // Revision 1.3 1999/01/19 13:11:52 cached
43 // adaptations necessary for AIX.
45 // Revision 1.2 1999/01/19 11:00:50 voeckler
46 // added psignal(int,const char*) compatibility function.
48 // Revision 1.1 1998/08/13 21:51:58 voeckler
62 Signal( int signo
, SigFunc
* newhandler
, bool doInterrupt
)
63 // purpose: install reliable signals
64 // paramtr: signo (IN): signal for which a handler is to be installed
65 // newhandler (IN): function pointer to the signal handler
66 // doInterrupt (IN): interrupted system calls wanted!
67 // returns: the old signal handler, or SIG_ERR in case of error.
69 struct sigaction action
, old
;
71 memset( &old
, 0, sizeof(old
) );
72 memset( &action
, 0, sizeof(action
) );
74 // action.sa_handler = newhandler; I HATE TYPE-OVERCORRECTNESS !
75 memmove( &action
.sa_handler
, &newhandler
, sizeof(SigFunc
*) );
76 sigemptyset( &action
.sa_mask
);
78 if ( signo
== SIGCHLD
) {
79 action
.sa_flags
|= SA_NOCLDSTOP
;
82 action
.sa_flags
|= SA_NODEFER
; // SYSV: don't block current signal
86 if ( signo
== SIGALRM
|| doInterrupt
) {
88 action
.sa_flags
|= SA_INTERRUPT
; // SunOS, obsoleted by POSIX
92 action
.sa_flags
|= SA_RESTART
; // BSD, SVR4
96 return ( sigaction( signo
, &action
, &old
) < 0 ) ?
98 (SigFunc
*) old
.sa_handler
;
102 sigChild( int signo
)
103 // purpose: supply ad hoc child handler with output on stderr
104 // paramtr: signo (IN): == SIGCHLD
105 // returns: only if OS uses a return type for signal handler
106 // seealso: Stevens, UNP, figure 5.11 *and* Stevens, APUE, figure 8.3
109 int status
= signo
; // to stop GNU from complaining...
112 while ( (pid
= waitpid( -1, &status
, WNOHANG
)) > 0 ) {
113 if ( WIFEXITED(status
) ) {
114 fprintf( stderr
, "child (pid=%ld) reaped, status %d\n%c",
115 (long) pid
, WEXITSTATUS(status
), 0 );
116 } else if ( WIFSIGNALED(status
) ) {
117 fprintf( stderr
, "child (pid=%ld) died on signal %d%s\n%c",
118 (long) pid
, WTERMSIG(status
),
120 WCOREDUMP(status
) ? " (core generated)" : "",
126 fprintf( stderr
, "detected dead child (pid=%ld), status %d\n%c",
127 (long) pid
, status
, 0 );
132 #if SIGRETTYPE != void