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