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