1/*
2 *    Copyright (c) 2003, Derek Price and Ximbiot <http://ximbiot.com>
3 *
4 *    You may distribute under the terms of the GNU General Public License
5 *    as specified in the README file that comes with the CVS source
6 *    distribution.
7 *
8 * This is a convenience wrapper for some of the functions in lib/sighandle.c.
9 */
10#include <sys/cdefs.h>
11__RCSID("$NetBSD: exithandle.c,v 1.4 2016/05/17 14:00:09 christos Exp $");
12
13#include "cvs.h"
14
15/*
16 * Register a handler for all signals.
17 */
18void
19signals_register (RETSIGTYPE (*handler)(int))
20{
21#ifndef DONT_USE_SIGNALS
22#ifdef SIGABRT
23	(void) SIG_register (SIGABRT, handler);
24#endif
25#ifdef SIGHUP
26	(void) SIG_register (SIGHUP, handler);
27#endif
28#ifdef SIGINT
29	(void) SIG_register (SIGINT, handler);
30#endif
31#ifdef SIGQUIT
32	(void) SIG_register (SIGQUIT, handler);
33#endif
34#ifdef SIGPIPE
35	(void) signal (SIGPIPE, SIG_IGN);
36#endif
37#ifdef SIGTERM
38	(void) SIG_register (SIGTERM, handler);
39#endif
40#endif /* !DONT_USE_SIGNALS */
41}
42
43
44
45/*
46 * Register a handler for all signals and exit.
47 */
48void
49cleanup_register (void (*handler) (void))
50{
51    atexit (handler);
52
53    /* Always calling this function before any other exit handlers guarantees
54     * that signals will be blocked by the time the other exit handlers are
55     * called.
56     *
57     * SIG_beginCrSect will be called once for each handler registered via
58     * cleanup_register, but there is no unregister routine for atexit() and
59     * this seems like minimal overhead.
60     *
61     * There is no reason to unblock signals again when the exit handlers are
62     * done since the program will be exiting anyhow.
63     */
64    atexit (SIG_beginCrSect);
65}
66