2 * Definitions for file structures and routines
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <gerald@wireshark.org>
8 * Copyright 1998 Gerald Combs
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28 #include "packet-range.h"
29 #include "wiretap/wtap.h"
30 #include <epan/dfilter/dfilter.h>
33 #include <epan/epan.h>
39 #endif /* __cplusplus */
41 /** Return values from functions that only can succeed or fail. */
43 CF_OK, /**< operation succeeded */
44 CF_ERROR /**< operation got an error (function may provide err with details) */
47 /** Return values from functions that read capture files. */
49 CF_READ_OK, /**< operation succeeded */
50 CF_READ_ERROR, /**< operation got an error (function may provide err with details) */
51 CF_READ_ABORTED /**< operation aborted by user */
54 /** Return values from functions that print sets of packets. */
56 CF_PRINT_OK, /**< print operation succeeded */
57 CF_PRINT_OPEN_ERROR, /**< print operation failed while opening printer */
58 CF_PRINT_WRITE_ERROR /**< print operation failed while writing to the printer */
64 cf_cb_file_read_started,
65 cf_cb_file_read_finished,
66 cf_cb_file_reload_started,
67 cf_cb_file_reload_finished,
68 cf_cb_packet_selected,
69 cf_cb_packet_unselected,
70 cf_cb_field_unselected,
71 cf_cb_file_save_started,
72 cf_cb_file_save_finished,
73 cf_cb_file_save_failed
76 typedef void (*cf_callback_t) (gint event, gpointer data, gpointer user_data);
82 gboolean frame_matched;
87 cf_callback_add(cf_callback_t func, gpointer user_data);
90 cf_callback_remove(cf_callback_t func);
93 * Open a capture file.
95 * @param cf the capture file to be opened
96 * @param fname the filename to be opened
97 * @param is_tempfile is this a temporary file?
98 * @param err error code
99 * @return one of cf_status_t
101 cf_status_t cf_open(capture_file *cf, const char *fname, gboolean is_tempfile, int *err);
104 * Close a capture file.
106 * @param cf the capture file to be closed
108 void cf_close(capture_file *cf);
111 * Reload a capture file.
113 * @param cf the capture file to be reloaded
115 void cf_reload(capture_file *cf);
118 * Read all packets of a capture file into the internal structures.
120 * @param cf the capture file to be read
121 * @param from_save reread asked from cf_save
122 * @return one of cf_read_status_t
124 cf_read_status_t cf_read(capture_file *cf, gboolean from_save);
127 * Read the pseudo-header and raw data for a packet. It will pop
128 * up an alert box if there's an error.
130 * @param cf the capture file from which to read the packet
131 * @param fdata the frame_data structure for the packet in question
132 * @param pseudo_header pointer to a wtap_pseudo_header union into
133 * which to read the packet's pseudo-header
134 * @param pd a guin8 array into which to read the packet's raw data
135 * @return TRUE if the read succeeded, FALSE if there was an error
137 gboolean cf_read_frame_r(capture_file *cf, frame_data *fdata,
138 union wtap_pseudo_header *pseudo_header, guint8 *pd);
141 * Read the pseudo-header and raw data for a packet into a
142 * capture_file structure's pseudo_header and pd members.
143 * It will pop up an alert box if there's an error.
145 * @param cf the capture file from which to read the packet
146 * @param fdata the frame_data structure for the packet in question
147 * @return TRUE if the read succeeded, FALSE if there was an error
149 gboolean cf_read_frame(capture_file *cf, frame_data *fdata);
152 * Start reading from the end of a capture file.
153 * This is used in "Update list of packets in Real-Time".
155 * @param cf the capture file to be read from
156 * @param fname the filename to be read from
157 * @param is_tempfile is this a temporary file?
158 * @param err the error code, if an error had occured
159 * @return one of cf_status_t
161 cf_status_t cf_start_tail(capture_file *cf, const char *fname, gboolean is_tempfile, int *err);
164 * Read packets from the "end" of a capture file.
166 * @param cf the capture file to be read from
167 * @param to_read the number of packets to read
168 * @param err the error code, if an error had occured
169 * @return one of cf_read_status_t
171 cf_read_status_t cf_continue_tail(capture_file *cf, volatile int to_read, int *err);
174 * Fake reading packets from the "end" of a capture file.
176 * @param cf the capture file to be read from
178 void cf_fake_continue_tail(capture_file *cf);
181 * Finish reading from "end" of a capture file.
183 * @param cf the capture file to be read from
184 * @param err the error code, if an error had occured
185 * @return one of cf_read_status_t
187 cf_read_status_t cf_finish_tail(capture_file *cf, int *err);
190 * Determine whether this capture file (or a range of it) can be saved
191 * (except by copying the raw file data).
193 * @param cf the capture file to check
194 * @return TRUE if it can be saved, FALSE if it can't
196 gboolean cf_can_save_as(capture_file *cf);
199 * Save a capture file. Does a "safe save" if the specified
200 * pathname already exists.
202 * @param cf the capture file to save to
203 * @param fname the filename to save to
204 * @param save_format the format of the file to save (libpcap, ...)
205 * @param compressed whether to gzip compress the file
206 * @return one of cf_status_t
208 cf_status_t cf_save(capture_file * cf, const char *fname, guint save_format, gboolean compressed);
211 * Save a capture file (or a range of it). Fails if the specified
212 * pathname already exists.
214 * @param cf the capture file to save to
215 * @param fname the filename to save to
216 * @param range the range of packets to save
217 * @param save_format the format of the file to save (libpcap, ...)
218 * @param compressed whether to gzip compress the file
219 * @return one of cf_status_t
221 cf_status_t cf_save_as(capture_file * cf, const char *fname, packet_range_t *range, guint save_format, gboolean compressed);
224 * Get a displayable name of the capture file.
226 * @param cf the capture file
227 * @return the displayable name (don't have to be g_free'd)
229 const gchar *cf_get_display_name(capture_file *cf);
232 * Set the source of the capture data for temporary files, e.g.
233 * "Interface eth0" or "Pipe from Pong"
235 * @param cf the capture file
236 * @param source the source description. this will be copied internally.
238 void cf_set_tempfile_source(capture_file *cf, gchar *source);
241 * Get the source of the capture data for temporary files. Guaranteed to
242 * return a non-null value. The returned value should not be freed.
244 * @param cf the capture file
246 const gchar *cf_get_tempfile_source(capture_file *cf);
249 * Get the number of packets in the capture file.
251 * @param cf the capture file
252 * @return the number of packets in the capture file
254 int cf_get_packet_count(capture_file *cf);
257 * Set the number of packets in the capture file.
259 * @param cf the capture file
260 * @param packet_count the number of packets in the capture file
262 void cf_set_packet_count(capture_file *cf, int packet_count);
265 * Is this capture file a temporary file?
267 * @param cf the capture file
268 * @return TRUE if it's a temporary file, FALSE otherwise
270 gboolean cf_is_tempfile(capture_file *cf);
273 * Set flag, that this file is a tempfile.
275 void cf_set_tempfile(capture_file *cf, gboolean is_tempfile);
278 * Set flag, if the number of packet drops while capturing are known or not.
280 * @param cf the capture file
281 * @param drops_known TRUE if the number of packet drops are known, FALSE otherwise
283 void cf_set_drops_known(capture_file *cf, gboolean drops_known);
286 * Set the number of packet drops while capturing.
288 * @param cf the capture file
289 * @param drops the number of packet drops occured while capturing
291 void cf_set_drops(capture_file *cf, guint32 drops);
294 * Get flag state, if the number of packet drops while capturing are known or not.
296 * @param cf the capture file
297 * @return TRUE if the number of packet drops are known, FALSE otherwise
299 gboolean cf_get_drops_known(capture_file *cf);
302 * Get the number of packet drops while capturing.
304 * @param cf the capture file
305 * @return the number of packet drops occured while capturing
307 guint32 cf_get_drops(capture_file *cf);
310 * Set the read filter.
311 * @todo this shouldn't be required, remove it somehow
313 * @param cf the capture file
314 * @param rfcode the readfilter
316 void cf_set_rfcode(capture_file *cf, dfilter_t *rfcode);
319 * "Display Filter" packets in the capture file.
321 * @param cf the capture file
322 * @param dfilter the display filter
323 * @param force TRUE if do in any case, FALSE only if dfilter changed
324 * @return one of cf_status_t
326 cf_status_t cf_filter_packets(capture_file *cf, gchar *dfilter, gboolean force);
329 * At least one "Refence Time" flag has changed, rescan all packets.
331 * @param cf the capture file
333 void cf_reftime_packets(capture_file *cf);
336 * Return the time it took to load the file
338 gulong cf_get_computed_elapsed(void);
341 * "Something" has changed, rescan all packets.
343 * @param cf the capture file
345 void cf_redissect_packets(capture_file *cf);
348 * Rescan all packets and just run taps - don't reconstruct the display.
350 * @param cf the capture file
351 * @return one of cf_read_status_t
353 cf_read_status_t cf_retap_packets(capture_file *cf);
356 * Adjust timestamp precision if auto is selected.
358 * @param cf the capture file
360 void cf_timestamp_auto_precision(capture_file *cf);
363 * Print the capture file.
365 * @param cf the capture file
366 * @param print_args the arguments what and how to print
367 * @return one of cf_print_status_t
369 cf_print_status_t cf_print_packets(capture_file *cf, print_args_t *print_args);
372 * Print (export) the capture file into PDML format.
374 * @param cf the capture file
375 * @param print_args the arguments what and how to export
376 * @return one of cf_print_status_t
378 cf_print_status_t cf_write_pdml_packets(capture_file *cf, print_args_t *print_args);
381 * Print (export) the capture file into PSML format.
383 * @param cf the capture file
384 * @param print_args the arguments what and how to export
385 * @return one of cf_print_status_t
387 cf_print_status_t cf_write_psml_packets(capture_file *cf, print_args_t *print_args);
390 * Print (export) the capture file into CSV format.
392 * @param cf the capture file
393 * @param print_args the arguments what and how to export
394 * @return one of cf_print_status_t
396 cf_print_status_t cf_write_csv_packets(capture_file *cf, print_args_t *print_args);
399 * Print (export) the capture file into C Arrays format.
401 * @param cf the capture file
402 * @param print_args the arguments what and how to export
403 * @return one of cf_print_status_t
405 cf_print_status_t cf_write_carrays_packets(capture_file *cf, print_args_t *print_args);
408 * Find packet with a protocol tree item that contains a specified text string.
410 * @param cf the capture file
411 * @param string the string to find
412 * @param dir direction in which to search
413 * @return TRUE if a packet was found, FALSE otherwise
415 gboolean cf_find_packet_protocol_tree(capture_file *cf, const char *string,
416 search_direction dir);
419 * Find field with a label that contains text string cfile->sfilter.
421 * @param cf the capture file
422 * @param tree the protocol tree
423 * @param mdata the first field (mdata->finfo) that matched the string
424 * @return TRUE if a packet was found, FALSE otherwise
426 extern gboolean cf_find_string_protocol_tree(capture_file *cf, proto_tree *tree,
430 * Find packet whose summary line contains a specified text string.
432 * @param cf the capture file
433 * @param string the string to find
434 * @param dir direction in which to search
435 * @return TRUE if a packet was found, FALSE otherwise
437 gboolean cf_find_packet_summary_line(capture_file *cf, const char *string,
438 search_direction dir);
441 * Find packet whose data contains a specified byte string.
443 * @param cf the capture file
444 * @param string the string to find
445 * @param string_size the size of the string to find
446 * @param dir direction in which to search
447 * @return TRUE if a packet was found, FALSE otherwise
449 gboolean cf_find_packet_data(capture_file *cf, const guint8 *string,
450 size_t string_size, search_direction dir);
453 * Find packet that matches a compiled display filter.
455 * @param cf the capture file
456 * @param sfcode the display filter to match
457 * @param dir direction in which to search
458 * @return TRUE if a packet was found, FALSE otherwise
460 gboolean cf_find_packet_dfilter(capture_file *cf, dfilter_t *sfcode,
461 search_direction dir);
464 * Find packet that matches a display filter given as a text string.
466 * @param cf the capture file
467 * @param filter the display filter to match
468 * @param dir direction in which to search
469 * @return TRUE if a packet was found, FALSE otherwise
472 cf_find_packet_dfilter_string(capture_file *cf, const char *filter,
473 search_direction dir);
476 * Find marked packet.
478 * @param cf the capture file
479 * @param dir direction in which to search
480 * @return TRUE if a packet was found, FALSE otherwise
482 gboolean cf_find_packet_marked(capture_file *cf, search_direction dir);
485 * Find time-reference packet.
487 * @param cf the capture file
488 * @param dir direction in which to search
489 * @return TRUE if a packet was found, FALSE otherwise
491 gboolean cf_find_packet_time_reference(capture_file *cf, search_direction dir);
494 * GoTo Packet in first row.
496 * @return TRUE if the first row exists, FALSE otherwise
498 gboolean cf_goto_top_frame(void);
501 * GoTo Packet in last row.
503 * @return TRUE if last row exists, FALSE otherwise
505 gboolean cf_goto_bottom_frame(void);
508 * GoTo Packet with the given row.
510 * @param cf the capture file
511 * @param row the row to go to
512 * @return TRUE if this row exists, FALSE otherwise
514 gboolean cf_goto_frame(capture_file *cf, guint row);
517 * Go to frame specified by currently selected protocol tree field.
518 * (Go To Corresponding Packet)
519 * @todo this is ugly and should be improved!
521 * @param cf the capture file
522 * @return TRUE if this packet exists, FALSE otherwise
524 gboolean cf_goto_framenum(capture_file *cf);
527 * Select the packet in the given row.
529 * @param cf the capture file
530 * @param row the row to select
532 void cf_select_packet(capture_file *cf, int row);
535 * Unselect all packets, if any.
537 * @param cf the capture file
539 void cf_unselect_packet(capture_file *cf);
542 * Unselect all protocol tree fields, if any.
544 * @param cf the capture file
546 void cf_unselect_field(capture_file *cf);
549 * Mark a particular frame in a particular capture.
551 * @param cf the capture file
552 * @param frame the frame to be marked
554 void cf_mark_frame(capture_file *cf, frame_data *frame);
557 * Unmark a particular frame in a particular capture.
559 * @param cf the capture file
560 * @param frame the frame to be unmarked
562 void cf_unmark_frame(capture_file *cf, frame_data *frame);
565 * Ignore a particular frame in a particular capture.
567 * @param cf the capture file
568 * @param frame the frame to be ignored
570 void cf_ignore_frame(capture_file *cf, frame_data *frame);
573 * Unignore a particular frame in a particular capture.
575 * @param cf the capture file
576 * @param frame the frame to be unignored
578 void cf_unignore_frame(capture_file *cf, frame_data *frame);
581 * Merge two (or more) capture files into one.
582 * @todo is this the right place for this function? It doesn't have to do a lot with capture_file.
584 * @param out_filename pointer to output filename; if output filename is
585 * NULL, a temporary file name is generated and *out_filename is set
586 * to point to the generated file name
587 * @param in_file_count the number of input files to merge
588 * @param in_filenames array of input filenames
589 * @param file_type the output filetype
590 * @param do_append FALSE to merge chronologically, TRUE simply append
591 * @return one of cf_status_t
594 cf_merge_files(char **out_filename, int in_file_count,
595 char *const *in_filenames, int file_type, gboolean do_append);
599 * Get the comment on a capture from the SHB data block
601 * @param cf the capture file
603 const gchar* cf_read_shb_comment(capture_file *cf);
606 * Update(replace) the comment on a capture from the SHB data block
608 * @param cf the capture file
609 * @param comment the string replacing the old comment
611 void cf_update_capture_comment(capture_file *cf, gchar *comment);
614 #if defined(HAVE_HEIMDAL_KERBEROS) || defined(HAVE_MIT_KERBEROS)
615 void read_keytab_file(const char *);
620 #endif /* __cplusplus */