Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * pqsignal.c
4 : * reliable BSD-style signal(2) routine stolen from RWW who stole it
5 : * from Stevens...
6 : *
7 : * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
8 : * Portions Copyright (c) 1994, Regents of the University of California
9 : *
10 : *
11 : * IDENTIFICATION
12 : * src/port/pqsignal.c
13 : *
14 : * We now assume that all Unix-oid systems have POSIX sigaction(2)
15 : * with support for restartable signals (SA_RESTART). We used to also
16 : * support BSD-style signal(2), but there really shouldn't be anything
17 : * out there anymore that doesn't have the POSIX API.
18 : *
19 : * Windows, of course, is resolutely in a class by itself. In the backend,
20 : * we don't use this file at all; src/backend/port/win32/signal.c provides
21 : * pqsignal() for the backend environment. Frontend programs can use
22 : * this version of pqsignal() if they wish, but beware that this does
23 : * not provide restartable signals on Windows.
24 : *
25 : * ------------------------------------------------------------------------
26 : */
27 :
28 : #include "c.h"
29 :
30 : #include <signal.h>
31 :
32 : #if !defined(WIN32) || defined(FRONTEND)
33 :
34 : /*
35 : * Set up a signal handler, with SA_RESTART, for signal "signo"
36 : *
37 : * Returns the previous handler.
38 : */
39 : pqsigfunc
40 4585 : pqsignal(int signo, pqsigfunc func)
41 : {
42 : #ifndef WIN32
43 : struct sigaction act,
44 : oact;
45 :
46 4585 : act.sa_handler = func;
47 4585 : sigemptyset(&act.sa_mask);
48 4585 : act.sa_flags = SA_RESTART;
49 : #ifdef SA_NOCLDSTOP
50 4585 : if (signo == SIGCHLD)
51 342 : act.sa_flags |= SA_NOCLDSTOP;
52 : #endif
53 4585 : if (sigaction(signo, &act, &oact) < 0)
54 0 : return SIG_ERR;
55 4585 : return oact.sa_handler;
56 : #else /* WIN32 */
57 : return signal(signo, func);
58 : #endif
59 : }
60 :
61 : /*
62 : * Set up a signal handler, without SA_RESTART, for signal "signo"
63 : *
64 : * Returns the previous handler.
65 : *
66 : * On Windows, this would be identical to pqsignal(), so don't bother.
67 : */
68 : #ifndef WIN32
69 :
70 : pqsigfunc
71 7 : pqsignal_no_restart(int signo, pqsigfunc func)
72 : {
73 : struct sigaction act,
74 : oact;
75 :
76 7 : act.sa_handler = func;
77 7 : sigemptyset(&act.sa_mask);
78 7 : act.sa_flags = 0;
79 : #ifdef SA_NOCLDSTOP
80 7 : if (signo == SIGCHLD)
81 1 : act.sa_flags |= SA_NOCLDSTOP;
82 : #endif
83 7 : if (sigaction(signo, &act, &oact) < 0)
84 0 : return SIG_ERR;
85 7 : return oact.sa_handler;
86 : }
87 :
88 : #endif /* !WIN32 */
89 :
90 : #endif /* !defined(WIN32) || defined(FRONTEND) */
|