We're an editor now, as we let you add, delete, and edit frame comments,
[metze/wireshark/wip.git] / file.h
1 /* file.h
2  * Definitions for file structures and routines
3  *
4  * $Id$
5  *
6  * Wireshark - Network traffic analyzer
7  * By Gerald Combs <gerald@wireshark.org>
8  * Copyright 1998 Gerald Combs
9  *
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.
14  *
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.
19  *
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.
23  */
24
25 #ifndef __FILE_H__
26 #define __FILE_H__
27
28 #include "packet-range.h"
29 #include "wiretap/wtap.h"
30 #include <epan/dfilter/dfilter.h>
31 #include "print.h"
32 #include <errno.h>
33 #include <epan/epan.h>
34
35 #include "cfile.h"
36
37 #ifdef __cplusplus
38 extern "C" {
39 #endif /* __cplusplus */
40
41 /** Return values from functions that only can succeed or fail. */
42 typedef enum {
43     CF_OK,      /**< operation succeeded */
44     CF_ERROR    /**< operation got an error (function may provide err with details) */
45 } cf_status_t;
46
47 /** Return values from functions that read capture files. */
48 typedef enum {
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 */
52 } cf_read_status_t;
53
54 /** Return values from functions that print sets of packets. */
55 typedef enum {
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 */
59 } cf_print_status_t;
60
61 typedef enum {
62     cf_cb_file_closing,
63     cf_cb_file_closed,
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
74 } cf_cbs;
75
76 typedef void (*cf_callback_t) (gint event, gpointer data, gpointer user_data);
77
78 typedef struct {
79     const char    *string;
80     size_t         string_len;
81     capture_file  *cf;
82     gboolean       frame_matched;
83     field_info    *finfo;
84 } match_data;
85
86 extern void
87 cf_callback_add(cf_callback_t func, gpointer user_data);
88
89 extern void
90 cf_callback_remove(cf_callback_t func);
91
92 /**
93  * Open a capture file.
94  *
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
100  */
101 cf_status_t cf_open(capture_file *cf, const char *fname, gboolean is_tempfile, int *err);
102
103 /**
104  * Close a capture file.
105  *
106  * @param cf the capture file to be closed
107  */
108 void cf_close(capture_file *cf);
109
110 /**
111  * Reload a capture file.
112  *
113  * @param cf the capture file to be reloaded
114  */
115 void cf_reload(capture_file *cf);
116
117 /**
118  * Read all packets of a capture file into the internal structures.
119  *
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
123  */
124 cf_read_status_t cf_read(capture_file *cf, gboolean from_save);
125
126 /**
127  * Read the pseudo-header and raw data for a packet.  It will pop
128  * up an alert box if there's an error.
129  *
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
136  */
137 gboolean cf_read_frame_r(capture_file *cf, frame_data *fdata,
138                          union wtap_pseudo_header *pseudo_header, guint8 *pd);
139
140 /**
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.
144  *
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
148  */
149 gboolean cf_read_frame(capture_file *cf, frame_data *fdata);
150
151 /**
152  * Start reading from the end of a capture file.
153  * This is used in "Update list of packets in Real-Time".
154  *
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
160  */
161 cf_status_t cf_start_tail(capture_file *cf, const char *fname, gboolean is_tempfile, int *err);
162
163 /**
164  * Read packets from the "end" of a capture file.
165  *
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
170  */
171 cf_read_status_t cf_continue_tail(capture_file *cf, volatile int to_read, int *err);
172
173 /**
174  * Fake reading packets from the "end" of a capture file.
175  *
176  * @param cf the capture file to be read from
177  */
178 void cf_fake_continue_tail(capture_file *cf);
179
180 /**
181  * Finish reading from "end" of a capture file.
182  *
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
186  */
187 cf_read_status_t cf_finish_tail(capture_file *cf, int *err);
188
189 /**
190  * Determine whether this capture file (or a range of it) can be saved
191  * (except by copying the raw file data).
192  *
193  * @param cf the capture file to check
194  * @return TRUE if it can be saved, FALSE if it can't
195  */
196 gboolean cf_can_save_as(capture_file *cf);
197
198 /**
199  * Save a capture file.  Does a "safe save" if the specified
200  * pathname already exists.
201  *
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
207  */
208 cf_status_t cf_save(capture_file * cf, const char *fname, guint save_format, gboolean compressed);
209
210 /**
211  * Save a capture file (or a range of it).  Fails if the specified
212  * pathname already exists.
213  *
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
220  */
221 cf_status_t cf_save_as(capture_file * cf, const char *fname, packet_range_t *range, guint save_format, gboolean compressed);
222
223 /**
224  * Get a displayable name of the capture file.
225  *
226  * @param cf the capture file
227  * @return the displayable name (don't have to be g_free'd)
228  */
229 const gchar *cf_get_display_name(capture_file *cf);
230
231 /**
232  * Set the source of the capture data for temporary files, e.g.
233  * "Interface eth0" or "Pipe from Pong"
234  *
235  * @param cf the capture file
236  * @param source the source description. this will be copied internally.
237  */
238 void cf_set_tempfile_source(capture_file *cf, gchar *source);
239
240 /**
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.
243  *
244  * @param cf the capture file
245  */
246 const gchar *cf_get_tempfile_source(capture_file *cf);
247
248 /**
249  * Get the number of packets in the capture file.
250  *
251  * @param cf the capture file
252  * @return the number of packets in the capture file
253  */
254 int cf_get_packet_count(capture_file *cf);
255
256 /**
257  * Set the number of packets in the capture file.
258  *
259  * @param cf the capture file
260  * @param packet_count the number of packets in the capture file
261  */
262 void cf_set_packet_count(capture_file *cf, int packet_count);
263
264 /**
265  * Is this capture file a temporary file?
266  *
267  * @param cf the capture file
268  * @return TRUE if it's a temporary file, FALSE otherwise
269  */
270 gboolean cf_is_tempfile(capture_file *cf);
271
272 /**
273  * Set flag, that this file is a tempfile.
274  */
275 void cf_set_tempfile(capture_file *cf, gboolean is_tempfile);
276
277 /**
278  * Set flag, if the number of packet drops while capturing are known or not.
279  *
280  * @param cf the capture file
281  * @param drops_known TRUE if the number of packet drops are known, FALSE otherwise
282  */
283 void cf_set_drops_known(capture_file *cf, gboolean drops_known);
284
285 /**
286  * Set the number of packet drops while capturing.
287  *
288  * @param cf the capture file
289  * @param drops the number of packet drops occured while capturing
290  */
291 void cf_set_drops(capture_file *cf, guint32 drops);
292
293 /**
294  * Get flag state, if the number of packet drops while capturing are known or not.
295  *
296  * @param cf the capture file
297  * @return TRUE if the number of packet drops are known, FALSE otherwise
298  */
299 gboolean cf_get_drops_known(capture_file *cf);
300
301 /**
302  * Get the number of packet drops while capturing.
303  *
304  * @param cf the capture file
305  * @return the number of packet drops occured while capturing
306  */
307 guint32 cf_get_drops(capture_file *cf);
308
309 /**
310  * Set the read filter.
311  * @todo this shouldn't be required, remove it somehow
312  *
313  * @param cf the capture file
314  * @param rfcode the readfilter
315  */
316 void cf_set_rfcode(capture_file *cf, dfilter_t *rfcode);
317
318 /**
319  * "Display Filter" packets in the capture file.
320  *
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
325  */
326 cf_status_t cf_filter_packets(capture_file *cf, gchar *dfilter, gboolean force);
327
328 /**
329  * At least one "Refence Time" flag has changed, rescan all packets.
330  *
331  * @param cf the capture file
332  */
333 void cf_reftime_packets(capture_file *cf);
334
335 /**
336  * Return the time it took to load the file
337  */
338 gulong cf_get_computed_elapsed(void);
339
340 /**
341  * "Something" has changed, rescan all packets.
342  *
343  * @param cf the capture file
344  */
345 void cf_redissect_packets(capture_file *cf);
346
347 /**
348  * Rescan all packets and just run taps - don't reconstruct the display.
349  *
350  * @param cf the capture file
351  * @return one of cf_read_status_t
352  */
353 cf_read_status_t cf_retap_packets(capture_file *cf);
354
355 /**
356  * Adjust timestamp precision if auto is selected.
357  *
358  * @param cf the capture file
359  */
360 void cf_timestamp_auto_precision(capture_file *cf);
361
362 /**
363  * Print the capture file.
364  *
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
368  */
369 cf_print_status_t cf_print_packets(capture_file *cf, print_args_t *print_args);
370
371 /**
372  * Print (export) the capture file into PDML format.
373  *
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
377  */
378 cf_print_status_t cf_write_pdml_packets(capture_file *cf, print_args_t *print_args);
379
380 /**
381  * Print (export) the capture file into PSML format.
382  *
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
386  */
387 cf_print_status_t cf_write_psml_packets(capture_file *cf, print_args_t *print_args);
388
389 /**
390  * Print (export) the capture file into CSV format.
391  *
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
395  */
396 cf_print_status_t cf_write_csv_packets(capture_file *cf, print_args_t *print_args);
397
398 /**
399  * Print (export) the capture file into C Arrays format.
400  *
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
404  */
405 cf_print_status_t cf_write_carrays_packets(capture_file *cf, print_args_t *print_args);
406
407 /**
408  * Find packet with a protocol tree item that contains a specified text string.
409  *
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
414  */
415 gboolean cf_find_packet_protocol_tree(capture_file *cf, const char *string,
416                                       search_direction dir);
417
418 /**
419  * Find field with a label that contains text string cfile->sfilter.
420  *
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
425  */
426 extern gboolean cf_find_string_protocol_tree(capture_file *cf, proto_tree *tree,
427                                              match_data *mdata);
428
429 /**
430  * Find packet whose summary line contains a specified text string.
431  *
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
436  */
437 gboolean cf_find_packet_summary_line(capture_file *cf, const char *string,
438                                      search_direction dir);
439
440 /**
441  * Find packet whose data contains a specified byte string.
442  *
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
448  */
449 gboolean cf_find_packet_data(capture_file *cf, const guint8 *string,
450                              size_t string_size, search_direction dir);
451
452 /**
453  * Find packet that matches a compiled display filter.
454  *
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
459  */
460 gboolean cf_find_packet_dfilter(capture_file *cf, dfilter_t *sfcode,
461                                 search_direction dir);
462
463 /**
464  * Find packet that matches a display filter given as a text string.
465  *
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
470  */
471 gboolean
472 cf_find_packet_dfilter_string(capture_file *cf, const char *filter,
473                               search_direction dir);
474
475 /**
476  * Find marked packet.
477  *
478  * @param cf the capture file
479  * @param dir direction in which to search
480  * @return TRUE if a packet was found, FALSE otherwise
481  */
482 gboolean cf_find_packet_marked(capture_file *cf, search_direction dir);
483
484 /**
485  * Find time-reference packet.
486  *
487  * @param cf the capture file
488  * @param dir direction in which to search
489  * @return TRUE if a packet was found, FALSE otherwise
490  */
491 gboolean cf_find_packet_time_reference(capture_file *cf, search_direction dir);
492
493 /**
494  * GoTo Packet in first row.
495  *
496  * @return TRUE if the first row exists, FALSE otherwise
497  */
498 gboolean cf_goto_top_frame(void);
499
500 /**
501  * GoTo Packet in last row.
502  *
503  * @return TRUE if last row exists, FALSE otherwise
504  */
505 gboolean cf_goto_bottom_frame(void);
506
507 /**
508  * GoTo Packet with the given row.
509  *
510  * @param cf the capture file
511  * @param row the row to go to
512  * @return TRUE if this row exists, FALSE otherwise
513  */
514 gboolean cf_goto_frame(capture_file *cf, guint row);
515
516 /**
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!
520  *
521  * @param cf the capture file
522  * @return TRUE if this packet exists, FALSE otherwise
523  */
524 gboolean cf_goto_framenum(capture_file *cf);
525
526 /**
527  * Select the packet in the given row.
528  *
529  * @param cf the capture file
530  * @param row the row to select
531  */
532 void cf_select_packet(capture_file *cf, int row);
533
534 /**
535  * Unselect all packets, if any.
536  *
537  * @param cf the capture file
538  */
539 void cf_unselect_packet(capture_file *cf);
540
541 /**
542  * Unselect all protocol tree fields, if any.
543  *
544  * @param cf the capture file
545  */
546 void cf_unselect_field(capture_file *cf);
547
548 /**
549  * Mark a particular frame in a particular capture.
550  *
551  * @param cf the capture file
552  * @param frame the frame to be marked
553  */
554 void cf_mark_frame(capture_file *cf, frame_data *frame);
555
556 /**
557  * Unmark a particular frame in a particular capture.
558  *
559  * @param cf the capture file
560  * @param frame the frame to be unmarked
561  */
562 void cf_unmark_frame(capture_file *cf, frame_data *frame);
563
564 /**
565  * Ignore a particular frame in a particular capture.
566  *
567  * @param cf the capture file
568  * @param frame the frame to be ignored
569  */
570 void cf_ignore_frame(capture_file *cf, frame_data *frame);
571
572 /**
573  * Unignore a particular frame in a particular capture.
574  *
575  * @param cf the capture file
576  * @param frame the frame to be unignored
577  */
578 void cf_unignore_frame(capture_file *cf, frame_data *frame);
579
580 /**
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.
583  *
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
592  */
593 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);
596
597
598 /**
599  * Get the comment on a capture from the SHB data block
600  *
601  * @param cf the capture file
602  */
603 const gchar* cf_read_shb_comment(capture_file *cf);
604
605 /**
606  * Update(replace) the comment on a capture from the SHB data block
607  *
608  * @param cf the capture file
609  * @param comment the string replacing the old comment
610  */
611 void cf_update_capture_comment(capture_file *cf, gchar *comment);
612
613
614 #if defined(HAVE_HEIMDAL_KERBEROS) || defined(HAVE_MIT_KERBEROS)
615 void read_keytab_file(const char *);
616 #endif
617
618 #ifdef __cplusplus
619 }
620 #endif /* __cplusplus */
621
622 #endif /* file.h */