2
* ntp_io.c - input/output routines for ntpd. The socket-opening code
2
* iosignal.c - input/output routines for ntpd. The socket-opening code
3
3
* was shamelessly stolen from ntpd.
6
#include "ntp_machine.h"
10
#include "ntp_stdlib.h"
8
* Do the #includes differently, as under some versions of Linux
9
* sys/param.h has a #undef CONFIG_PHONE line in it.
11
* As we have ~40 CONFIG_ variables, I don't feel like renaming them
12
* every time somebody adds a new macro to some system header.
14
20
#include <signal.h>
25
31
# include <ifaddrs.h>
34
#include "ntp_machine.h"
38
#include "ntp_stdlib.h"
28
41
#if defined(HAVE_SIGNALED_IO)
29
42
static int sigio_block_count = 0;
43
# if defined(HAVE_SIGACTION)
45
* If sigaction() is used for signal handling and a signal is
46
* pending then the kernel blocks the signal before it calls
49
* The variable below is used to take care that the SIGIO signal
50
* is not unintentionally unblocked inside the sigio_handler()
51
* if the handler executes a piece of code that is normally
52
* bracketed by BLOCKIO()/UNBLOCKIO() calls.
54
static int sigio_handler_active = 0;
30
56
extern void input_handler P((l_fp *));
37
63
* Some systems (MOST) define SIGPOLL == SIGIO, others SIGIO == SIGPOLL, and
38
64
* a few have separate SIGIO and SIGPOLL signals. This code checks for the
39
65
* SIGIO == SIGPOLL case at compile time.
40
* Do not defined USE_SIGPOLL or USE_SIGIO.
41
* these are interal only to ntp_io.c!
66
* Do not define USE_SIGPOLL or USE_SIGIO.
67
* these are interal only to iosignal.c!
43
69
# if defined(USE_SIGPOLL)
44
70
# undef USE_SIGPOLL
284
316
get_systime(&ts);
318
# if defined(HAVE_SIGACTION)
319
sigio_handler_active++;
320
if (sigio_handler_active != 1) /* This should never happen! */
321
msyslog(LOG_ERR, "sigio_handler: sigio_handler_active != 1");
285
324
(void)input_handler(&ts);
326
# if defined(HAVE_SIGACTION)
327
sigio_handler_active--;
328
if (sigio_handler_active != 0) /* This should never happen! */
329
msyslog(LOG_ERR, "sigio_handler: sigio_handler_active != 0");
286
332
errno = saved_errno;
327
373
block_sigio(void)
332
if (sigio_block_count > 1)
333
msyslog(LOG_INFO, "block_sigio: sigio_block_count > 1");
334
if (sigio_block_count < 1)
335
msyslog(LOG_INFO, "block_sigio: sigio_block_count < 1");
337
if (sigemptyset(&set))
338
msyslog(LOG_ERR, "block_sigio: sigemptyset() failed: %m");
339
# if defined(USE_SIGIO)
340
if (sigaddset(&set, SIGIO))
341
msyslog(LOG_ERR, "block_sigio: sigaddset(SIGIO) failed: %m");
343
# if defined(USE_SIGPOLL)
344
if (sigaddset(&set, SIGPOLL))
345
msyslog(LOG_ERR, "block_sigio: sigaddset(SIGPOLL) failed: %m");
348
if (sigprocmask(SIG_BLOCK, &set, NULL))
349
msyslog(LOG_ERR, "block_sigio: sigprocmask() failed: %m");
375
if ( sigio_handler_active == 0 ) /* not called from within signal handler */
380
if (sigio_block_count > 1)
381
msyslog(LOG_INFO, "block_sigio: sigio_block_count > 1");
382
if (sigio_block_count < 1)
383
msyslog(LOG_INFO, "block_sigio: sigio_block_count < 1");
385
if (sigemptyset(&set))
386
msyslog(LOG_ERR, "block_sigio: sigemptyset() failed: %m");
387
# if defined(USE_SIGIO)
388
if (sigaddset(&set, SIGIO))
389
msyslog(LOG_ERR, "block_sigio: sigaddset(SIGIO) failed: %m");
391
# if defined(USE_SIGPOLL)
392
if (sigaddset(&set, SIGPOLL))
393
msyslog(LOG_ERR, "block_sigio: sigaddset(SIGPOLL) failed: %m");
396
if (sigprocmask(SIG_BLOCK, &set, NULL))
397
msyslog(LOG_ERR, "block_sigio: sigprocmask() failed: %m");
376
425
unblock_sigio(void)
381
if (sigio_block_count > 0)
382
msyslog(LOG_INFO, "unblock_sigio: sigio_block_count > 0");
383
if (sigio_block_count < 0)
384
msyslog(LOG_INFO, "unblock_sigio: sigio_block_count < 0");
386
if (sigemptyset(&unset))
387
msyslog(LOG_ERR, "unblock_sigio: sigemptyset() failed: %m");
389
# if defined(USE_SIGIO)
390
if (sigaddset(&unset, SIGIO))
391
msyslog(LOG_ERR, "unblock_sigio: sigaddset(SIGIO) failed: %m");
393
# if defined(USE_SIGPOLL)
394
if (sigaddset(&unset, SIGPOLL))
395
msyslog(LOG_ERR, "unblock_sigio: sigaddset(SIGPOLL) failed: %m");
398
if (sigprocmask(SIG_UNBLOCK, &unset, NULL))
399
msyslog(LOG_ERR, "unblock_sigio: sigprocmask() failed: %m");
427
if ( sigio_handler_active == 0 ) /* not called from within signal handler */
432
if (sigio_block_count > 0)
433
msyslog(LOG_INFO, "unblock_sigio: sigio_block_count > 0");
434
if (sigio_block_count < 0)
435
msyslog(LOG_INFO, "unblock_sigio: sigio_block_count < 0");
437
if (sigemptyset(&unset))
438
msyslog(LOG_ERR, "unblock_sigio: sigemptyset() failed: %m");
440
# if defined(USE_SIGIO)
441
if (sigaddset(&unset, SIGIO))
442
msyslog(LOG_ERR, "unblock_sigio: sigaddset(SIGIO) failed: %m");
444
# if defined(USE_SIGPOLL)
445
if (sigaddset(&unset, SIGPOLL))
446
msyslog(LOG_ERR, "unblock_sigio: sigaddset(SIGPOLL) failed: %m");
449
if (sigprocmask(SIG_UNBLOCK, &unset, NULL))
450
msyslog(LOG_ERR, "unblock_sigio: sigprocmask() failed: %m");