mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
are now separate files "postgres.h" and "postgres_fe.h", which are meant to be the primary include files for backend .c files and frontend .c files respectively. By default, only include files meant for frontend use are installed into the installation include directory. There is a new make target 'make install-all-headers' that adds the whole content of the src/include tree to the installed fileset, for use by people who want to develop server-side code without keeping the complete source tree on hand. Cleaned up a whole lot of crufty and inconsistent header inclusions.
126 lines
3.3 KiB
C
126 lines
3.3 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* pqsignal.c
|
|
* reliable BSD-style signal(2) routine stolen from RWW who stole it
|
|
* from Stevens...
|
|
*
|
|
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
*
|
|
* IDENTIFICATION
|
|
* $Header: /cvsroot/pgsql/src/backend/libpq/pqsignal.c,v 1.19 2001/02/10 02:31:26 tgl Exp $
|
|
*
|
|
* NOTES
|
|
* This shouldn't be in libpq, but the monitor and some other
|
|
* things need it...
|
|
*
|
|
* A NOTE ABOUT SIGNAL HANDLING ACROSS THE VARIOUS PLATFORMS.
|
|
*
|
|
* config.h defines the macro HAVE_POSIX_SIGNALS for some platforms and
|
|
* not for others. This file and pqsignal.h use that macro to decide
|
|
* how to handle signalling.
|
|
*
|
|
* 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.
|
|
* ------------------------------------------------------------------------*/
|
|
#include "postgres.h"
|
|
|
|
#include <signal.h>
|
|
|
|
#include "libpq/pqsignal.h"
|
|
|
|
|
|
/*
|
|
* 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);
|
|
/*
|
|
* 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
|
|
sigdelset(&BlockSig, SIGABRT);
|
|
#endif
|
|
#ifdef SIGILL
|
|
sigdelset(&BlockSig, SIGILL);
|
|
#endif
|
|
#ifdef SIGFPE
|
|
sigdelset(&BlockSig, SIGFPE);
|
|
#endif
|
|
#ifdef SIGSEGV
|
|
sigdelset(&BlockSig, SIGSEGV);
|
|
#endif
|
|
#ifdef SIGBUS
|
|
sigdelset(&BlockSig, SIGBUS);
|
|
#endif
|
|
#ifdef SIGSYS
|
|
sigdelset(&BlockSig, SIGSYS);
|
|
#endif
|
|
#ifdef SIGCONT
|
|
sigdelset(&BlockSig, SIGCONT);
|
|
#endif
|
|
#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
|
|
*/
|
|
pqsigfunc
|
|
pqsignal(int signo, pqsigfunc func)
|
|
{
|
|
#if !defined(HAVE_POSIX_SIGNALS)
|
|
return signal(signo, func);
|
|
#else
|
|
struct sigaction act,
|
|
oact;
|
|
|
|
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)
|
|
return SIG_ERR;
|
|
return oact.sa_handler;
|
|
#endif /* !HAVE_POSIX_SIGNALS */
|
|
}
|