xref: /freebsd/contrib/ntp/libntp/syssignal.c (revision 2be1a816b9ff69588e55be0a84cbe2a31efc0f2f)
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
134