diff -u -r squid-2.5.STABLE3.virgin/src/comm.c squid-2.5.STABLE3/src/comm.c --- squid-2.5.STABLE3.virgin/src/comm.c Mon Apr 1 01:03:38 2002 +++ squid-2.5.STABLE3/src/comm.c Wed Jun 18 17:59:37 2003 @@ -64,6 +64,9 @@ #ifdef TCP_NODELAY static void commSetTcpNoDelay(int); #endif +#ifdef SO_BINDANY +static void commSetBindAny(int); +#endif static void commSetTcpRcvbuf(int, int); static PF commConnectFree; static PF commConnectHandle; @@ -218,6 +221,10 @@ commSetNoLinger(new_socket); if (opt_reuseaddr) commSetReuseAddr(new_socket); +#ifdef SO_BINDANY + if (opt_bindany) + commSetBindAny(new_socket); +#endif } if (addr.s_addr != no_addr.s_addr) { if (commBind(new_socket, addr, port) != COMM_OK) { @@ -783,6 +790,16 @@ debug(50, 1) ("commSetTcpRcvbuf: FD %d, SIZE %d: %s\n", fd, size, xstrerror()); } + +#ifdef SO_BINDANY +static void +commSetBindAny(int fd) +{ + int on = 1; + if (setsockopt(fd, SOL_SOCKET, SO_BINDANY, (char *) &on, sizeof(on)) < 0) + debug(50, 1) ("commSetBindAny: FD %d: %s\n", fd, xstrerror()); +} +#endif int commSetNonBlocking(int fd) diff -u -r squid-2.5.STABLE3.virgin/src/globals.h squid-2.5.STABLE3/src/globals.h --- squid-2.5.STABLE3.virgin/src/globals.h Mon Jan 13 18:01:13 2003 +++ squid-2.5.STABLE3/src/globals.h Wed Jun 18 18:00:25 2003 @@ -77,6 +77,7 @@ extern int debugLevels[MAX_DEBUG_SECTIONS]; extern int do_mallinfo; /* 0 */ extern int opt_reuseaddr; /* 1 */ +extern int opt_bindany; /* 1 */ extern int icmp_sock; /* -1 */ extern int neighbors_do_private_keys; /* 1 */ extern int opt_accel_uses_host; /* 0 */ diff -u -r squid-2.5.STABLE3.virgin/src/main.c squid-2.5.STABLE3/src/main.c --- squid-2.5.STABLE3.virgin/src/main.c Mon May 5 20:24:14 2003 +++ squid-2.5.STABLE3/src/main.c Wed Jun 18 18:01:03 2003 @@ -115,8 +115,11 @@ extern char *optarg; int c; - while ((c = getopt(argc, argv, "CDFNRSVYXa:d:f:hk:m::su:vz?")) != -1) { + while ((c = getopt(argc, argv, "BCDFNRSVYXa:d:f:hk:m::su:vz?")) != -1) { switch (c) { + case 'B': + opt_bindany = 0; + break; case 'C': opt_catch_signals = 0; break;