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-2026, 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
42 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 : }
|