
Nmap currently includes a modified version of the tcpdump.org release
of libpcap version 0.8.3 (released March 30, 2004).  My
(fyodor@insecure.org) modifications are as follows:

o Included this file, renamed directory from libpcap-0.8.3 to
  libpcap-possiblymodified.

o Renamed configure.in to configure.ac, which is the name now
  recommended by the autoconf project.

o Removed the .cvsignore file, all 'CVS' directories, the 'packaging' directory, and the install-sh script.
  
o Added the gcc debugging flag (-g) to aclocal.m4 if gcc is being used:
--- libpcap-0.8.3/aclocal.m4    2003-11-16 01:45:51.000000000 -0800
+++ libpcap-possiblymodified/aclocal.m4 2004-07-31 22:34:47.000000000 -0700
@@ -1,4 +1,4 @@
-dnl @(#) $Header: /CVS/nmap/libpcap-possiblymodified/NMAP_MODIFICATIONS,v 1.6 2004/08/01 05:54:55 fyodor Exp $ (LBL)
+dnl @(#) $Header: /CVS/nmap/libpcap-possiblymodified/NMAP_MODIFICATIONS,v 1.6 2004/08/01 05:54:55 fyodor Exp $ (LBL)
 dnl
 dnl Copyright (c) 1995, 1996, 1997, 1998
 dnl    The Regents of the University of California.  All rights reserved.
@@ -76,7 +76,7 @@
     if test "$GCC" = yes ; then
            if test "$SHLICC2" = yes ; then
                    ac_cv_lbl_gcc_vers=2
-                   $1="-O2"
+                   $1="-g -O2"
            else
                    AC_MSG_CHECKING(gcc version)
                    AC_CACHE_VAL(ac_cv_lbl_gcc_vers,
@@ -87,7 +87,7 @@
                                -e 's/\..*//'`)
                    AC_MSG_RESULT($ac_cv_lbl_gcc_vers)
                    if test $ac_cv_lbl_gcc_vers -gt 1 ; then
-                           $1="-O2"
+                           $1="-g -O2"
                    fi
            fi
     else

o The config.sub and config.guess have been upgraded (in the distribution
  file they are just symlinks to the corresponding files in the nmap dir

o Changed pcap-linux.c by adding a select() call guarding recvfrom()
  to insure that it returns after the timeout period specified in
  pcap_open_live() rather than blocking forever.
--- libpcap-0.8.3/pcap-linux.c  2003-11-21 02:20:46.000000000 -0800
+++ libpcap-possiblymodified/pcap-linux.c       2004-07-31 22:34:47.000000000 -0700
@@ -27,7 +27,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /CVS/nmap/libpcap-possiblymodified/NMAP_MODIFICATIONS,v 1.6 2004/08/01 05:54:55 fyodor Exp $ (LBL)";
+    "@(#) $Header: /CVS/nmap/libpcap-possiblymodified/NMAP_MODIFICATIONS,v 1.6 2004/08/01 05:54:55 fyodor Exp $ (LBL)";
 #endif
 
 /*
@@ -96,6 +96,7 @@
 #include <netinet/in.h>
 #include <linux/if_ether.h>
 #include <net/if_arp.h>
+#include <assert.h>
 
 /*
  * If PF_PACKET is defined, we can use {SOCK_RAW,SOCK_DGRAM}/PF_PACKET
@@ -483,6 +484,32 @@
                        return -2;
                }
                fromlen = sizeof(from);
+               /* If the user specified a timeout in pcap_open_live(),
+                  we will honor the timeout and return even if no packets
+                  have arrived */
+               if (handle->md.timeout > 0) {
+                 fd_set readfs;
+                 struct timeval tv;
+                  int res;
+                 
+                  FD_ZERO(&readfs);
+                  FD_SET(handle->fd, &readfs);
+                  bzero((void *) &tv, sizeof(tv));
+                  tv.tv_sec = handle->md.timeout / 1000;
+                  tv.tv_usec = (handle->md.timeout % 1000 ) * 1000;
+                  do {
+                   /* since this is in pcap-linux.c, we can assume
+                      Linux select() behavior WRT decrementing tv */
+                    res = select(handle->fd + 1, &readfs, NULL, NULL, &tv);
+                   if (res == 1) break;
+                   if (res == 0) return 0;
+                   assert(res == -1);
+                   if (errno == EINTR) continue;
+                   snprintf(handle->errbuf, sizeof(handle->errbuf), "select: %s", pcap_strerror(errno));
+                   return -1;
+                 } while (1);
+               }
+
                packet_len = recvfrom(
                        handle->fd, bp + offset,
                        handle->bufsize - offset, MSG_TRUNC,

o Eliminated Lex/Yacc requirement (I now ship the generated .c files).
  This involved:

   o Changes to Makefile.in
--- libpcap-0.8.3/Makefile.in   2003-12-14 17:42:23.000000000 -0800
+++ libpcap-possiblymodified/Makefile.in        2004-07-31 22:34:47.000000000 -0700
@@ -17,7 +17,7 @@
 #  WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
 #  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 #
-# @(#) $Header: /CVS/nmap/libpcap-possiblymodified/NMAP_MODIFICATIONS,v 1.6 2004/08/01 05:54:55 fyodor Exp $ (LBL)
+# @(#) $Header: /CVS/nmap/libpcap-possiblymodified/NMAP_MODIFICATIONS,v 1.6 2004/08/01 05:54:55 fyodor Exp $ (LBL)
 
 #
 # Various configurable paths (remember to edit Makefile.in, not Makefile)
@@ -60,8 +60,8 @@
 # used by the generated parser.  This allows programs to use lex/yacc
 # and link against libpcap.  If you don't have flex or bison, get them.
 #
-LEX = @V_LEX@
-YACC = @V_YACC@
+LEX = flex
+YACC = yacc
 
 # Explicitly define compilation rule since SunOS 4's make doesn't like gcc.
 # Also, gcc does not remove the .o before forking 'as', which can be a
@@ -94,7 +94,7 @@
 TAGFILES = \
        $(SRC) $(HDR) $(TAGHDR)
 
-CLEANFILES = $(OBJ) libpcap.a $(GENSRC) $(GENHDR) lex.yy.c
+CLEANFILES = $(OBJ) libpcap.a version.c lex.yy.c
 
 all: libpcap.a
 
  o Ripped LEX/YACC detection code from configure.in:
--- libpcap-0.8.3/configure.in  2004-03-28 13:43:34.000000000 -0800
+++ libpcap-possiblymodified/configure.ac       2004-07-31 22:34:47.000000000 -0700
@@ -1,4 +1,4 @@
-dnl @(#) $Header: /CVS/nmap/libpcap-possiblymodified/NMAP_MODIFICATIONS,v 1.6 2004/08/01 05:54:55 fyodor Exp $ (LBL)
+dnl @(#) $Header: /CVS/nmap/libpcap-possiblymodified/NMAP_MODIFICATIONS,v 1.6 2004/08/01 05:54:55 fyodor Exp $ (LBL)
 dnl
 dnl Copyright (c) 1994, 1995, 1996, 1997
 dnl    The Regents of the University of California.  All rights reserved.
@@ -6,7 +6,7 @@
 dnl Process this file with autoconf to produce a configure script.
 dnl
 
-AC_REVISION($Revision: 1.6 $)
+AC_REVISION($Revision: 1.6 $)
 AC_PREREQ(2.50)
 AC_INIT(pcap.c)
 
@@ -341,25 +341,6 @@
        AC_MSG_ERROR(Specifying the capture type as 'dag' requires the DAG API to be present; use --with-dag=DIR)
 fi
 
-
-AC_LBL_LEX_AND_YACC(V_LEX, V_YACC, pcap_)
-if test "$V_LEX" = lex ; then
-# Some versions of lex can't handle the definitions section of scanner.l .
-# Try lexing it and complain if it can't deal.
-       AC_CACHE_CHECK([for capable lex], tcpdump_cv_capable_lex,
-               if lex -t scanner.l > /dev/null 2>&1; then
-                       tcpdump_cv_capable_lex=yes
-               else
-                       tcpdump_cv_capable_lex=insufficient
-               fi)
-       if test $tcpdump_cv_capable_lex = insufficient ; then
-               AC_MSG_ERROR([Your operating system's lex is insufficient to compile
- libpcap.  flex is a lex replacement that has many advantages, including
- being able to compile libpcap.  For more information, see
- http://www.gnu.org/software/flex/flex.html .])
-       fi
-fi
-
 case "$host_os" in
 
 aix*)
@@ -420,11 +401,9 @@
 AC_SUBST(V_DEFS)
 AC_SUBST(V_INCLS)
 AC_SUBST(V_LIBS)
-AC_SUBST(V_LEX)
 AC_SUBST(V_PCAP)
 AC_SUBST(V_FINDALLDEVS)
 AC_SUBST(V_RANLIB)
-AC_SUBST(V_YACC)
 AC_SUBST(SSRC)
 
 AC_PROG_INSTALL

