]> The Tcpdump Group git mirrors - tcpdump/blobdiff - tcpdump.c
Check for a TCP header length that's too short, report more information
[tcpdump] / tcpdump.c
index 3983a33e9e8fd1fef2e0f96cb8a4c7238bdbb04e..3f175c28fa15f5d082f82748aff1c16aa445d0ea 100644 (file)
--- a/tcpdump.c
+++ b/tcpdump.c
@@ -30,7 +30,7 @@ static const char copyright[] _U_ =
     "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\
 The Regents of the University of California.  All rights reserved.\n";
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.216.2.6 2003-12-29 22:42:22 hannes Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.216.2.12 2004-06-15 00:01:52 guy Exp $ (LBL)";
 #endif
 
 /*
@@ -205,6 +205,9 @@ static struct printer printers[] = {
 #endif
 #ifdef DLT_ENC
        { enc_if_print,         DLT_ENC },
+#endif
+#ifdef DLT_APPLE_IP_OVER_IEEE1394
+       { ap1394_if_print,      DLT_APPLE_IP_OVER_IEEE1394 },
 #endif
        { NULL,                 0 },
 };
@@ -494,6 +497,7 @@ main(int argc, char **argv)
                                      program_name, optarg);
                        (void)fprintf(stderr, "(no libsmi support)\n");
 #endif
+                       break;
 
                case 'O':
                        Oflag = 0;
@@ -611,7 +615,7 @@ main(int argc, char **argv)
                        /* NOTREACHED */
                }
 
-       if (tflag > 0)
+       if (tflag > 0 || tflag == -3)
                thiszone = gmt2local(0);
 
        if (RFileName != NULL) {
@@ -655,11 +659,8 @@ main(int argc, char **argv)
                                error("%s", ebuf);
                }
 #ifdef WIN32
-               if(IsTextUnicode(device,  
-                       wcslen((short*)device),                // Device always ends with a double \0, so this way to determine its 
-                                                                                                       // length should be always valid
-                       NULL))
-               {
+               if(strlen(device) == 1) //we assume that an ASCII string is always longer than 1 char
+               {                                               //a Unicode string has a \0 as second byte (so strlen() is 1)
                        fprintf(stderr, "%s: listening on %ws\n", program_name, device);
                }
                else
@@ -940,13 +941,18 @@ dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *s
         * file could put it over Cflag.
         */
        if (ftell((FILE *)dump_info->p) > Cflag) {
+               /*
+                * Close the current file and open a new one.
+                */
+               pcap_dump_close(dump_info->p);
+               if (cnt >= 1000)
+                       error("too many output files");
                name = (char *) malloc(strlen(dump_info->WFileName) + 4);
                if (name == NULL)
                        error("dump_packet_and_trunc: malloc");
                strcpy(name, dump_info->WFileName);
                swebitoa(cnt, name + strlen(dump_info->WFileName));
                cnt++;
-               pcap_dump_close(dump_info->p);
                dump_info->p = pcap_dump_open(dump_info->pd, name);
                free(name);
                if (dump_info->p == NULL)
@@ -1053,7 +1059,7 @@ print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
        char WDversion[]="current-cvs.tcpdump.org";
        char version[]="current-cvs.tcpdump.org";
        char pcap_version[]="current-cvs.tcpdump.org";
-       char Wpcap_version[]="3.0 alpha";
+       char Wpcap_version[]="3.1";
 #endif
 
 /*
@@ -1088,8 +1094,12 @@ usage(void)
 #endif /* HAVE_PCAP_LIB_VERSION */
 
 #ifdef HAVE_PCAP_LIB_VERSION
+#ifdef WIN32
+       (void)fprintf(stderr, "%s version %s, based on tcpdump version %s\n", program_name, WDversion, version);
+#else /* WIN32 */
        (void)fprintf(stderr, "%s version %s\n", program_name, version);
-       (void)fprintf(stderr, "%s\n", pcap_lib_version());
+#endif /* WIN32 */
+       (void)fprintf(stderr, "%s\n",pcap_lib_version());
 #else /* HAVE_PCAP_LIB_VERSION */
 #ifdef WIN32
        (void)fprintf(stderr, "%s version %s, based on tcpdump version %s\n", program_name, WDversion, version);