aboutsummaryrefslogtreecommitdiffstats
path: root/capture_loop.h
diff options
context:
space:
mode:
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 */