154359Sroberto#ifdef HAVE_CONFIG_H
254359Sroberto# include <config.h>
354359Sroberto#endif
454359Sroberto
554359Sroberto#include <stdio.h>
654359Sroberto#include <sys/types.h>
754359Sroberto#include <signal.h>
854359Sroberto
954359Sroberto#include "ntp_syslog.h"
1054359Sroberto#include "ntp_stdlib.h"
1154359Sroberto
1254359Sroberto#ifdef HAVE_SIGACTION
1354359Sroberto
1454359Srobertovoid
1554359Srobertosignal_no_reset(
1654359Sroberto#if defined(__STDC__) || defined(HAVE_STDARG_H)
1754359Sroberto	int sig,
1854359Sroberto	void (*func) (int)
1954359Sroberto#else
2054359Sroberto	sig, func
2154359Sroberto#endif
2254359Sroberto	)
2354359Sroberto#if defined(__STDC__) || defined(HAVE_STDARG_H)
2454359Sroberto#else
2554359Sroberto	 int sig;
2654359Sroberto	 void (*func) P((int));
2754359Sroberto#endif
2854359Sroberto{
2954359Sroberto	int n;
3054359Sroberto	struct sigaction vec;
3154359Sroberto
3254359Sroberto	vec.sa_handler = func;
3354359Sroberto	sigemptyset(&vec.sa_mask);
3454359Sroberto#if 0
3554359Sroberto#ifdef SA_RESTART
3654359Sroberto	vec.sa_flags = SA_RESTART;
3754359Sroberto#else
3854359Sroberto	vec.sa_flags = 0;
3954359Sroberto#endif
4054359Sroberto#else
4154359Sroberto	vec.sa_flags = 0;
4254359Sroberto#endif
4354359Sroberto
4456746Sroberto#ifdef SA_RESTART
4556746Sroberto/* Added for PPS clocks on Solaris 7 which get EINTR errors */
4656746Sroberto# ifdef SIGPOLL
4756746Sroberto	if (sig == SIGPOLL) vec.sa_flags = SA_RESTART;
4856746Sroberto# endif
4956746Sroberto# ifdef SIGIO
5056746Sroberto	if (sig == SIGIO)   vec.sa_flags = SA_RESTART;
5156746Sroberto# endif
5256746Sroberto#endif
5356746Sroberto
5454359Sroberto	while (1)
5554359Sroberto	{
5654359Sroberto		struct sigaction ovec;
5754359Sroberto
5854359Sroberto		n = sigaction(sig, &vec, &ovec);
5954359Sroberto		if (n == -1 && errno == EINTR) continue;
6054359Sroberto		if (ovec.sa_flags
6154359Sroberto#ifdef	SA_RESTART
6254359Sroberto		    && ovec.sa_flags != SA_RESTART
6354359Sroberto#endif
6454359Sroberto		    )
6554359Sroberto			msyslog(LOG_DEBUG, "signal_no_reset: signal %d had flags %x",
6654359Sroberto				sig, ovec.sa_flags);
6754359Sroberto		break;
6854359Sroberto	}
6954359Sroberto	if (n == -1) {
7054359Sroberto		perror("sigaction");
7154359Sroberto		exit(1);
7254359Sroberto	}
7354359Sroberto}
7454359Sroberto
7554359Sroberto#elif  HAVE_SIGVEC
7654359Sroberto
7754359Srobertovoid
7854359Srobertosignal_no_reset(
7954359Sroberto	int sig,
8054359Sroberto	RETSIGTYPE (*func) (int)
8154359Sroberto	)
8254359Sroberto{
8354359Sroberto	struct sigvec sv;
8454359Sroberto	int n;
8554359Sroberto
8654359Sroberto	bzero((char *) &sv, sizeof(sv));
8754359Sroberto	sv.sv_handler = func;
8854359Sroberto	n = sigvec(sig, &sv, (struct sigvec *)NULL);
8954359Sroberto	if (n == -1) {
9054359Sroberto		perror("sigvec");
9154359Sroberto		exit(1);
9254359Sroberto	}
9354359Sroberto}
9454359Sroberto
9554359Sroberto#elif  HAVE_SIGSET
9654359Sroberto
9754359Srobertovoid
9854359Srobertosignal_no_reset(
9954359Sroberto	int sig,
10054359Sroberto	RETSIGTYPE (*func) (int)
10154359Sroberto	)
10254359Sroberto{
10354359Sroberto	int n;
10454359Sroberto
10554359Sroberto	n = sigset(sig, func);
10654359Sroberto	if (n == -1) {
10754359Sroberto		perror("sigset");
10854359Sroberto		exit(1);
10954359Sroberto	}
11054359Sroberto}
11154359Sroberto
11254359Sroberto#else
11354359Sroberto
11454359Sroberto/* Beware!	This implementation resets the signal to SIG_DFL */
11554359Srobertovoid
11654359Srobertosignal_no_reset(
11754359Sroberto	int sig,
11854359Sroberto	RETSIGTYPE (*func) (int)
11954359Sroberto	)
12054359Sroberto{
12154359Sroberto#ifdef SIG_ERR
12254359Sroberto	if (SIG_ERR == signal(sig, func)) {
12354359Sroberto#else
12454359Sroberto	int n;
12554359Sroberto	n = signal(sig, func);
12654359Sroberto	if (n == -1) {
12754359Sroberto#endif
12854359Sroberto		perror("signal");
12954359Sroberto		exit(1);
13054359Sroberto	}
13154359Sroberto}
13254359Sroberto
13354359Sroberto#endif
134