PostgreSQL Source Code git master
legacy-pqsignal.c
Go to the documentation of this file.
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
39extern pqsigfunc pqsignal(int signo, pqsigfunc func);
40
42pqsignal(int signo, pqsigfunc func)
43{
44#ifndef WIN32
45 struct sigaction act,
46 oact;
47
48 act.sa_handler = func;
49 sigemptyset(&act.sa_mask);
50 act.sa_flags = 0;
51 if (signo != SIGALRM)
52 act.sa_flags |= SA_RESTART;
53#ifdef SA_NOCLDSTOP
54 if (signo == SIGCHLD)
55 act.sa_flags |= SA_NOCLDSTOP;
56#endif
57 if (sigaction(signo, &act, &oact) < 0)
58 return SIG_ERR;
59 return oact.sa_handler;
60#else /* WIN32 */
61 return signal(signo, func);
62#endif
63}
pqsigfunc pqsignal(int signo, pqsigfunc func)
void(* pqsigfunc)(SIGNAL_ARGS)
Definition: port.h:523
#define SIGCHLD
Definition: win32_port.h:168
#define SIGALRM
Definition: win32_port.h:164