Now that WinPcap is a DLL, I can load it at run-time rather than load-time.
authorgram <gram@f5534014-38df-0310-8fa8-9805f1628bb7>
Tue, 3 Apr 2001 05:26:27 +0000 (05:26 +0000)
committergram <gram@f5534014-38df-0310-8fa8-9805f1628bb7>
Tue, 3 Apr 2001 05:26:27 +0000 (05:26 +0000)
That means that I no longer need to distribute capture and non-capture
versions of Ethereal for Win32; one version (compiled with WinPcap headers)
can run on systems with or without WinPcap.

For systems that don't have WinPcap, instead of disabling the Capture
menu, Capture|Start brings up a dialogue informing the user that wpcap.dll
was not loadable, and gives a URL to the WinPcap home page.

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

Makefile.am
Makefile.nmake
capture-wpcap.c [new file with mode: 0644]
capture-wpcap.h [new file with mode: 0644]
gtk/capture_dlg.c
gtk/main.c
tethereal.c

index 33c89520559d6a200a24ff97e459f76246d545c0..5f43e7009547c536764d4a56a8dc5ae65405f990 100644 (file)
@@ -1,7 +1,7 @@
 # Makefile.am
 # Automake file for Ethereal
 #
-# $Id: Makefile.am,v 1.299 2001/04/01 06:11:24 hagbard Exp $
+# $Id: Makefile.am,v 1.300 2001/04/03 05:26:25 gram Exp $
 #
 # Ethereal - Network traffic analyzer
 # By Gerald Combs <gerald@zing.org>
@@ -585,6 +585,8 @@ DISTCLEANFILES =    \
 
 EXTRA_DIST = \
        aclocal-flags           \
+       capture-wpcap.c         \
+       capture-wpcap.h         \
        config.h.win32          \
        config.nmake            \
        debian/README.debian    \
index 6f6f9ec221d585a3691bfe4e49dc0288156bd4f9..50a7dea581078ccf73c6b3eef9ad7bc17453bf96 100644 (file)
@@ -1,7 +1,7 @@
 ## Makefile for building ethereal.exe with Microsoft C and nmake
 ## Use: $(MAKE) /$(MAKEFLAGS) -f makefile.nmake
 #
-# $Id: Makefile.nmake,v 1.91 2001/03/31 10:13:10 guy Exp $
+# $Id: Makefile.nmake,v 1.92 2001/04/03 05:26:25 gram Exp $
 
 include config.nmake
 include <win32.mak>
@@ -196,6 +196,7 @@ DISSECTOR_OBJECTS = $(DISSECTOR_SOURCES:.c=.obj)
 
 ETHEREAL_COMMON_OBJECTS = \
        asn1.obj         \
+       capture-wpcap.obj       \
        column.obj       \
        follow.obj       \
        getopt.obj       \
@@ -212,11 +213,11 @@ ETHEREAL_COMMON_OBJECTS = \
 ethereal_OBJECTS = \
        $(DISSECTOR_OBJECTS) \
        $(ETHEREAL_COMMON_OBJECTS) \
-       capture.obj      \
-       file.obj         \
-       filters.obj      \
+       capture.obj             \
+       file.obj                \
+       filters.obj             \
        proto_hier_stats.obj    \
-       summary.obj      \
+       summary.obj
 
 tethereal_OBJECTS = \
        $(DISSECTOR_OBJECTS) \
@@ -240,16 +241,15 @@ ethereal_LIBS= wiretap\wiretap-$(WTAP_VERSION).lib \
        $(GTK_DIR)\gtk\gtk-$(GTK_VERSION).lib \
        $(GTK_DIR)\gdk\gdk-$(GTK_VERSION).lib \
        $(GLIB_DIR)\glib-$(GLIB_VERSION).lib \
