aboutsummaryrefslogtreecommitdiffstats
path: root/caputils/capture-wpcap.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2016-01-05 13:54:02 -0800
committerGuy Harris <guy@alum.mit.edu>2016-01-07 04:38:39 +0000
commitba3aa03dcfb49a3bb2b090b864f1311fa4ecbc0e (patch)
tree334369b53be04c07bbd6269e316c93fc3dba6d03 /caputils/capture-wpcap.c
parent97378a5bad8c20f4364b7fe86d96d9d14a192d48 (diff)
Move more capture device handling to the caputils library.
Move the code to open capture devices and get properties of capture devices there, joining the code to get a list of capture devices. This lets us do a better job of handling pcap_create() in WinPcap, including handling both WinPcap with pcap_create() and WinPcap without pcap_create() at run time, just in case somebody tries using WinPcap 3.x with a Wireshark built with WinPcap 4.x. It also could make it easier to use libpcap/WinPcap directly in Wireshark and TShark, if we have versions of libpcap/WinPcap that run small helper utilities to do privileged functions, allowing programs using them never to need elevated privileges themselves. That might make it easier to fix some issues with running TShark when not saving to a file (we could avoid the file entirely) and with delays when stopping a capture in Wireshark (Wireshark could stop writing to the file as soon as you click the stop button, rather than letting dumpcap do so when the signal gets to it). It might also make it easier to handle future versions of libpcap/WinPcap that support using pcap_create()/pcap_activate() for remote captures, and other future extensions to libpcap/WinPcap. Rename some XXX_linktype routines to XXX_datalink to indicate that they work with DLT_ values rather than LINKTYPE_ values; future versions of libpcap might use LINKTYPE_ values in newer APIs. Check for pcap_create() on all platforms in CMake. Change-Id: Ia12e1692c96ec945c07a135d246958771a29c817 Reviewed-on: https://code.wireshark.org/review/13062 Petri-Dish: Guy Harris <guy@alum.mit.edu> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Guy Harris <guy@alum.mit.edu>
Diffstat (limited to 'caputils/capture-wpcap.c')
-rw-r--r--caputils/capture-wpcap.c64
1 files changed, 49 insertions, 15 deletions
diff --git a/caputils/capture-wpcap.c b/caputils/capture-wpcap.c
index 26a64a92f1..50e8a06fa1 100644
--- a/caputils/capture-wpcap.c
+++ b/caputils/capture-wpcap.c
@@ -112,23 +112,23 @@ static int (*p_pcap_set_datalink)(pcap_t *, int);
#endif
#ifdef HAVE_PCAP_FREE_DATALINKS
-static int (*p_pcap_free_datalinks)(int *);
+static int (*p_pcap_free_datalinks)(int *);
#endif
#ifdef HAVE_BPF_IMAGE
-static char *(*p_bpf_image) (const struct bpf_insn *, int);
+static char *(*p_bpf_image)(const struct bpf_insn *, int);
#endif
#ifdef HAVE_PCAP_CREATE
-static pcap_t* (*p_pcap_create) (const char *, char *);
-static int (*p_pcap_set_snaplen) (pcap_t *, int);
-static int (*p_pcap_set_promisc) (pcap_t *, int);
-static int (*p_pcap_can_set_rfmon) (pcap_t *);
-static int (*p_pcap_set_rfmon) (pcap_t *, int);
-static int (*p_pcap_set_timeout) (pcap_t *, int);
-static int (*p_pcap_set_buffer_size) (pcap_t *, int);
-static int (*p_pcap_activate) (pcap_t *);
-static const char* (*p_pcap_statustostr)(int);
+static pcap_t *(*p_pcap_create)(const char *, char *);
+static int (*p_pcap_set_snaplen)(pcap_t *, int);
+static int (*p_pcap_set_promisc)(pcap_t *, int);
+static int (*p_pcap_can_set_rfmon)(pcap_t *);
+static int (*p_pcap_set_rfmon)(pcap_t *, int);
+static int (*p_pcap_set_timeout)(pcap_t *, int);
+static int (*p_pcap_set_buffer_size)(pcap_t *, int);
+static int (*p_pcap_activate)(pcap_t *);
+static const char *(*p_pcap_statustostr)(int);
#endif
typedef struct {
@@ -207,14 +207,14 @@ load_wpcap(void)
SYM(bpf_image, FALSE),
#endif
#ifdef HAVE_PCAP_CREATE
- SYM(pcap_create, FALSE),
- SYM(pcap_set_snaplen, FALSE),
- SYM(pcap_set_promisc, FALSE),
+ SYM(pcap_create, TRUE),
+ SYM(pcap_set_snaplen, TRUE),
+ SYM(pcap_set_promisc, TRUE),
SYM(pcap_can_set_rfmon, TRUE),
SYM(pcap_set_rfmon, TRUE),
SYM(pcap_set_timeout, FALSE),
SYM(pcap_set_buffer_size, FALSE),
- SYM(pcap_activate, FALSE),
+ SYM(pcap_activate, TRUE),
SYM(pcap_statustostr, TRUE),
#endif
{ NULL, NULL, FALSE }
@@ -981,6 +981,40 @@ cant_get_if_list_error_message(const char *err_str)
return g_strdup_printf("Can't get list of interfaces: %s", err_str);
}
+if_capabilities_t *
+get_if_capabilities_local(interface_options *interface_opts, char **err_str)
+{
+ /*
+ * We're not getting capaibilities for a remote device; use
+ * pcap_create() and pcap_activate() if we have them, so that
+ * we can set various options, otherwise use pcap_open_live().
+ */
+#ifdef HAVE_PCAP_CREATE
+ if (p_pcap_create != NULL)
+ return get_if_capabilities_pcap_create(interface_opts, err_str);
+#endif
+ return get_if_capabilities_pcap_open_live(interface_opts, err_str);
+}
+
+pcap_t *
+open_capture_device_local(capture_options *capture_opts,
+ interface_options *interface_opts, int timeout,
+ char (*open_err_str)[PCAP_ERRBUF_SIZE])
+{
+ /*
+ * We're not opening a remote device; use pcap_create() and
+ * pcap_activate() if we have them, so that we can set various
+ * options, otherwise use pcap_open_live().
+ */
+#ifdef HAVE_PCAP_CREATE
+ if (p_pcap_create != NULL)
+ return open_capture_device_pcap_create(capture_opts,
+ interface_opts, timeout, open_err_str);
+#endif
+ return open_capture_device_pcap_open_live(interface_opts, timeout,
+ open_err_str);
+}
+
/*
* Append the version of WinPcap with which we were compiled to a GString.
*/