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-2024, 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. 32 : */ 33 : pqsigfunc 34 77134 : pqsignal(int signo, pqsigfunc func) 35 : { 36 : #ifndef WIN32 37 : struct sigaction act, 38 : oact; 39 : 40 77134 : act.sa_handler = func; 41 77134 : sigemptyset(&act.sa_mask); 42 77134 : act.sa_flags = 0; 43 77134 : if (signo != SIGALRM) 44 58804 : act.sa_flags |= SA_RESTART; 45 : #ifdef SA_NOCLDSTOP 46 77134 : if (signo == SIGCHLD) 47 18944 : act.sa_flags |= SA_NOCLDSTOP; 48 : #endif 49 77134 : if (sigaction(signo, &act, &oact) < 0) 50 0 : return SIG_ERR; 51 77134 : return oact.sa_handler; 52 : #else /* WIN32 */ 53 : return signal(signo, func); 54 : #endif 55 : }