-       $(GLIB_DIR)\gmodule\gmodule-$(GLIB_VERSION).lib \
-       $(PCAP_DIR)\lib\wpcap.lib
+       $(GLIB_DIR)\gmodule\gmodule-$(GLIB_VERSION).lib
+#      $(PCAP_DIR)\lib\wpcap.lib
 
 tethereal_LIBS= wiretap\wiretap-$(WTAP_VERSION).lib \
        epan\ethereal.lib \
        epan\dfilter\dfilter.lib epan\ftypes\ftypes.lib \
        wsock32.lib user32.lib \
        $(GLIB_DIR)\glib-$(GLIB_VERSION).lib \
-       $(GLIB_DIR)\gmodule\gmodule-$(GLIB_VERSION).lib \
-       $(PCAP_DIR)\lib\wpcap.lib
+       $(GLIB_DIR)\gmodule\gmodule-$(GLIB_VERSION).lib
 
 editcap_LIBS= wiretap\wiretap-$(WTAP_VERSION).lib \
        wsock32.lib user32.lib \
@@ -260,8 +260,7 @@ dftest_LIBS= epan\ethereal.lib \
        epan\dfilter\dfilter.lib epan\ftypes\ftypes.lib \
        wsock32.lib user32.lib \
        $(GLIB_DIR)\glib-$(GLIB_VERSION).lib \
-       $(GLIB_DIR)\gmodule\gmodule-$(GLIB_VERSION).lib \
-       $(PCAP_DIR)\lib\wpcap.lib
+       $(GLIB_DIR)\gmodule\gmodule-$(GLIB_VERSION).lib
 
 EXECUTABLES=ethereal.exe tethereal.exe editcap.exe
 
