#include "uucp.h"
#include "uudefs.h"
#include "sysdep.h"
#include "system.h"
#include <errno.h>
#if HAVE_RESTARTABLE_SYSCALLS
volatile sig_atomic_t fSjmp;
volatile jmp_buf sSjmp_buf;
#endif
#ifndef SA_INTERRUPT
#define SA_INTERRUPT 0
#endif
#if HAVE_SIGSET && ! HAVE_SIGACTION && ! HAVE_SIGVEC
#define signal sigset
#endif
#ifndef SV_INTERRUPT
#define SV_INTERRUPT 0
#endif
#if ! HAVE_SIGVEC_SV_FLAGS
#define sv_flags sv_onstack
#endif
RETSIGTYPE
ussignal (isig)
int isig;
{
int iindex;
#if ! HAVE_SIGACTION && ! HAVE_SIGVEC && ! HAVE_SIGSET
(void) signal (isig, ussignal);
#endif
switch (isig)
{
default: iindex = INDEXSIG_SIGHUP; break;
#ifdef SIGINT
case SIGINT: iindex = INDEXSIG_SIGINT; break;
#endif
#ifdef SIGQUIT
case SIGQUIT: iindex = INDEXSIG_SIGQUIT; break;
#endif
#ifdef SIGTERM
case SIGTERM: iindex = INDEXSIG_SIGTERM; break;
#endif
#ifdef SIGPIPE
case SIGPIPE: iindex = INDEXSIG_SIGPIPE; break;
#endif
}
afSignal[iindex] = TRUE;
afLog_signal[iindex] = TRUE;
#if HAVE_RESTARTABLE_SYSCALLS
if (fSjmp)
longjmp (sSjmp_buf, 1);
#endif
}
void
usset_signal (isig, pfn, fforce, pfignored)
int isig;
RETSIGTYPE (*pfn) P((int));
boolean fforce;
boolean *pfignored;
{
#if HAVE_SIGACTION
struct sigaction s;
if (! fforce)
{
(void) (sigemptyset (&s.sa_mask));
if (sigaction (isig, (struct sigaction *) NULL, &s) != 0)
ulog (LOG_FATAL, "sigaction (%d): %s", isig, strerror (errno));
if (s.sa_handler == SIG_IGN)
{
if (pfignored != NULL)
*pfignored = TRUE;
return;
}
if (pfignored != NULL)
*pfignored = FALSE;
}
s.sa_handler = pfn;
(void) (sigemptyset (&s.sa_mask));
s.sa_flags = SA_INTERRUPT;
if (sigaction (isig, &s, (struct sigaction *) NULL) != 0)
ulog (LOG_FATAL, "sigaction (%d): %s", isig, strerror (errno));
#else
#if HAVE_SIGVEC
struct sigvec s;
if (! fforce)
{
if (sigvec (isig, (struct sigvec *) NULL, &s) != 0)
ulog (LOG_FATAL, "sigvec (%d): %s", isig, strerror (errno));
if (s.sv_handler == SIG_IGN)
{
if (pfignored != NULL)
*pfignored = TRUE;
return;
}
if (pfignored != NULL)
*pfignored = FALSE;
}
s.sv_handler = pfn;
s.sv_mask = 0;
s.sv_flags = SV_INTERRUPT;
if (sigvec (isig, &s, (struct sigvec *) NULL) != 0)
ulog (LOG_FATAL, "sigvec (%d): %s", isig, strerror (errno));
#else
if (! fforce)
{
if (signal (isig, SIG_IGN) == SIG_IGN)
{
if (pfignored != NULL)
*pfignored = TRUE;
return;
}
if (pfignored != NULL)
*pfignored = FALSE;
}
(void) signal (isig, pfn);
#endif
#endif
}
void
usysdep_signal (isig)
int isig;
{
usset_signal (isig, ussignal, FALSE, (boolean *) NULL);
}