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
* 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)
/*
{
int i;
+#ifdef OPEN_BCAST_SOCKET
+ set_reuseaddr(1);
+#endif
+
for (i = 1; i < ninterfaces; i++) {
if (!(inter_list[i].flags & INT_BROADCAST))
continue;
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");
+ }
+ }
+ }
}