If we have "pcap_freecode()", use it to free the instructions for a BPF
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Wed, 23 Mar 2005 01:25:01 +0000 (01:25 +0000)
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Wed, 23 Mar 2005 01:25:01 +0000 (01:25 +0000)
filter after installing the filter.

Set HAVE_PCAP_LIB_VERSION if we're building with WinPcap 3.1; it's not
present in earlier versions, but is present in current 3.1 betas.

Check HAVE_PCAP_LIB_VERSION when building capture-wpcap.c.

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@13872 f5534014-38df-0310-8fa8-9805f1628bb7

Makefile.nmake
acinclude.m4
capture-wpcap.c
capture_loop.c
config.nmake
tethereal.c

index 7022520aafd901f4182bc14c5a5e00b7ebb4cbe3..8c681ac33a3b432c02c16adc5a60ed2613ee7e4a 100644 (file)
@@ -205,6 +205,7 @@ config.h    : config.h.win32 config.nmake
            -e "s/@HAVE_PCAP_FINDALLDEVS@/$(PCAP_FINDALLDEVS_CONFIG)/" \
            -e "s/@HAVE_PCAP_DATALINK_NAME_TO_VAL@/$(PCAP_DATALINK_NAME_TO_VAL_CONFIG)/" \
            -e "s/@HAVE_PCAP_DATALINK_VAL_TO_NAME@/$(PCAP_DATALINK_VAL_TO_NAME_CONFIG)/" \
+           -e "s/@HAVE_PCAP_LIB_VERSION@/$(PCAP_LIB_VERSION_CONFIG)/" \
            -e "s/@HAVE_LIBETHEREALDLL@/$(LIBETHEREAL_CONFIG)/" \
            -e "s/@WPCAP_CONSTIFIED@/$(WPCAP_CONSTIFIED_CONFIG)/" \
            < config.h.win32 > $@
index b29eabb588bb21a197663b43f7395f76ce3bb5b1..334c13d7c948f69e79fa2da02422f0c01c86e3e8 100644 (file)
@@ -419,7 +419,7 @@ and did you also install that package?]]))
        else
                AC_MSG_RESULT(no)
        fi
-       AC_CHECK_FUNCS(pcap_open_dead)
+       AC_CHECK_FUNCS(pcap_open_dead pcap_freecode)
        #
        # Later versions of Mac OS X 10.3[.x] ship a pcap.h that
        # doesn't define pcap_if_t but ship an 0.8[.x] libpcap,
index 7d88073e69892619b5de75b488a59a521945f8e7..9163b2997d97c2fa5410f9609cb33a91e75814e6 100644 (file)
@@ -65,6 +65,7 @@ static int     (*p_pcap_lookupnet) (char *, bpf_u_int32 *, bpf_u_int32 *,
 static pcap_t* (*p_pcap_open_live) (char *, int, int, int, char *);
 #endif
 static int     (*p_pcap_loop) (pcap_t *, int, pcap_handler, guchar *);
+static void    (*p_pcap_freecode) (struct bpf_program *);
 #ifdef HAVE_PCAP_FINDALLDEVS
 static int     (*p_pcap_findalldevs) (pcap_if_t **, char *);
 static void    (*p_pcap_freealldevs) (pcap_if_t *);
@@ -75,7 +76,9 @@ static int (*p_pcap_datalink_name_to_val) (const char *);
 #ifdef HAVE_PCAP_DATALINK_VAL_TO_NAME
 static const char *(*p_pcap_datalink_val_to_name) (int);
 #endif
+#ifdef HAVE_PCAP_LIB_VERSION
 static const char *(*p_pcap_lib_version) (void);
+#endif
 static int     (*p_pcap_setbuff) (pcap_t *, int dim);
 
 typedef struct {
@@ -104,6 +107,7 @@ load_wpcap(void)
                SYM(pcap_lookupnet, FALSE),
                SYM(pcap_open_live, FALSE),
                SYM(pcap_loop, FALSE),
+               SYM(pcap_freecode, FALSE),
 #ifdef HAVE_PCAP_FINDALLDEVS
                SYM(pcap_findalldevs, TRUE),
                SYM(pcap_freealldevs, TRUE),
@@ -114,7 +118,9 @@ load_wpcap(void)
 #ifdef HAVE_PCAP_DATALINK_VAL_TO_NAME
                SYM(pcap_datalink_val_to_name, TRUE),
 #endif
+#ifdef HAVE_PCAP_LIB_VERSION
                SYM(pcap_lib_version, TRUE),
+#endif
                SYM(pcap_setbuff, TRUE),
                { NULL, NULL, FALSE }
        };
@@ -179,7 +185,6 @@ pcap_dispatch(pcap_t *a, int b, pcap_handler c, guchar *d)
        return p_pcap_dispatch(a, b, c, d);
 }
 
