/* $Id: xsignal.c 5610 2002-08-18 22:22:52Z rra $
**
** A reliable implementation of signal for System V systems.
**
** Two functions are provided, xsignal and xsignal_norestart. The former
** attempts to set system calls to be restarted and the latter does not.
**
** Be aware that there's weird declaration stuff going on here; a signal
** handler is a pointer to a function taking an int and returning void.
** We typedef this as sig_handler_type for clearer code.
*/
#include "config.h"
#include "libinn.h"
#include <signal.h>
typedef void (*sig_handler_type)(int);
#ifdef HAVE_SIGACTION
sig_handler_type
xsignal(int signum, sig_handler_type sigfunc)
{
struct sigaction act, oact;
act.sa_handler = sigfunc;
sigemptyset(&act.sa_mask);
/* Try to restart system calls if possible. */
#ifdef SA_RESTART
act.sa_flags = SA_RESTART;
#else
act.sa_flags = 0;
#endif
if (sigaction(signum, &act, &oact) < 0)
return SIG_ERR;
return oact.sa_handler;
}
sig_handler_type
xsignal_norestart(int signum, sig_handler_type sigfunc)
{
struct sigaction act, oact;
act.sa_handler = sigfunc;
sigemptyset(&act.sa_mask);
/* Try not to restart system calls. */
#ifdef SA_INTERRUPT
act.sa_flags = SA_INTERRUPT;
#else
act.sa_flags = 0;
#endif
if (sigaction(signum, &act, &oact) < 0)
return SIG_ERR;
return oact.sa_handler;
}
#else /* !HAVE_SIGACTION */
sig_handler_type
xsignal(int signum, sig_handler_type sigfunc)
{
return signal(signum, sigfunc);
}
sig_handler_type
xsignal_norestart(int signum, sig_handler_type sigfunc)
{
return signal(signum, sigfunc);
}
#endif /* !HAVE_SIGACTION */
syntax highlighted by Code2HTML, v. 0.9.1