int maxactivefd;
static int create_sockets P((u_short));
-static SOCKET open_socket P((struct sockaddr_storage *, int, int));
+static SOCKET open_socket P((struct sockaddr_storage *, int, int, struct interface *));
static void close_socket P((SOCKET));
#ifdef REFCLOCK
static void close_file P((SOCKET));
#endif
for (i = 0; i < ninterfaces; i++) {
inter_list[i].fd = open_socket(&inter_list[i].sin,
- inter_list[i].flags & INT_BROADCAST, 0);
+ inter_list[i].flags & INT_BROADCAST, 0, &inter_list[i]);
if (inter_list[i].fd != INVALID_SOCKET)
msyslog(LOG_INFO, "Listening on interface %s, %s#%d",
inter_list[i].name,
msyslog(LOG_INFO, "Listening on broadcast address %s#%d",
stoa((&inter_list[i].bcast)),
NTP_PORT);
-#if defined (HAVE_IO_COMPLETION_PORT)
- if (inter_list[i].fd != INVALID_SOCKET) {
- io_completion_port_add_socket(inter_list[i].fd, &inter_list[i]);
- }
-#endif
}
/*
if (!(inter_list[i].flags & INT_BROADCAST))
continue;
+ /* Skip the loopback addresses */
+ if (inter_list[i].flags & INT_LOOPBACK)
+ continue;
+
/* Do we already have the broadcast address open? */
if (inter_list[i].flags & INT_BCASTOPEN)
continue;
inter_list[i].bfd = open_socket(&inter_list[i].bcast,
- INT_BROADCAST, 1);
+ INT_BROADCAST, 1, &inter_list[i]);
if (inter_list[i].bfd != INVALID_SOCKET) {
inter_list[i].flags |= INT_BCASTOPEN;
nif++;
-#if defined (HAVE_IO_COMPLETION_PORT)
- io_completion_port_add_socket(inter_list[i].bfd, &inter_list[i]);
-#endif
}
#ifdef DEBUG
if (debug) {
* works under SunOS 4.x, but not OSF1 .. :-(
*/
set_reuseaddr(1);
- s = open_socket((struct sockaddr_storage*)sinp, 0, 1);
+ s = open_socket((struct sockaddr_storage*)sinp, 0, 1, &inter_list[i]);
set_reuseaddr(0);
if (s == INVALID_SOCKET) {
memset((char *)&inter_list[i], 0, sizeof(struct interface));
(void) strncpy(inter_list[i].name, "multicast",
sizeof(inter_list[i].name));
((struct sockaddr_in*)&inter_list[i].mask)->sin_addr.s_addr = htonl(~(u_int32)0);
-#if defined (HAVE_IO_COMPLETION_PORT)
- io_completion_port_add_socket(inter_list[i].fd, &inter_list[i]);
-#endif
}
/*
* works under SunOS 4.x, but not OSF1 .. :-(
*/
set_reuseaddr(1);
- s = open_socket((struct sockaddr_storage*)sin6p, 0, 1);
+ s = open_socket((struct sockaddr_storage*)sin6p, 0, 1, &inter_list[i]);
set_reuseaddr(0);
if(s == INVALID_SOCKET){
memset((char *)&inter_list[i], 0, sizeof(struct interface));
(void)strncpy(inter_list[i].name, "multicast",
sizeof(inter_list[i].name));
memset(&(((struct sockaddr_in6*)&inter_list[i].mask)->sin6_addr), 1, sizeof(struct in6_addr));
-#if defined (HAVE_IO_COMPLETION_PORT)
- io_completion_port_add_socket(inter_list[i].fd, &inter_list[i]);
-#endif
}
/*
open_socket(
struct sockaddr_storage *addr,
int flags,
- int turn_off_reuse
+ int turn_off_reuse,
+ struct interface *interf
)
{
int errval;
# endif
#endif /* SYS_WINNT || VMS */
+
+#if defined (HAVE_IO_COMPLETION_PORT)
+/*
+ * Add the socket to the completion port
+ */
+ io_completion_port_add_socket(fd, interf);
+#endif
return fd;
}