-
 int
 pcap_snapshot(pcap_t *a)
 {
@@ -187,7 +192,6 @@ pcap_snapshot(pcap_t *a)
        return p_pcap_snapshot(a);
 }
 
-
 int
 pcap_datalink(pcap_t *a)
 {
@@ -246,6 +250,13 @@ pcap_loop(pcap_t *a, int b, pcap_handler c, guchar *d)
        return p_pcap_loop(a, b, c, d);
 }
 
+void
+pcap_freecode(struct bpf_program *a)
+{
+       g_assert(has_wpcap);
+       p_pcap_freecode(a);
+}
+
 #ifdef HAVE_PCAP_FINDALLDEVS
 int
 pcap_findalldevs(pcap_if_t **a, char *b)
@@ -621,9 +632,12 @@ get_runtime_pcap_version(GString *str)
                }
 
                g_string_sprintfa(str, "with ");
+#ifdef HAVE_PCAP_LIB_VERSION
                if (p_pcap_lib_version != NULL)
                        g_string_sprintfa(str, p_pcap_lib_version());
-               else if (packetVer != NULL)
+               else
+#endif
+               if (packetVer != NULL)
                        g_string_sprintfa(str, "WinPcap (%s)", packetVer);
                else
                        g_string_append(str, "WinPcap (version unknown)");
index 88fe54241bd33ea2fc87eac33e48dea2cb497fae..1f947fa6f1ed1c0128c34cf267ff1e12c779e211 100644 (file)
@@ -764,8 +764,14 @@ static int capture_loop_init_filter(loop_data *ld, const gchar * iface, gchar *
     if (pcap_setfilter(ld->pcap_h, &fcode) < 0) {
       g_snprintf(errmsg, errmsg_len, "Can't install filter (%s).",
        pcap_geterr(ld->pcap_h));
+#ifdef HAVE_PCAP_FREECODE
+      pcap_freecode(&fcode);
+#endif
       return FALSE;
     }
+#ifdef HAVE_PCAP_FREECODE
+    pcap_freecode(&fcode);
+#endif
   }
 
   return TRUE;
index 865e747528454fcf4bd09e2961528e558612f444..59ee1b1a33ea8e5c4a9f7b9b690d5c0383ff0af5 100644 (file)
@@ -284,11 +284,17 @@ PCAP_FINDALLDEVS_CONFIG=
 PCAP_DATALINK_VAL_TO_NAME_CONFIG=
 WPCAP_CONSTIFIED=
 !ENDIF
+!IF "$(WINPCAP_VERSION)" == "3.1"
+PCAP_LIB_VERSION_CONFIG=^#define HAVE_PCAP_LIB_VERSION 1
+!ELSE
+PCAP_LIB_VERSION_CONFIG=
+!ENDIF
 !ELSE
 WINPCAP_CONFIG=
 PCAP_FINDALLDEVS_CONFIG=
 PCAP_DATALINK_NAME_TO_VAL_CONFIG=
 PCAP_DATALINK_VAL_TO_NAME_CONFIG=
+PCAP_LIB_VERSION_CONFIG=
 WPCAP_CONSTIFIED=
 !ENDIF
 
index ef6e5cd2afa2f1ec3c72618c7d9877f503b173c1..1bdf2e48e3904df5fd44f4f0245c6904dc0b7f1a 100644 (file)
@@ -1651,8 +1651,14 @@ capture(char *save_file, int out_file_type)
     if (pcap_setfilter(ld.pch, &fcode) < 0) {
       snprintf(errmsg, sizeof errmsg, "Can't install filter (%s).",
        pcap_geterr(ld.pch));
+#ifdef HAVE_PCAP_FREECODE
+      pcap_freecode(&fcode);
+#endif
       goto error;
     }
+#ifdef HAVE_PCAP_FREECODE
+    pcap_freecode(&fcode);
+#endif
   }
 
   /* Set up to write to the capture file. */