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