diff -r -c squid-2.5.STABLE5.virgin/src/comm.c squid-2.5.STABLE5/src/comm.c *** squid-2.5.STABLE5.virgin/src/comm.c Sat Nov 29 13:52:59 2003 --- squid-2.5.STABLE5/src/comm.c Tue Apr 6 22:02:53 2004 *************** *** 63,68 **** --- 63,71 ---- #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; *************** *** 217,222 **** --- 220,229 ---- 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) { *************** *** 785,790 **** --- 792,807 ---- 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 -r -c squid-2.5.STABLE5.virgin/src/globals.h squid-2.5.STABLE5/src/globals.h *** squid-2.5.STABLE5.virgin/src/globals.h Mon Jan 13 18:01:13 2003 --- squid-2.5.STABLE5/src/globals.h Tue Apr 6 22:02:53 2004 *************** *** 77,82 **** --- 77,83 ---- 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 -r -c squid-2.5.STABLE5.virgin/src/main.c squid-2.5.STABLE5/src/main.c *** squid-2.5.STABLE5.virgin/src/main.c Wed Dec 17 16:10:30 2003 --- squid-2.5.STABLE5/src/main.c Tue Apr 6 22:02:53 2004 *************** *** 115,122 **** extern char *optarg; int c; ! while ((c = getopt(argc, argv, "CDFNRSVYXa:d:f:hk:m::su:vz?")) != -1) { switch (c) { case 'C': opt_catch_signals = 0; break; --- 115,125 ---- extern char *optarg; int c; ! 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;