]> The Tcpdump Group git mirrors - libpcap/blobdiff - tests/filtertest.c
issue: https://github.com/the-tcpdump-group/libpcap/pull/319
[libpcap] / tests / filtertest.c
index a36490d4c58efccbc9098a63f6600e412fa2e411..e45db21eabbfd8f78806ac3e7b3bd39e19bf7d25 100644 (file)
@@ -57,6 +57,9 @@ static void warn(const char *, ...)
 extern int optind;
 extern int opterr;
 extern char *optarg;
+#ifdef BDEBUG
+int dflag;
+#endif
 
 /*
  * On Windows, we need to open the file in binary mode, so that
@@ -178,7 +181,9 @@ main(int argc, char **argv)
 {
        char *cp;
        int op;
+#ifndef BDEBUG
        int dflag;
+#endif
        char *infile;
        int Oflag;
        long snaplen;
@@ -193,11 +198,19 @@ main(int argc, char **argv)
        if(wsockinit() != 0) return 1;
 #endif /* WIN32 */
 
+#ifndef BDEBUG
        dflag = 1;
+#else
+       /* if optimizer debugging is enabled, output DOT graph
+        * `dflag=4' is equivalent to -dddd to follow -d/-dd/-ddd
+     * convention in tcpdump command line
+        */
+       dflag = 4;
+#endif
        infile = NULL;
        Oflag = 1;
        snaplen = 68;
-  
+
        if ((cp = strrchr(argv[0], '/')) != NULL)
                program_name = cp + 1;
        else
@@ -258,7 +271,7 @@ main(int argc, char **argv)
                if (p == argv[optind] || *p != '\0')
                        error("invalid data link type %s", argv[optind]);
        }
-       
+
        if (infile)
                cmdbuf = read_infile(infile);
        else
@@ -270,8 +283,21 @@ main(int argc, char **argv)
 
        if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0)
                error("%s", pcap_geterr(pd));
+
        if (!bpf_validate(fcode.bf_insns, fcode.bf_len))
                warn("Filter doesn't pass validation");
+
+#ifdef BDEBUG
+       // replace line feed with space
+       for (cp = cmdbuf; *cp != '\0'; ++cp) {
+               if (*cp == '\r' || *cp == '\n') {
+                       *cp = ' ';
+               }
+       }
+       // only show machine code if BDEBUG defined, since dflag > 3
+       printf("machine codes for filter: %s\n", cmdbuf);
+#endif
+
        bpf_dump(&fcode, dflag);
        pcap_close(pd);
        exit(0);