]> 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 e5ebcb72ad8f732d3f336453b80cc98672e37126..e45db21eabbfd8f78806ac3e7b3bd39e19bf7d25 100644 (file)
@@ -23,8 +23,6 @@
 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/libpcap/filtertest.c,v 1.2 2005-08-08 17:50:13 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -53,6 +51,8 @@ static char *program_name;
 static void usage(void) __attribute__((noreturn));
 static void error(const char *, ...)
     __attribute__((noreturn, format (printf, 1, 2)));
+static void warn(const char *, ...)
+    __attribute__((format (printf, 1, 2)));
 
 extern int optind;
 extern int opterr;
@@ -125,6 +125,23 @@ error(const char *fmt, ...)
        /* NOTREACHED */
 }
 
+/* VARARGS */
+static void
+warn(const char *fmt, ...)
+{
+       va_list ap;
+
+       (void)fprintf(stderr, "%s: WARNING: ", program_name);
+       va_start(ap, fmt);
+       (void)vfprintf(stderr, fmt, ap);
+       va_end(ap);
+       if (*fmt) {
+               fmt += strlen(fmt);
+               if (fmt[-1] != '\n')
+                       (void)fputc('\n', stderr);
+       }
+}
+
 /*
  * Copy arg vector into a new buffer, concatenating arguments with spaces.
  */
@@ -170,6 +187,7 @@ main(int argc, char **argv)
        char *infile;
        int Oflag;
        long snaplen;
+       char *p;
        int dlt;
        bpf_u_int32 netmask = PCAP_NETMASK_UNKNOWN;
        char *cmdbuf;
@@ -192,7 +210,7 @@ main(int argc, char **argv)
        infile = NULL;
        Oflag = 1;
        snaplen = 68;
-  
+
        if ((cp = strrchr(argv[0], '/')) != NULL)
                program_name = cp + 1;
        else
@@ -248,9 +266,12 @@ main(int argc, char **argv)
        }
 
        dlt = pcap_datalink_name_to_val(argv[optind]);
-       if (dlt < 0)
-               error("invalid data link type %s", argv[optind]);
-       
+       if (dlt < 0) {
+               dlt = (int)strtol(argv[optind], &p, 10);
+               if (p == argv[optind] || *p != '\0')
+                       error("invalid data link type %s", argv[optind]);
+       }
+
        if (infile)
                cmdbuf = read_infile(infile);
        else
@@ -262,6 +283,10 @@ 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) {
@@ -272,6 +297,7 @@ main(int argc, char **argv)
        // 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);