diff --git a/capture-wpcap.c b/capture-wpcap.c
new file mode 100644 (file)
index 0000000..843a63f
--- /dev/null
@@ -0,0 +1,205 @@
+/* capture-wpcap.c
+ * Try to load WinPcap DLL at run-time.
+ *
+ * $Id: capture-wpcap.c,v 1.1 2001/04/03 05:26:26 gram Exp $
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@zing.org>
+ * Copyright 2001 Gerald Combs
+ *
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <glib.h>
+#include <gmodule.h>
+
+#ifdef HAVE_LIBPCAP
+#include <pcap.h>
+#endif
+
+/* XXX - yes, I know, I should move cppmagic.h to a generic location. */
+#include "tools/lemon/cppmagic.h"
+
+gboolean has_wpcap = FALSE;
+
+#ifdef HAVE_LIBPCAP
+
+
+static char*   (*p_pcap_lookupdev) (char *);
+static void    (*p_pcap_close) (pcap_t *);
+static int     (*p_pcap_stats) (pcap_t *, struct pcap_stat *);
+static int     (*p_pcap_dispatch) (pcap_t *, int, pcap_handler, u_char *);
+static int     (*p_pcap_snapshot) (pcap_t *);
+static int     (*p_pcap_datalink) (pcap_t *);
+static int     (*p_pcap_setfilter) (pcap_t *, struct bpf_program *);
+static char*   (*p_pcap_geterr) (pcap_t *);
+static int     (*p_pcap_compile) (pcap_t *, struct bpf_program *, char *, int,
+                       bpf_u_int32);
+static int     (*p_pcap_lookupnet) (char *, bpf_u_int32 *, bpf_u_int32 *,
+                       char *);
+static pcap_t* (*p_pcap_open_live) (char *, int, int, int, char *);
+static int     (*p_pcap_loop) (pcap_t *, int, pcap_handler, u_char *);
+
+typedef struct {
+       const char      *name;
+       gpointer        *ptr;
+} symbol_table_t;
+
+#define SYM(x) STRINGIFY(x) , (gpointer) &CONCAT(p_,x)
+
+void
+load_wpcap(void)
+{
+
+       /* These are the symbols I need from Wpcap */
+       symbol_table_t  symbols[] = {
+               SYM(pcap_lookupdev),
+               SYM(pcap_close),
+               SYM(pcap_stats),
+               SYM(pcap_dispatch),
+               SYM(pcap_snapshot),
+               SYM(pcap_datalink),
+               SYM(pcap_setfilter),
+               SYM(pcap_geterr),
+               SYM(pcap_compile),
+               SYM(pcap_lookupnet),
+               SYM(pcap_open_live),
+               SYM(pcap_loop),
+               NULL, NULL
+       };
+
+       GModule         *wh; /* wpcap handle */
+       symbol_table_t  *sym;
+
+       wh = g_module_open("wpcap", 0);
+
+       if (!wh) {
+               return;
+       }
+
+       sym = symbols;
+       while (sym && sym->name) {
+               if (!g_module_symbol(wh, sym->name, sym->ptr)) {
+                       return;
+               }
+               sym++;
+       }
+
+
+       has_wpcap = TRUE;
+}
+
+char*
+pcap_lookupdev (char *a)
+{
+       g_assert(has_wpcap);
+       return p_pcap_lookupdev(a);
+}
+
+void
+pcap_close(pcap_t *a)
+{
+       g_assert(has_wpcap);
+       p_pcap_close(a);
+}
+
+int
+pcap_stats(pcap_t *a, struct pcap_stat *b)
+{
+       g_assert(has_wpcap);
+       return p_pcap_stats(a, b);
+}
+
+int
+pcap_dispatch(pcap_t *a, int b, pcap_handler c, u_char *d)
+{
+       g_assert(has_wpcap);
+       return p_pcap_dispatch(a, b, c, d);
+}
+
+
+int
+pcap_snapshot(pcap_t *a)
+{
+       g_assert(has_wpcap);
+       return p_pcap_snapshot(a);
+}
+
+
+int
+pcap_datalink(pcap_t *a)
+{
+       g_assert(has_wpcap);
+       return p_pcap_datalink(a);
+}
+
+int
+pcap_setfilter(pcap_t *a, struct bpf_program *b)
+{
+       g_assert(has_wpcap);
+       return p_pcap_setfilter(a, b);
+}
+
+char*
+pcap_geterr(pcap_t *a)
+{
+       g_assert(has_wpcap);
+       return p_pcap_geterr(a);
+}
+
+int
+pcap_compile(pcap_t *a, struct bpf_program *b, char *c, int d,
+            bpf_u_int32 e)
+{
+       g_assert(has_wpcap);
+       return p_pcap_compile(a, b, c, d, e);
+}
+
+int
+pcap_lookupnet(char *a, bpf_u_int32 *b, bpf_u_int32 *c, char *d)
+{
+       g_assert(has_wpcap);
+       return p_pcap_lookupnet(a, b, c, d);
+}
+
+pcap_t*
+pcap_open_live(char *a, int b, int c, int d, char *e)
+{
+       g_assert(has_wpcap);
+       return p_pcap_open_live(a, b, c, d, e);
+}
+
+int
+pcap_loop(pcap_t *a, int b, pcap_handler c, u_char *d)
+{
+       g_assert(has_wpcap);
+       return p_pcap_loop(a, b, c, d);
+}
+
+#else /* HAVE_LIBPCAP */
+
+void
+load_wpcap(void)
+{
+       return;
+}
+
+
+#endif /* HAVE_LIBPCAP */
diff --git a/capture-wpcap.h b/capture-wpcap.h
new file mode 100644 (file)
index 0000000..8324980
--- /dev/null
@@ -0,0 +1,34 @@
+/* capture-wpcap.h
+ *
+ * $Id: capture-wpcap.h,v 1.1 2001/04/03 05:26:26 gram Exp $
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@zing.org>
+ * Copyright 2001 Gerald Combs
+ *
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#ifndef CAPTURE_WPCAP_H
+#define CAPTURE_WPCAP_H
+
+extern gboolean has_wpcap;
+
+
+void
+load_wpcap(void);
+
+#endif
index 1ae2796bebd279d503d1c06ff21f5030da62779b..7d0a7a6ccceb2d1c6c08ca7ca6279001dbd537e9 100644 (file)
@@ -1,7 +1,7 @@
 /* capture_dlg.c
  * Routines for packet capture windows
  *
- * $Id: capture_dlg.c,v 1.37 2001/01/28 23:56:29 guy Exp $
+ * $Id: capture_dlg.c,v 1.38 2001/04/03 05:26:27 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
 #include "dlg_utils.h"
 #include "util.h"
 
+#ifdef _WIN32
+#include "capture-wpcap.h"
+#endif
+
 /* Capture callback data keys */
 #define E_CAP_IFACE_KEY       "cap_iface"
 #define E_CAP_FILT_KEY        "cap_filter_te"
