http://code.google.com/p/lusca-cache/source/detail?r=14919
Modified:
  /playpen/LUSCA_HEAD_ipv6/libpinger/icmp_v4.c
  /playpen/LUSCA_HEAD_ipv6/libpinger/icmp_v4.h
  /playpen/LUSCA_HEAD_ipv6/src/pinger.c
=======================================
--- /playpen/LUSCA_HEAD_ipv6/libpinger/icmp_v4.c	Thu Jul 14 06:11:23 2011
+++ /playpen/LUSCA_HEAD_ipv6/libpinger/icmp_v4.c	Thu Jul 14 07:32:19 2011
@@ -39,6 +39,7 @@
  #include <unistd.h>
  #include <string.h>
  #include <arpa/inet.h>
+#include <netdb.h>
#if !defined(_SQUID_WIN32_)
@@ -60,9 +61,6 @@
#define PINGER_TIMEOUT 5
-static SOCKET socket_to_squid = -1;
-#define socket_from_squid socket_to_squid
-
  #else /* _SQUID_MSWIN */
  /* Cygwin */
@@ -74,9 +72,6 @@
#define PINGER_TIMEOUT 10
-static int socket_from_squid = 0;
-static int socket_to_squid = 1;
-
  #endif /* _SQUID_MSWIN_ */
  #endif /* _SQUID_WIN32_ */
@@ -159,8 +154,8 @@
   * packet and fires it off.
   */
  void
