Add a facility for tracking open file descriptors.  Information about
still open files is dumped out exit.  Enabled using the --track-fds
switch.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2031 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/corecheck/tests/fdleak_ipv4.c b/corecheck/tests/fdleak_ipv4.c
new file mode 100644
index 0000000..98d28ae
--- /dev/null
+++ b/corecheck/tests/fdleak_ipv4.c
@@ -0,0 +1,109 @@
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+void
+server ()
+{
+   int s, x;
+   struct sockaddr_in baddr;
+   struct sockaddr_in addr;
+   int baddrsize = sizeof(baddr);
+   int one = 1;
+   
+   s = socket(PF_INET, SOCK_STREAM, 0);
+   if(s == -1) {
+      perror("socket");
+      exit(1);
+   }
+
+   setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int));
+   memset(&addr, 0, sizeof(addr));
+   addr.sin_family = AF_INET;
+   addr.sin_addr.s_addr = inet_addr("127.0.0.1");
+   addr.sin_port = 12321;
+
+   if(bind(s, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
+      perror("bind");
+      exit(1);
+   }
+
+   if(listen(s, 5) == -1) {
+      perror("listen");
+      exit(1);
+   }
+
+   memset(&baddr, 0, sizeof(baddr));
+   x = accept(s, (struct sockaddr *)&baddr, &baddrsize);
+   if(x == -1) {
+      perror("accept");
+      exit(1);
+   }
+
+   write(x, "hello", 6);
+}
+
+void
+client ()
+{
+   int s, count = 0, ret;
+   struct sockaddr_in addr;
+   char buf[1024];
+
+   s = socket(PF_INET, SOCK_STREAM, 0);
+   if(s == -1) {
+      perror("socket");
+      exit(1);
+   }
+
+   addr.sin_family = AF_INET;
+   addr.sin_addr.s_addr = inet_addr("127.0.0.1");
+   addr.sin_port = 12321;
+
+   do {
+     count++;
+     ret = connect(s, (struct sockaddr *)&addr, sizeof(addr));
+     if(ret == -1) sleep(1);
+   } while (count < 10 && ret == -1);
+
+   if(ret == -1) {
+      perror("connect");
+      exit(1);
+   }
+
+   read(s, buf, sizeof(buf));
+
+   printf("%s\n", buf);
+}
+
+
+int
+main (int argc, char **argv)
+{
+   int pid, status;
+
+   /*
+    * Fedora Core 1's Perl opens /dev/pts/2 as fd 10.  Let's close it
+    * now to get consistent results across different releases.
+    */
+
+   close(10);
+
+   if((pid = fork()) == 0) {
+      server();
+      return 0;
+   }
+
+   client();
+
+   wait(&status);
+
+   return 0;
+}