Initial import from FreeBSD RELENG_4:
[dragonfly.git] / contrib / ntp / libntp / syssignal.c
1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4
5 #include <stdio.h>
6 #include <sys/types.h>
7 #include <signal.h>
8
9 #include "ntp_syslog.h"
10 #include "ntp_stdlib.h"
11
12 #ifdef HAVE_SIGACTION
13
14 void
15 signal_no_reset(
16 #if defined(__STDC__) || defined(HAVE_STDARG_H)
17         int sig,
18         void (*func) (int)
19 #else
20         sig, func
21 #endif
22         )
23 #if defined(__STDC__) || defined(HAVE_STDARG_H)
24 #else
25          int sig;
26          void (*func) P((int));
27 #endif
28 {
29         int n;
30         struct sigaction vec;
31
32         vec.sa_handler = func;
33         sigemptyset(&vec.sa_mask);
34 #if 0
35 #ifdef SA_RESTART
36         vec.sa_flags = SA_RESTART;
37 #else
38         vec.sa_flags = 0;
39 #endif
40 #else
41         vec.sa_flags = 0;
42 #endif
43
44 #ifdef SA_RESTART
45 /* Added for PPS clocks on Solaris 7 which get EINTR errors */
46 # ifdef SIGPOLL
47         if (sig == SIGPOLL) vec.sa_flags = SA_RESTART;
48 # endif
49 # ifdef SIGIO
50         if (sig == SIGIO)   vec.sa_flags = SA_RESTART;
51 # endif
52 #endif
53
54         while (1)
55         {
56                 struct sigaction ovec;
57
58                 n = sigaction(sig, &vec, &ovec);
59                 if (n == -1 && errno == EINTR) continue;
60                 if (ovec.sa_flags
61 #ifdef  SA_RESTART
62                     && ovec.sa_flags != SA_RESTART
63 #endif
64                     )
65                         msyslog(LOG_DEBUG, "signal_no_reset: signal %d had flags %x",
66                                 sig, ovec.sa_flags);
67                 break;
68         }
69         if (n == -1) {
70                 perror("sigaction");
71                 exit(1);
72         }
73 }
74
75 #elif  HAVE_SIGVEC
76
77 void
78 signal_no_reset(
79         int sig,
80         RETSIGTYPE (*func) (int)
81         )
82 {
83         struct sigvec sv;
84         int n;
85
86         bzero((char *) &sv, sizeof(sv));
87         sv.sv_handler = func;
88         n = sigvec(sig, &sv, (struct sigvec *)NULL);
89         if (n == -1) {
90                 perror("sigvec");
91                 exit(1);
92         }
93 }
94
95 #elif  HAVE_SIGSET
96
97 void
98 signal_no_reset(
99         int sig,
100         RETSIGTYPE (*func) (int)
101         )
102 {
103         int n;
104
105         n = sigset(sig, func);
106         if (n == -1) {
107                 perror("sigset");
108                 exit(1);
109         }
110 }
111
112 #else
113
114 /* Beware!      This implementation resets the signal to SIG_DFL */
115 void
116 signal_no_reset(
117         int sig,
118         RETSIGTYPE (*func) (int)
119         )
120 {
121 #ifdef SIG_ERR
122         if (SIG_ERR == signal(sig, func)) {
123 #else
124         int n;
125         n = signal(sig, func);
126         if (n == -1) {
127 #endif
128                 perror("signal");
129                 exit(1);
130         }
131 }
132
133 #endif