1996-07-09 08:22:35 +02:00
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
*
|
1999-02-14 00:22:53 +01:00
|
|
|
* pqsignal.c
|
1997-09-07 07:04:48 +02:00
|
|
|
* reliable BSD-style signal(2) routine stolen from RWW who stole it
|
|
|
|
* from Stevens...
|
1996-07-09 08:22:35 +02:00
|
|
|
*
|
2001-01-24 20:43:33 +01:00
|
|
|
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
|
2000-01-26 06:58:53 +01:00
|
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
1996-07-09 08:22:35 +02:00
|
|
|
*
|
|
|
|
*
|
|
|
|
* IDENTIFICATION
|
2001-01-24 20:43:33 +01:00
|
|
|
* $Header: /cvsroot/pgsql/src/backend/libpq/pqsignal.c,v 1.18 2001/01/24 19:42:56 momjian Exp $
|
1996-07-09 08:22:35 +02:00
|
|
|
*
|
|
|
|
* NOTES
|
1997-09-07 07:04:48 +02:00
|
|
|
* This shouldn't be in libpq, but the monitor and some other
|
|
|
|
* things need it...
|
1996-07-09 08:22:35 +02:00
|
|
|
*
|
1997-09-07 07:04:48 +02:00
|
|
|
* A NOTE ABOUT SIGNAL HANDLING ACROSS THE VARIOUS PLATFORMS.
|
1996-11-18 03:25:09 +01:00
|
|
|
*
|
2000-06-11 13:40:09 +02:00
|
|
|
* config.h defines the macro HAVE_POSIX_SIGNALS for some platforms and
|
1997-09-07 07:04:48 +02:00
|
|
|
* not for others. This file and pqsignal.h use that macro to decide
|
|
|
|
* how to handle signalling.
|
1996-11-18 03:25:09 +01:00
|
|
|
*
|
1997-09-07 07:04:48 +02:00
|
|
|
* signal(2) handling - this is here because it affects some of
|
|
|
|
* the frontend commands as well as the backend server.
|
|
|
|
*
|
|
|
|
* Ultrix and SunOS provide BSD signal(2) semantics by default.
|
|
|
|
*
|
|
|
|
* SVID2 and POSIX signal(2) semantics differ from BSD signal(2)
|
|
|
|
* semantics. We can use the POSIX sigaction(2) on systems that
|
|
|
|
* allow us to request restartable signals (SA_RESTART).
|
|
|
|
*
|
|
|
|
* Some systems don't allow restartable signals at all unless we
|
|
|
|
* link to a special BSD library.
|
|
|
|
*
|
|
|
|
* We devoutly hope that there aren't any systems that provide
|
|
|
|
* neither POSIX signals nor BSD signals. The alternative
|
|
|
|
* is to do signal-handler reinstallation, which doesn't work well
|
|
|
|
* at all.
|
1996-11-18 03:25:09 +01:00
|
|
|
* ------------------------------------------------------------------------*/
|
1996-12-26 23:08:34 +01:00
|
|
|
#include <signal.h>
|
|
|
|
|
1999-07-16 07:00:38 +02:00
|
|
|
#include "postgres.h"
|
|
|
|
|
1999-07-16 01:04:24 +02:00
|
|
|
#include "libpq/pqsignal.h"
|
1996-07-09 08:22:35 +02:00
|
|
|
|
2000-06-28 05:33:33 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Initialize BlockSig and UnBlockSig.
|
|
|
|
*
|
|
|
|
* BlockSig is the set of signals to block when we are trying to block
|
|
|
|
* signals. This includes all signals we normally expect to get, but NOT
|
|
|
|
* signals that should never be turned off.
|
|
|
|
*
|
|
|
|
* UnBlockSig is the set of signals to block when we don't want to block
|
|
|
|
* signals (is this ever nonzero??)
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
pqinitmask(void)
|
|
|
|
{
|
|
|
|
#ifdef HAVE_SIGPROCMASK
|
|
|
|
sigemptyset(&UnBlockSig);
|
|
|
|
sigfillset(&BlockSig);
|
2000-06-29 04:17:42 +02:00
|
|
|
/*
|
|
|
|
* Unmark those signals that should never be blocked.
|
|
|
|
* Some of these signal names don't exist on all platforms. Most do,
|
|
|
|
* but might as well ifdef them all for consistency...
|
|
|
|
*/
|
|
|
|
#ifdef SIGTRAP
|
|
|
|
sigdelset(&BlockSig, SIGTRAP);
|
|
|
|
#endif
|
|
|
|
#ifdef SIGABRT
|
2000-06-28 05:33:33 +02:00
|
|
|
sigdelset(&BlockSig, SIGABRT);
|
2000-06-29 04:17:42 +02:00
|
|
|
#endif
|
|
|
|
#ifdef SIGILL
|
2000-06-28 05:33:33 +02:00
|
|
|
sigdelset(&BlockSig, SIGILL);
|
2000-06-29 04:17:42 +02:00
|
|
|
#endif
|
|
|
|
#ifdef SIGFPE
|
|
|
|
sigdelset(&BlockSig, SIGFPE);
|
|
|
|
#endif
|
|
|
|
#ifdef SIGSEGV
|
2000-06-28 05:33:33 +02:00
|
|
|
sigdelset(&BlockSig, SIGSEGV);
|
2000-06-29 04:17:42 +02:00
|
|
|
#endif
|
|
|
|
#ifdef SIGBUS
|
2000-06-28 05:33:33 +02:00
|
|
|
sigdelset(&BlockSig, SIGBUS);
|
2000-06-29 04:17:42 +02:00
|
|
|
#endif
|
|
|
|
#ifdef SIGSYS
|
2000-06-28 05:33:33 +02:00
|
|
|
sigdelset(&BlockSig, SIGSYS);
|
2000-06-29 04:17:42 +02:00
|
|
|
#endif
|
|
|
|
#ifdef SIGCONT
|
|
|
|
sigdelset(&BlockSig, SIGCONT);
|
|
|
|
#endif
|
2000-06-28 05:33:33 +02:00
|
|
|
#else
|
|
|
|
UnBlockSig = 0;
|
|
|
|
BlockSig = sigmask(SIGHUP) | sigmask(SIGQUIT) |
|
|
|
|
sigmask(SIGTERM) | sigmask(SIGALRM) |
|
|
|
|
sigmask(SIGINT) | sigmask(SIGUSR1) |
|
|
|
|
sigmask(SIGUSR2) | sigmask(SIGCHLD) |
|
|
|
|
sigmask(SIGWINCH) | sigmask(SIGFPE);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Set up a signal handler
|
|
|
|
*/
|
1996-07-09 08:22:35 +02:00
|
|
|
pqsigfunc
|
|
|
|
pqsignal(int signo, pqsigfunc func)
|
|
|
|
{
|
2000-06-11 13:40:09 +02:00
|
|
|
#if !defined(HAVE_POSIX_SIGNALS)
|
1997-09-07 07:04:48 +02:00
|
|
|
return signal(signo, func);
|
1996-12-26 23:08:34 +01:00
|
|
|
#else
|
1997-09-07 07:04:48 +02:00
|
|
|
struct sigaction act,
|
1997-09-08 04:41:22 +02:00
|
|
|
oact;
|
1997-09-07 07:04:48 +02:00
|
|
|
|
|
|
|
act.sa_handler = func;
|
|
|
|
sigemptyset(&act.sa_mask);
|
|
|
|
act.sa_flags = 0;
|
|
|
|
if (signo != SIGALRM)
|
|
|
|
act.sa_flags |= SA_RESTART;
|
|
|
|
if (sigaction(signo, &act, &oact) < 0)
|
1998-09-01 05:29:17 +02:00
|
|
|
return SIG_ERR;
|
|
|
|
return oact.sa_handler;
|
2000-06-11 13:40:09 +02:00
|
|
|
#endif /* !HAVE_POSIX_SIGNALS */
|
1996-07-09 08:22:35 +02:00
|
|
|
}
|