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 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 : }