-pingerv4SendEcho(int icmp_sock, struct in_addr to, int opcode, char  
*payload,
-  int len)
+pingerv4SendEcho(struct pingerv4_state *state, struct in_addr to,
+  int opcode, char *payload, int len)
  {
      LOCAL_ARRAY(char, pkt, MAX_PKT_SZ);
      struct icmphdr *icmp = NULL;
@@ -180,8 +175,8 @@
      icmp->icmp_type = ICMP_ECHO;
      icmp->icmp_code = 0;
      icmp->icmp_cksum = 0;
-    icmp->icmp_id = icmp_ident;
-    icmp->icmp_seq = (u_short) icmp_pkts_sent++;
+    icmp->icmp_id = state->icmp_ident;
+    icmp->icmp_seq = (u_short) state->icmp_pkts_sent++;
      /* The ICMP payload is the entire 'payload' + 'len' */
      /* The caller will setup the tmimestamp and icmpEchoData */
@@ -201,7 +196,7 @@
      S.sin_addr = to;
      S.sin_port = 0;
      assert(icmp_pktsize <= MAX_PKT_SZ);
-    sendto(icmp_sock,
+    sendto(state->icmp_sock,
        pkt,
        icmp_pktsize,
        0,
@@ -218,7 +213,7 @@
   * the ICMP response payload; *len is set to the payload length.
   */
  char *
-pingerv4RecvEcho(int icmp_sock, int *icmp_type, int *payload_len,
+pingerv4RecvEcho(struct pingerv4_state *state, int *icmp_type, int  
*payload_len,
    struct in_addr *src, int *hops)
  {
      int n;
@@ -235,7 +230,7 @@
          pkt = xmalloc(MAX_PKT_SZ);
      fromlen = sizeof(from);
-    n = recvfrom(icmp_sock,
+    n = recvfrom(state->icmp_sock,
        pkt,
        MAX_PKT_SZ,
        0,
@@ -262,7 +257,7 @@
          debug(42, 9) ("%s: icmp_type=%d\n", __func__, icmp->icmp_type);
          return NULL;
      }
-    if (icmp->icmp_id != icmp_ident) {
+    if (icmp->icmp_id != state->icmp_ident) {
          debug(42, 9) ("%s: icmp_id=%d, ident should be %d\n", __func__,
            icmp->icmp_id, icmp_ident);
          return NULL;
@@ -280,3 +275,36 @@
      /* There may be no payload; the caller should check len first */
      return (pkt + iphdrlen + sizeof(struct icmphdr));
  }
+
+void
+pingerv4_state_init(struct pingerv4_state *state, int icmp_ident)
+{
+    state->icmp_sock = -1;
+    state->icmp_pkts_sent = 0;
+    state->icmp_ident = icmp_ident;
+}
+
+int
+pingerv4_open_icmpsock(struct pingerv4_state *state)
+{
+    struct protoent *proto = NULL;
+    if ((proto = getprotobyname("icmp")) == 0) {
+        debug(42, 0) ("pingerOpen: unknown protocol: icmp\n");
+        return 0;
+    }
+
+    state->icmp_sock = socket(PF_INET, SOCK_RAW, proto->p_proto);
+    if (state->icmp_sock < 0) {
+        debug(42, 0) ("pingerOpen: icmp_sock: %s\n", xstrerror());
+        return 0;
+    }
+    return 1;
+}
+
+void
+pingerv4_close_icmpsock(struct pingerv4_state *state)
+{
+    close(state->icmp_sock);
+    state->icmp_sock = -1;
+}
+
=======================================
--- /playpen/LUSCA_HEAD_ipv6/libpinger/icmp_v4.h	Thu Jul 14 06:11:23 2011
+++ /playpen/LUSCA_HEAD_ipv6/libpinger/icmp_v4.h	Thu Jul 14 07:32:19 2011
@@ -90,13 +90,20 @@
extern const char *icmpPktStr[];
-extern int icmp_ident;
-extern int icmp_pkts_sent;
-
-extern void pingerv4SendEcho(int sock, struct in_addr to, int opcode,
-  char *payload, int len);
-
-extern char * pingerv4RecvEcho(int icmp_sock, int *icmp_type, int  
*payload_len,
-  struct in_addr *src, int *hops);
+struct pingerv4_state {
+	int icmp_ident;
+	int icmp_pkts_sent;
+	int icmp_sock;
+};
+
+extern void pingerv4SendEcho(struct pingerv4_state *, struct in_addr to,
+  int opcode, char *payload, int len);
+
+extern char * pingerv4RecvEcho(struct pingerv4_state *, int *icmp_type,
+  int *payload_len, struct in_addr *src, int *hops);
+
+extern void pingerv4_state_init(struct pingerv4_state *, int icmp_ident);
+extern int pingerv4_open_icmpsock(struct pingerv4_state *);
+extern void pingerv4_close_icmpsock(struct pingerv4_state *);
  #endif	/* __LIBPINGER_ICMP_V4_H__ */
=======================================
--- /playpen/LUSCA_HEAD_ipv6/src/pinger.c	Thu Jul 14 06:11:23 2011
+++ /playpen/LUSCA_HEAD_ipv6/src/pinger.c	Thu Jul 14 07:32:19 2011
@@ -112,10 +112,12 @@
  }
  #endif /* ifdef _SQUID_MSWIN_ */
+
+struct pingerv4_state v4_state;
+
  void
  pingerOpen(void)
  {
-    struct protoent *proto = NULL;
  #ifdef _SQUID_MSWIN_
      WSADATA wsaData;
      WSAPROTOCOL_INFO wpi;
@@ -131,6 +133,7 @@
      setmode(0, O_BINARY);
      setmode(1, O_BINARY);
      x = read(0, buf, sizeof(wpi));
+
      if (x < sizeof(wpi)) {
  	getCurrentTime();
  	debug(42, 0) ("pingerOpen: read: FD 0: %s\n", xstrerror());
@@ -149,16 +152,7 @@
      }
      xmemcpy(&PS, buf, sizeof(PS));
  #endif
-    if ((proto = getprotobyname("icmp")) == 0) {
-	debug(42, 0) ("pingerOpen: unknown protocol: icmp\n");
-	exit(1);
-    }
-    icmp_sock = socket(PF_INET, SOCK_RAW, proto->p_proto);
-    if (icmp_sock < 0) {
-	debug(42, 0) ("pingerOpen: icmp_sock: %s\n", xstrerror());
-	exit(1);
-    }
-    icmp_ident = getpid() & 0xffff;
+
      debug(42, 0) ("pingerOpen: ICMP socket opened\n");
  #ifdef _SQUID_MSWIN_
      socket_to_squid =
@@ -197,14 +191,12 @@
  void
  pingerClose(void)
  {
-    close(icmp_sock);
+    pingerv4_close_icmpsock(&v4_state);
  #ifdef _SQUID_MSWIN_
      shutdown(socket_to_squid, SD_BOTH);
      close(socket_to_squid);
      socket_to_squid = -1;
  #endif
-    icmp_sock = -1;
-    icmp_ident = 0;
  }
  static void
@@ -226,7 +218,7 @@
          icmp_pktsize += MIN(len, MAX_PAYLOAD);
      }
-    pingerv4SendEcho(icmp_sock, to, opcode, (char *) &echo, icmp_pktsize);
+    pingerv4SendEcho(&v4_state, to, opcode, (char *) &echo, icmp_pktsize);
      pingerLog(ICMP_ECHO, to, 0, 0);
  }
@@ -248,7 +240,7 @@
debug(42, 9) ("%s: called\n", __func__);
-    pkt = pingerv4RecvEcho(icmp_sock, &icmp_type, &payload_len,
+    pkt = pingerv4RecvEcho(&v4_state, &icmp_type, &payload_len,
        &from, &hops);
      debug(42, 9) ("%s: returned %p\n", __func__, pkt);
@@ -361,7 +353,14 @@
      _db_init(debug_args);
      _db_set_stderr_debug(1);
+    /* Open the IPC sockets */
      pingerOpen();
+
+    /* Setup the IPv4 ICMP socket */
+    pingerv4_state_init(&v4_state, getpid() & 0xffff);
+    if (! pingerv4_open_icmpsock(&v4_state))
+        exit(1);
+
      setgid(getgid());
      setuid(getuid());
@@ -370,8 +369,8 @@
  	tv.tv_usec = 0;
  	FD_ZERO(&R);
  	FD_SET(socket_from_squid, &R);
-	FD_SET(icmp_sock, &R);
-	x = select(icmp_sock + 1, &R, NULL, NULL, &tv);
+	FD_SET(v4_state.icmp_sock, &R);
+	x = select(v4_state.icmp_sock + 1, &R, NULL, NULL, &tv);
  	getCurrentTime();
  	if (x < 0 && errno == EINTR)
  		continue;
@@ -385,7 +384,7 @@
  		pingerClose();
  		exit(1);
  	    }
-	if (FD_ISSET(icmp_sock, &R))
+	if (FD_ISSET(v4_state.icmp_sock, &R))
  	    pingerRecv();
  	if (PINGER_TIMEOUT + last_check_time < squid_curtime) {
  	    debug(42, 2) ("pinger: timeout occured\n");