+* [Bug 2425] move part of input handler code from ntpd.c to ntp_io.c
+* and fix select() only platforms calling input_handler directly.
(4.2.7p377) 2013/07/28 Released by Harlan Stenn <stenn@ntp.org>
* [Bug 2397] License/copyright cleanup.
* [Bug 2439] Fix check of EscapeCommFunction() in ports/winnt/libntp/termios.c.
# undef USE_SIGIO
#endif
+/* type of input handler function - only shared between iosignal.c and ntp_io.c */
+typedef void (input_handler_t)(l_fp *);
+
#if defined(HAVE_SIGNALED_IO)
# if defined(USE_TTY_SIGPOLL) || defined(USE_UDP_SIGPOLL)
# define USE_SIGPOLL
extern int using_sigio;
-typedef void (input_handler_t)(l_fp *);
-extern input_handler_t input_handler;
-
extern void block_sigio (void);
extern void unblock_sigio (void);
extern int init_clock_sig (struct refclockio *);
extern void enable_broadcast (endpt *, sockaddr_u *);
extern void enable_multicast_if (endpt *, sockaddr_u *);
extern void interface_update (interface_receiver_t, void *);
-
+extern void io_handler (void);
extern void init_io (void);
extern void io_open_sockets (void);
extern void io_clr_stats (void);
/* ntp_io.c */
extern int disable_dynamic_updates;
-extern fd_set activefds;
-extern int maxactivefd;
extern u_int sys_ifnum; /* next .ifnum to assign */
extern endpt * any_interface; /* IPv4 wildcard */
extern endpt * any6_interface; /* IPv6 wildcard */
/*
* File descriptor masks etc. for call to select
- * Not needed for I/O Completion Ports
+ * Not needed for I/O Completion Ports or anything outside this file
*/
-fd_set activefds;
-int maxactivefd;
+static fd_set activefds;
+static int maxactivefd;
/*
* bit alternating value to detect verified interfaces during an update cycle
*/
static u_short sys_interphase = 0;
+static input_handler_t input_handler;
+
static endpt * new_interface(endpt *);
static void add_interface(endpt *);
static int update_interfaces(u_short, interface_receiver_t,
/*
* input_handler - receive packets asynchronously
*/
-void
+static void
input_handler(
l_fp * cts
)
"Listening on routing socket on fd #%d for interface updates",
fd);
}
+
+void
+io_handler(void)
+{
+# ifndef HAVE_SIGNALED_IO
+ fd_set rdfdes;
+ int nfound;
+# endif
+ /*
+ * Use select() on all on all input fd's for unlimited
+ * time. select() will terminate on SIGALARM or on the
+ * reception of input. Using select() means we can't do
+ * robust signal handling and we get a potential race
+ * between checking for alarms and doing the select().
+ * Mostly harmless, I think.
+ */
+ /*
+ * On VMS, I suspect that select() can't be interrupted
+ * by a "signal" either, so I take the easy way out and
+ * have select() time out after one second.
+ * System clock updates really aren't time-critical,
+ * and - lacking a hardware reference clock - I have
+ * yet to learn about anything else that is.
+ */
+# ifndef HAVE_SIGNALED_IO
+ rdfdes = activefds;
+# if !defined(VMS) && !defined(SYS_VXWORKS)
+ nfound = select(maxactivefd + 1, &rdfdes, NULL,
+ NULL, NULL);
+# else /* VMS, VxWorks */
+ /* make select() wake up after one second */
+ {
+ struct timeval t1;
+
+ t1.tv_sec = 1;
+ t1.tv_usec = 0;
+ nfound = select(maxactivefd + 1,
+ &rdfdes, NULL, NULL,
+ &t1);
+ }
+# endif /* VMS, VxWorks */
+ if (nfound > 0) {
+ l_fp ts;
+
+ get_systime(&ts);
+
+ input_handler(&ts);
+ } else if (nfound == -1 && errno != EINTR) {
+ msyslog(LOG_ERR, "select() error: %m");
+ }
+# ifdef DEBUG
+ else if (debug > 4) {
+ msyslog(LOG_DEBUG, "select(): nfound=%d, error: %m", nfound);
+ } else {
+ DPRINTF(1, ("select() returned %d: %m\n", nfound));
+ }
+# endif /* DEBUG */
+# else /* HAVE_SIGNALED_IO */
+ wait_for_signal();
+# endif /* HAVE_SIGNALED_IO */
+}
+
+
#else
/* HAS_ROUTING_SOCKET not defined */
static void
} /* if (droproot) */
# endif /* HAVE_DROPROOT */
- /*
- * Use select() on all on all input fd's for unlimited
- * time. select() will terminate on SIGALARM or on the
- * reception of input. Using select() means we can't do
- * robust signal handling and we get a potential race
- * between checking for alarms and doing the select().
- * Mostly harmless, I think.
- */
- /*
- * On VMS, I suspect that select() can't be interrupted
- * by a "signal" either, so I take the easy way out and
- * have select() time out after one second.
- * System clock updates really aren't time-critical,
- * and - lacking a hardware reference clock - I have
- * yet to learn about anything else that is.
- */
# ifdef HAVE_IO_COMPLETION_PORT
for (;;) {
BLOCK_IO_AND_ALARM();
was_alarmed = FALSE;
- for (;;) {
-# ifndef HAVE_SIGNALED_IO
- fd_set rdfdes;
- int nfound;
-# endif
+ for (;;) {
if (alarm_flag) { /* alarmed? */
was_alarmed = TRUE;
alarm_flag = FALSE;
/*
* Nothing to do. Wait for something.
*/
-# ifndef HAVE_SIGNALED_IO
- rdfdes = activefds;
-# if !defined(VMS) && !defined(SYS_VXWORKS)
- nfound = select(maxactivefd + 1, &rdfdes, NULL,
- NULL, NULL);
-# else /* VMS, VxWorks */
- /* make select() wake up after one second */
- {
- struct timeval t1;
-
- t1.tv_sec = 1;
- t1.tv_usec = 0;
- nfound = select(maxactivefd + 1,
- &rdfdes, NULL, NULL,
- &t1);
- }
-# endif /* VMS, VxWorks */
- if (nfound > 0) {
- l_fp ts;
-
- get_systime(&ts);
+ io_handler();
+ }
- input_handler(&ts);
- } else if (nfound == -1 && errno != EINTR) {
- msyslog(LOG_ERR, "select() error: %m");
- }
-# ifdef DEBUG
- else if (debug > 4) {
- msyslog(LOG_DEBUG, "select(): nfound=%d, error: %m", nfound);
- } else {
- DPRINTF(1, ("select() returned %d: %m\n", nfound));
- }
-# endif /* DEBUG */
-# else /* HAVE_SIGNALED_IO */
-
- wait_for_signal();
-# endif /* HAVE_SIGNALED_IO */
- if (alarm_flag) { /* alarmed? */
- was_alarmed = TRUE;
- alarm_flag = FALSE;
- }
+ if (alarm_flag) { /* alarmed? */
+ was_alarmed = TRUE;
+ alarm_flag = FALSE;
}
if (was_alarmed) {