Annotation of embedaddon/ntp/libntp/syssignal.c, revision 1.1
1.1 ! misho 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>