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>