9 #include "ntp_syslog.h"
10 #include "ntp_stdlib.h"
12 static ctrl_c_fn ctrl_c_hook;
14 RETSIGTYPE sigint_handler(int);
16 BOOL WINAPI console_event_handler(DWORD);
23 # define Z_SA_RESTART SA_RESTART
25 # define Z_SA_RESTART 0
36 struct sigaction ovec;
39 sigemptyset(&vec.sa_mask);
40 vec.sa_handler = func;
42 /* Added for PPS clocks on Solaris 7 which get EINTR errors */
45 vec.sa_flags = Z_SA_RESTART;
49 vec.sa_flags = Z_SA_RESTART;
53 n = sigaction(sig, &vec, &ovec);
54 while (-1 == n && EINTR == errno);
66 RETSIGTYPE (*func)(int)
74 n = sigvec(sig, &sv, (struct sigvec *)NULL);
86 RETSIGTYPE (*func)(int)
91 n = sigset(sig, func);
100 /* Beware! This implementation resets the signal to SIG_DFL */
104 RETSIGTYPE (*func)(int)
108 # define SIG_ERR (-1)
110 if (SIG_ERR == signal(sig, func)) {
120 * POSIX implementation of set_ctrl_c_hook()
128 if (ctrl_c_hook != NULL)
137 RETSIGTYPE (*handler)(int);
139 if (NULL == c_hook) {
141 signal_no_reset(SIGINT, handler);
142 ctrl_c_hook = c_hook;
144 ctrl_c_hook = c_hook;
145 handler = &sigint_handler;
146 signal_no_reset(SIGINT, handler);
149 #else /* SYS_WINNT follows */
151 * Windows implementation of set_ctrl_c_hook()
154 console_event_handler(
160 if (CTRL_C_EVENT == dwCtrlType && ctrl_c_hook != NULL) {
176 if (NULL == c_hook) {
180 ctrl_c_hook = c_hook;
183 if (!SetConsoleCtrlHandler(&console_event_handler, install))
184 msyslog(LOG_ERR, "Can't %s console control handler: %m",
189 #endif /* SYS_WINNT */