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
14void
15signal_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) (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
77void
78signal_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
97void
98signal_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 */
115void
116signal_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