File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / libntp / syssignal.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:08:38 2012 UTC (12 years ago) by misho
Branches: ntp, MAIN
CVS tags: v4_2_6p5p0, v4_2_6p5, HEAD
ntp 4.2.6p5

    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) (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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>