@@ -130,6 +134,18 @@ capture_prep_cb(GtkWidget *w, gpointer d)
     return;
   }
 
+#ifdef _WIN32
+  /* Is WPcap loaded? */
+  if (!has_wpcap) {
+         simple_dialog(ESD_TYPE_CRIT, NULL,
+                         "Unable to load wpcap.dll: capturing not enabled.\n"
+                         "See http://netgroup-serv.polito.it/winpcap/ for\n"
+                         "more details.");
+         return;
+  }
+#endif
+         
+
   if_list = get_interface_list(&err, err_str);
   if (if_list == NULL && err == CANT_GET_INTERFACE_LIST) {
     simple_dialog(ESD_TYPE_WARN, NULL, "Can't get list of interfaces: %s",
index 936555dac420039583c9082120272ea607513a1d..fa6445fa5790ad9aed1604c4bc0d79c0555dae96 100644 (file)
@@ -1,6 +1,6 @@
 /* main.c
  *
- * $Id: main.c,v 1.187 2001/04/02 09:53:46 guy Exp $
+ * $Id: main.c,v 1.188 2001/04/03 05:26:27 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
 #include "strutil.h"
 #include "register.h"
 
+#ifdef WIN32
+#include "capture-wpcap.h"
+#endif
+
+
 packet_info  pi;
 capture_file cfile;
 GtkWidget   *top_level, *packet_list, *tree_view, *byte_nb_ptr,
@@ -1113,6 +1118,9 @@ main(int argc, char *argv[])
   }
 
 #ifdef WIN32
+  /* Load wpcap if possible */
+  load_wpcap();
+
   /* Start windows sockets */
   WSAStartup( MAKEWORD( 1, 1 ), &wsaData );
 #endif
index 915255b1394f18371a9407c1ee628e2a7c939be7..6310d2f294c2d8ae58f54820c19a20d516178bd5 100644 (file)
@@ -1,6 +1,6 @@
 /* tethereal.c
  *
- * $Id: tethereal.c,v 1.73 2001/04/02 00:38:33 hagbard Exp $
+ * $Id: tethereal.c,v 1.74 2001/04/03 05:26:26 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
 #include "plugins.h"
 #include "register.h"
 
+#ifdef WIN32
+#include "capture-wpcap.h"
+#endif
+
 static guint32 firstsec, firstusec;
 static guint32 prevsec, prevusec;
 static GString *comp_info_str;
@@ -230,6 +234,9 @@ main(int argc, char *argv[])
     fprintf(stderr, "Can't open your preferences file \"%s\": %s.\n", pf_path,
         strerror(pf_open_errno));
   }
+
+  /* Load Wpcap, if possible */
+  load_wpcap();
     
   /* Initialize the capture file struct */
   cfile.plist          = NULL;
@@ -540,6 +547,14 @@ main(int argc, char *argv[])
     /* No capture file specified, so we're supposed to do a live capture;
        do we have support for live captures? */
 #ifdef HAVE_LIBPCAP
+
+#ifdef _WIN32
+    if (!has_wpcap) {
+       fprintf(stderr, "tethereal: Could not load wpcap.dll.\n");
+       exit(2);
+    }
+#endif
+
     /* Yes; did the user specify an interface to use? */
     if (cfile.iface == NULL) {
         /* No - pick the first one from the list of interfaces. */