File: ircsig.c

package info (click to toggle)
ircii 4.4-3
  • links: PTS
  • area: main
  • in suites: hamm, slink
  • size: 4,256 kB
  • ctags: 2,797
  • sloc: ansic: 36,743; sh: 907; makefile: 483; lex: 16
file content (63 lines) | stat: -rw-r--r-- 1,558 bytes parent folder | download
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 */