Age Owner Branch data TLA Line data Source code
1 : : /*-------------------------------------------------------------------------
2 : : *
3 : : * legacy-pqsignal.c
4 : : * reliable BSD-style signal(2) routine stolen from RWW who stole it
5 : : * from Stevens...
6 : : *
7 : : * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
8 : : * Portions Copyright (c) 1994, Regents of the University of California
9 : : *
10 : : *
11 : : * IDENTIFICATION
12 : : * src/interfaces/libpq/legacy-pqsignal.c
13 : : *
14 : : *-------------------------------------------------------------------------
15 : : */
16 : : #include "postgres_fe.h"
17 : :
18 : : #include <signal.h>
19 : :
20 : :
21 : : /*
22 : : * This version of pqsignal() exists only because pre-9.3 releases
23 : : * of libpq exported pqsignal(), and some old client programs still
24 : : * depend on that. (Since 9.3, clients are supposed to get it from
25 : : * libpgport instead.)
26 : : *
27 : : * Because it is only intended for backwards compatibility, we freeze it
28 : : * with the semantics it had in 9.2; in particular, this has different
29 : : * behavior for SIGALRM than the version in src/port/pqsignal.c.
30 : : *
31 : : * libpq itself does not use this, nor does anything else in our code.
32 : : *
33 : : * src/include/port.h #define's pqsignal as pqsignal_fe or pqsignal_be,
34 : : * but here we want to export just plain "pqsignal". We can't rely on
35 : : * port.h's extern declaration either. (The point of those #define's
36 : : * is to ensure that no in-tree code accidentally calls this version.)
37 : : */
38 : : #undef pqsignal
39 : : extern pqsigfunc pqsignal(int signo, pqsigfunc func);
40 : :
41 : : pqsigfunc
2158 tgl@sss.pgh.pa.us 42 :UBC 0 : pqsignal(int signo, pqsigfunc func)
43 : : {
44 : : #ifndef WIN32
45 : : struct sigaction act,
46 : : oact;
47 : :
48 : 0 : act.sa_handler = func;
49 : 0 : sigemptyset(&act.sa_mask);
50 : 0 : act.sa_flags = 0;
51 [ # # ]: 0 : if (signo != SIGALRM)
52 : 0 : act.sa_flags |= SA_RESTART;
53 : : #ifdef SA_NOCLDSTOP
54 [ # # ]: 0 : if (signo == SIGCHLD)
55 : 0 : act.sa_flags |= SA_NOCLDSTOP;
56 : : #endif
57 [ # # ]: 0 : if (sigaction(signo, &act, &oact) < 0)
58 : 0 : return SIG_ERR;
59 : 0 : return oact.sa_handler;
60 : : #else /* WIN32 */
61 : : return signal(signo, func);
62 : : #endif
63 : : }
|