1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
/*
* ircsig.c: has a `my_signal()' that uses sigaction().
*
* written by matthew green, 1993.
*
* i stole bits of this from w. richard stevens' `advanced programming
* in the unix environment' -mrg
*/
#ifndef lint
static char rcsid[] = "@(#)$Id: ircsig.c,v 1.6 1996/06/19 07:19:09 mrg Exp $";
#endif /* lint */
#include "irc.h"
#include "irc_std.h"
#ifdef USE_SIGACTION
sigfunc *
my_signal(sig_no, sig_handler, misc_flags)
int sig_no;
sigfunc *sig_handler;
int misc_flags;
{
/*
* misc_flags is unused currently. it's planned to be used
* to use some of the doovier bits of sigaction(), if at
* some point we need them, -mrg
*/
struct sigaction sa, osa;
/*
* have to (void *) this because of strict type checking
* on some systems -glen
*/
sa.sa_handler = (void *)sig_handler;
sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask, sig_no);
/* this is ugly, but the `correct' way. i hate c. -mrg */
sa.sa_flags = 0;
#if defined(SA_RESTART) || defined(SA_INTERRUPT)
if (SIGALRM == sig_no)
{
# if defined(SA_INTERRUPT)
sa.sa_flags |= SA_INTERRUPT;
# endif /* SA_INTERRUPT */
}
else
{
# if defined(SA_RESTART)
sa.sa_flags |= SA_RESTART;
# endif /* SA_RESTART */
}
#endif /* SA_RESTART || SA_INTERRUPT */
if (0 > sigaction(sig_no, &sa, &osa))
return ((sigfunc *)SIG_ERR);
return ((sigfunc *)osa.sa_handler);
}
#endif /* USE_SIGACTION */
|