aboutsummaryrefslogtreecommitdiffstats
path: root/capture_loop.h
diff options
context:
space:
mode:
authorUlf Lamping <ulf.lamping@web.de>2005-12-13 22:48:58 +0000
committerUlf Lamping <ulf.lamping@web.de>2005-12-13 22:48:58 +0000
commit79217bab2ebb0d2811e130bea6334c8227a88a28 (patch)
treec1eaf102b2b809cf7c36ee980beae74a5db9121b /capture_loop.h
parent459c0b07b205939f0ffd339b7c4b18843fcc9d1f (diff)
HUGE STEP (hopefully toward the right direction):
remove a lot of redundant code from tethereal and use (move) stuff from capture_loop.c instead. concentrate common capture related code in capture_opts.c, e.g. trying to find the right interface to capture from (command line option, preference, first usable) instead of duplicating this code over several files. remove redundant code from dumpcap.c this also implements command line option -D (and indexed interfaces at -i) for Ethereal and Dumpcap (as we have it in Tethereal already for a while) svn path=/trunk/; revision=16787
Diffstat (limited to 'capture_loop.h')
-rw-r--r--capture_loop.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/capture_loop.h b/capture_loop.h
index 1a89d90f5a..4336927c4c 100644
--- a/capture_loop.h
+++ b/capture_loop.h
@@ -40,4 +40,114 @@ extern int capture_loop_start(capture_options *capture_opts, gboolean *stats_kn
extern void capture_loop_stop(void);
+/*** the following is internal only (should be moved to capture_loop_int.h) ***/
+
+
+/*
+ * We don't want to do a "select()" on the pcap_t's file descriptor on
+ * BSD (because "select()" doesn't work correctly on BPF devices on at
+ * least some releases of some flavors of BSD), and we don't want to do
+ * it on Windows (because "select()" is something for sockets, not for
+ * arbitrary handles). (Note that "Windows" here includes Cygwin;
+ * even in its pretend-it's-UNIX environment, we're using WinPcap, not
+ * a UNIX libpcap.)
+ *
+ * We *do* want to do it on other platforms, as, on other platforms (with
+ * the possible exception of Ultrix and Digital UNIX), the read timeout
+ * doesn't expire if no packets have arrived, so a "pcap_dispatch()" call
+ * will block until packets arrive, causing the UI to hang.
+ *
+ * XXX - the various BSDs appear to define BSD in <sys/param.h>; we don't
+ * want to include it if it's not present on this platform, however.
+ */
+#if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) && \
+ !defined(__bsdi__) && !defined(__APPLE__) && !defined(_WIN32) && \
+ !defined(__CYGWIN__)
+# define MUST_DO_SELECT
+#endif
+
+typedef void (*capture_packet_cb_fct)(u_char *, const struct pcap_pkthdr *, const u_char *);
+
+
+/* moved from capture_loop.c here, so we can combine it (and the related functions) with tethereal */
+/* XXX - should be moved back to capture_loop.c */
+/* E: capture_loop.c only (Ethereal/dumpcap) T: tethereal only */
+typedef struct _loop_data {
+ /* common */
+ gboolean go; /* TRUE as long as we're supposed to keep capturing */
+ int err; /* E: if non-zero, error seen while capturing */
+ gint packet_count; /* Number of packets we have already captured */
+ gint packet_max; /* E: Number of packets we're supposed to capture - 0 means infinite */
+
+ jmp_buf stopenv; /* T: starting point of loop (jump back this point on SIG...) */
+
+ char *save_file; /* T: Name of file to which we're writing */
+ gboolean output_to_pipe; /* T: output to a pipe, flush outut file immediately */
+ capture_packet_cb_fct packet_cb; /* callback for a single captured packet */
+
+ /* pcap "input file" */
+ pcap_t *pcap_h; /* pcap handle */
+ gboolean pcap_err; /* E: TRUE if error from pcap */
+#ifdef MUST_DO_SELECT
+ int pcap_fd; /* pcap file descriptor */
+#endif
+
+ /* capture pipe (unix only "input file") */
+ gboolean from_cap_pipe; /* TRUE if we are capturing data from a capture pipe */
+#ifndef _WIN32
+ struct pcap_hdr cap_pipe_hdr; /* ? */
+ struct pcaprec_modified_hdr cap_pipe_rechdr; /* ? */
+ int cap_pipe_fd; /* the file descriptor of the capture pipe */
+ gboolean cap_pipe_modified; /* TRUE if data in the pipe uses modified pcap headers */
+ gboolean cap_pipe_byte_swapped; /* TRUE if data in the pipe is byte swapped */
+ unsigned int cap_pipe_bytes_to_read;/* Used by cap_pipe_dispatch */
+ unsigned int cap_pipe_bytes_read; /* Used by cap_pipe_dispatch */
+ enum {
+ STATE_EXPECT_REC_HDR,
+ STATE_READ_REC_HDR,
+ STATE_EXPECT_DATA,
+ STATE_READ_DATA
+ } cap_pipe_state;
+ enum { PIPOK, PIPEOF, PIPERR, PIPNEXIST } cap_pipe_err;
+#endif
+
+ /* wiretap (output file) */
+ wtap_dumper *wtap_pdh;
+ gint wtap_linktype;
+
+} loop_data;
+
+
+
+/** init the capture filter */
+extern gboolean
+capture_loop_init_filter(pcap_t *pcap_h, gboolean from_cap_pipe, const gchar * iface, gchar * cfilter, char *errmsg, int errmsg_len);
+
+/** Take care of byte order in the libpcap headers read from pipes. */
+extern void
+cap_pipe_adjust_header(gboolean byte_swapped, struct pcap_hdr *hdr, struct pcaprec_hdr *rechdr);
+
+#ifdef HAVE_LIBPCAP
+#ifndef _WIN32
+extern int
+cap_pipe_open_live(char *, struct pcap_hdr *, loop_data *, char *, int);
+
+extern int
+cap_pipe_dispatch(int, loop_data *, struct pcap_hdr *, \
+ struct pcaprec_modified_hdr *, guchar *, char *, int);
+#endif /* _WIN32 */
+#endif
+
+extern gboolean
+capture_loop_open_input(capture_options *capture_opts, loop_data *ld, char *errmsg, int errmsg_len);
+
+extern gboolean
+capture_loop_open_output(capture_options *capture_opts, int *save_file_fd, char *errmsg, int errmsg_len);
+
+extern gboolean
+capture_loop_init_wiretap_output(capture_options *capture_opts, int save_file_fd, loop_data *ld, char *errmsg, int errmsg_len);
+
+extern gboolean
+capture_loop_close_output(capture_options *capture_opts, loop_data *ld, int *err_close);
+
#endif /* capture_loop.h */