From: Matthias Andree Date: Sun, 5 Jan 2003 05:10:42 +0000 (+0100) Subject: Fix Linux' broadcastclient mode. X-Git-Tag: NTP_4_1_73~5^2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cd6ab062262f0606d65ed1dda1d141037ce7ee4e;p=thirdparty%2Fntp.git Fix Linux' broadcastclient mode. Patch by Allen Mcintosh. bk: 3e17be52-DlBU8g1n2E7AdZ-kLn7cg --- diff --git a/configure.in b/configure.in index 5e2eb661cf..228971b157 100644 --- a/configure.in +++ b/configure.in @@ -947,9 +947,6 @@ case "$host" in *-*-domainos) ans=no ;; - *-*-linux*) - ans=no - ;; esac ac_cv_var_open_bcast_socket=$ans]) case "$ac_cv_var_open_bcast_socket" in diff --git a/ntpd/ntp_io.c b/ntpd/ntp_io.c index ef0c14698f..6797950765 100644 --- a/ntpd/ntp_io.c +++ b/ntpd/ntp_io.c @@ -142,6 +142,7 @@ static int open_socket P((struct sockaddr_in *, int, int)); static void close_socket P((int)); static void close_file P((int)); static char * fdbits P((int, fd_set *)); +static void set_reuseaddr P((int)); /* * init_io - initialize I/O data structures and call socket creation routine @@ -615,21 +616,7 @@ create_sockets( * Now that we have opened all the sockets, turn off the reuse flag for * security. */ - for (i = 0; i < ninterfaces; i++) { - int off = 0; - - /* - * if inter_list[ n ].fd is -1, we might have a adapter - * configured but not present - */ - if ( inter_list[ i ].fd != -1 ) { - if (setsockopt(inter_list[i].fd, SOL_SOCKET, - SO_REUSEADDR, (char *)&off, - sizeof(off))) { - msyslog(LOG_ERR, "create_sockets: setsockopt(SO_REUSEADDR,off) failed: %m"); - } - } - } + set_reuseaddr(0); #if defined(MCAST) /* @@ -684,6 +671,10 @@ io_setbclient(void) { int i; +#ifdef OPEN_BCAST_SOCKET + set_reuseaddr(1); +#endif + for (i = 1; i < ninterfaces; i++) { if (!(inter_list[i].flags & INT_BROADCAST)) continue; @@ -700,6 +691,34 @@ io_setbclient(void) inter_list[i].flags |= INT_BCASTOPEN; #endif } + +#ifdef OPEN_BCAST_SOCKET + set_reuseaddr(0); +#endif +} + +/* + * set_reuseaddr() - set/clear REUSEADDR on all sockets + * NB possible hole - should we be doing this on broadcast + * fd's also? + */ +static void +set_reuseaddr(int flag) { + int i; + + for (i = 0; i < ninterfaces; i++) { + /* + * if inter_list[ n ].fd is -1, we might have a adapter + * configured but not present + */ + if ( inter_list[ i ].fd != -1 ) { + if (setsockopt(inter_list[i].fd, SOL_SOCKET, + SO_REUSEADDR, (char *)&flag, + sizeof(flag))) { + msyslog(LOG_ERR, "create_sockets: setsockopt(SO_REUSEADDR,%s) failed: %m", flag ? "on" : "off"); + } + } + } }