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>