From Chris Maynard via bug 4014:
[obnox/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
38 /** Return values from functions that only can succeed or fail. */
39 typedef enum {
40         CF_OK,                      /**< operation succeeded */
41         CF_ERROR        /**< operation got an error (function may provide err with details) */
42 } cf_status_t;
43
44 /** Return values from functions that read capture files. */
45 typedef enum {
46         CF_READ_OK,             /**< operation succeeded */
47         CF_READ_ERROR,          /**< operation got an error (function may provide err with details) */
48         CF_READ_ABORTED         /**< operation aborted by user */
49 } cf_read_status_t;
50
51 /** Return values from functions that print sets of packets. */
52 typedef enum {
53         CF_PRINT_OK,                /**< print operation succeeded */
54         CF_PRINT_OPEN_ERROR,    /**< print operation failed while opening printer */
55         CF_PRINT_WRITE_ERROR    /**< print operation failed while writing to the printer */
56 } cf_print_status_t;
57
58 typedef enum {
59     cf_cb_file_closing,
60     cf_cb_file_closed,
61     cf_cb_file_read_started,
62     cf_cb_file_read_finished,
63     cf_cb_packet_selected,
64     cf_cb_packet_unselected,
65     cf_cb_field_unselected,
66     cf_cb_file_save_started,
67     cf_cb_file_save_finished,
68     cf_cb_file_save_reload_finished,
69     cf_cb_file_save_failed
70 } cf_cbs;
71
72 typedef void (*cf_callback_t) (gint event, gpointer data, gpointer user_data);
73
74 extern void
75 cf_callback_add(cf_callback_t func, gpointer user_data);
76
77 extern void
78 cf_callback_remove(cf_callback_t func);
79
80 /**
81  * Open a capture file.
82  *
83  * @param cf the capture file to be opened
84  * @param fname the filename to be opened
85  * @param is_tempfile is this a temporary file?
86  * @return one of cf_status_t
87  */
88 cf_status_t cf_open(capture_file *cf, const char *fname, gboolean is_tempfile, int *err);
89
90 /**
91  * Close a capture file.
92  *
93  * @param cf the capture file to be closed
94  */
95 void cf_close(capture_file *cf);
96
97 /**
98  * Reload a capture file.
99  *
100  * @param cf the capture file to be reloaded
101  */
102 void cf_reload(capture_file *cf);
103
104 /**
105  * Read all packets of a capture file into the internal structures.
106  *
107  * @param cf the capture file to be read
108  * @param from_save reread asked from cf_save
109  * @return one of cf_read_status_t
110  */
111 cf_read_status_t cf_read(capture_file *cf, gboolean from_save);
112
113 gboolean cf_read_frame_r(capture_file *cf, frame_data *fdata,
114         union wtap_pseudo_header *pseudo_header, guint8 *pd,
115         int *err, gchar **err_info);
116
117 gboolean cf_read_frame(capture_file *cf, frame_data *fdata,
118         int *err, gchar **err_info);
119
120 /**
121  * Start reading from the end of a capture file.
122  * This is used in "Update list of packets in Real-Time".
123  *
124  * @param cf the capture file to be read from
125  * @param fname the filename to be read from
126  * @param is_tempfile is this a temporary file?
127  * @param err the error code, if an error had occured
128  * @return one of cf_status_t
129  */
130 cf_status_t cf_start_tail(capture_file *cf, const char *fname, gboolean is_tempfile, int *err);
131
132 /**
133  * Read packets from the "end" of a capture file.
134  *
135  * @param cf the capture file to be read from
136  * @param to_read the number of packets to read
137  * @param err the error code, if an error had occured
138  * @return one of cf_read_status_t
139  */
140 cf_read_status_t cf_continue_tail(capture_file *cf, volatile int to_read, int *err);
141
142 /**
143  * Fake reading packets from the "end" of a capture file.
144  *
145  * @param cf the capture file to be read from
146  */
147 void cf_fake_continue_tail(capture_file *cf);
148
149 /**
150  * Finish reading from "end" of a capture file.
151  *
152  * @param cf the capture file to be read from
153  * @param err the error code, if an error had occured
154  * @return one of cf_read_status_t
155  */
156 cf_read_status_t cf_finish_tail(capture_file *cf, int *err);
157
158 /**
159  * Determine whether this capture file (or a range of it) can be saved
160  * (except by copying the raw file data).
161  *
162  * @param cf the capture file to check
163  * @return TRUE if it can be saved, FALSE if it can't
164  */
165 gboolean cf_can_save_as(capture_file *cf);
166
167 /**
168  * Save a capture file (or a range of it).
169  *
170  * @param cf the capture file to save to
171  * @param fname the filename to save to
172  * @param range the range of packets to save
173  * @param save_format the format of the file to save (libpcap, ...)
174  * @param compressed whether to gzip compress the file
175  * @return one of cf_status_t
176  */
177 cf_status_t cf_save(capture_file * cf, const char *fname, packet_range_t *range, guint save_format, gboolean compressed);
178
179 /**
180  * Get a displayable name of the capture file.
181  *
182  * @param cf the capture file
183  * @return the displayable name (don't have to be g_free'd)
184  */
185 const gchar *cf_get_display_name(capture_file *cf);
186
187 /**
188  * Set the source of the capture data for temporary files, e.g.
189  * "Interface eth0" or "Pipe from Pong"
190  *
191  * @param cf the capture file
192  * @param source the source description. this will be copied internally.
193  */
194 void cf_set_tempfile_source(capture_file *cf, gchar *source);
195
196 /**
197  * Get the source of the capture data for temporary files. Guaranteed to
198  * return a non-null value. The returned value should not be freed.
199  *
200  * @param cf the capture file
201  * @param source the source description. this will be copied internally.
202  */
203 const gchar *cf_get_tempfile_source(capture_file *cf);
204
205 /**
206  * Get the number of packets in the capture file.
207  *
208  * @param cf the capture file
209  * @return the number of packets in the capture file
210  */
211 int cf_get_packet_count(capture_file *cf);
212
213 /**
214  * Set the number of packets in the capture file.
215  *
216  * @param cf the capture file
217  * @param the number of packets in the capture file
218  */
219 void cf_set_packet_count(capture_file *cf, int packet_count);
220
221 /**
222  * Is this capture file a temporary file?
223  *
224  * @param cf the capture file
225  * @return TRUE if it's a temporary file, FALSE otherwise
226  */
227 gboolean cf_is_tempfile(capture_file *cf);
228
229 /**
230  * Set flag, that this file is a tempfile.
231  */
232 void cf_set_tempfile(capture_file *cf, gboolean is_tempfile);
233
234 /**
235  * Set flag, if the number of packet drops while capturing are known or not.
236  *
237  * @param cf the capture file
238  * @param drops_known TRUE if the number of packet drops are known, FALSE otherwise
239  */
240 void cf_set_drops_known(capture_file *cf, gboolean drops_known);
241
242 /**
243  * Set the number of packet drops while capturing.
244  *
245  * @param cf the capture file
246  * @param drops the number of packet drops occured while capturing
247  */
248 void cf_set_drops(capture_file *cf, guint32 drops);
249
250 /**
251  * Get flag state, if the number of packet drops while capturing are known or not.
252  *
253  * @param cf the capture file
254  * @return TRUE if the number of packet drops are known, FALSE otherwise
255  */
256 gboolean cf_get_drops_known(capture_file *cf);
257
258 /**
259  * Get the number of packet drops while capturing.
260  *
261  * @param cf the capture file
262  * @return the number of packet drops occured while capturing
263  */
264 guint32 cf_get_drops(capture_file *cf);
265
266 /**
267  * Set the read filter.
268  * @todo this shouldn't be required, remove it somehow
269  *
270  * @param cf the capture file
271  * @param rfcode the readfilter
272  */
273 void cf_set_rfcode(capture_file *cf, dfilter_t *rfcode);
274
275 /**
276  * "Display Filter" packets in the capture file.
277  *
278  * @param cf the capture file
279  * @param dfilter the display filter
280  * @param force TRUE if do in any case, FALSE only if dfilter changed
281  * @return one of cf_status_t
282  */
283 cf_status_t cf_filter_packets(capture_file *cf, gchar *dfilter, gboolean force);
284
285 /**
286  * At least one "Refence Time" flag has changed, rescan all packets.
287  *
288  * @param cf the capture file
289  */
290 void cf_reftime_packets(capture_file *cf);
291
292 /**
293  * Return the time it took to load the file
294  */
295 gulong cf_get_computed_elapsed(void);
296
297 /**
298  * The coloring rules have changed, redo coloring
299  *
300  * @param cf the capture file
301  */
302 void cf_colorize_packets(capture_file *cf);
303
304 /**
305  * "Something" has changed, rescan all packets.
306  *
307  * @param cf the capture file
308  */
309 void cf_redissect_packets(capture_file *cf);
310
311 /**
312  * Rescan all packets and just run taps - don't reconstruct the display.
313  *
314  * @param cf the capture file
315  * @return one of cf_read_status_t
316  */
317 cf_read_status_t cf_retap_packets(capture_file *cf);
318
319 /**
320  * The time format has changed, rescan all packets.
321  *
322  * @param cf the capture file
323  */
324 void cf_change_time_formats(capture_file *cf);
325
326 /**
327  * Adjust timestamp precision if auto is selected.
328  *
329  * @param cf the capture file
330  */
331 void cf_timestamp_auto_precision(capture_file *cf);
332
333 /**
334  * Print the capture file.
335  *
336  * @param cf the capture file
337  * @param print_args the arguments what and how to print
338  * @return one of cf_print_status_t
339  */
340 cf_print_status_t cf_print_packets(capture_file *cf, print_args_t *print_args);
341
342 /**
343  * Print (export) the capture file into PDML format.
344  *
345  * @param cf the capture file
346  * @param print_args the arguments what and how to export
347  * @return one of cf_print_status_t
348  */
349 cf_print_status_t cf_write_pdml_packets(capture_file *cf, print_args_t *print_args);
350
351 /**
352  * Print (export) the capture file into PSML format.
353  *
354  * @param cf the capture file
355  * @param print_args the arguments what and how to export
356  * @return one of cf_print_status_t
357  */
358 cf_print_status_t cf_write_psml_packets(capture_file *cf, print_args_t *print_args);
359
360 /**
361  * Print (export) the capture file into CSV format.
362  *
363  * @param cf the capture file
364  * @param print_args the arguments what and how to export
365  * @return one of cf_print_status_t
366  */
367 cf_print_status_t cf_write_csv_packets(capture_file *cf, print_args_t *print_args);
368
369 /**
370  * Print (export) the capture file into C Arrays format.
371  *
372  * @param cf the capture file
373  * @param print_args the arguments what and how to export
374  * @return one of cf_print_status_t
375  */
376 cf_print_status_t cf_write_carrays_packets(capture_file *cf, print_args_t *print_args);
377
378 /**
379  * Find Packet in protocol tree.
380  *
381  * @param cf the capture file
382  * @param string the string to find
383  * @return TRUE if a packet was found, FALSE otherwise
384  */
385 gboolean cf_find_packet_protocol_tree(capture_file *cf, const char *string);
386
387 /**
388  * Find Packet in summary line.
389  *
390  * @param cf the capture file
391  * @param string the string to find
392  * @return TRUE if a packet was found, FALSE otherwise
393  */
394 gboolean cf_find_packet_summary_line(capture_file *cf, const char *string);
395
396 /**
397  * Find Packet in packet data.
398  *
399  * @param cf the capture file
400  * @param string the string to find
401  * @param string_size the size of the string to find
402  * @return TRUE if a packet was found, FALSE otherwise
403  */
404 gboolean cf_find_packet_data(capture_file *cf, const guint8 *string,
405                           size_t string_size);
406
407 /**
408  * Find Packet by display filter.
409  *
410  * @param cf the capture file
411  * @param sfcode the display filter to find a packet for
412  * @return TRUE if a packet was found, FALSE otherwise
413  */
414 gboolean cf_find_packet_dfilter(capture_file *cf, dfilter_t *sfcode);
415
416 /**
417  * GoTo Packet in first row.
418  *
419  * @param cf the capture file
420  * @return TRUE if the first row exists, FALSE otherwise
421  */
422 gboolean cf_goto_top_frame(capture_file *cf);
423
424 /**
425  * GoTo Packet in last row.
426  *
427  * @param cf the capture file
428  * @return TRUE if last row exists, FALSE otherwise
429  */
430 gboolean cf_goto_bottom_frame(capture_file *cf);
431
432 /**
433  * GoTo Packet with the given row.
434  *
435  * @param cf the capture file
436  * @param row the row to go to
437  * @return TRUE if this row exists, FALSE otherwise
438  */
439 gboolean cf_goto_frame(capture_file *cf, guint row);
440
441 /**
442  * Go to frame specified by currently selected protocol tree field.
443  * (Go To Corresponding Packet)
444  * @todo this is ugly and should be improved!
445  *
446  * @param cf the capture file
447  * @return TRUE if this packet exists, FALSE otherwise
448  */
449 gboolean cf_goto_framenum(capture_file *cf);
450
451 /**
452  * Select the packet in the given row.
453  *
454  * @param cf the capture file
455  * @param row the row to select
456  */
457 void cf_select_packet(capture_file *cf, int row);
458
459 /**
460  * Unselect all packets, if any.
461  *
462  * @param cf the capture file
463  * @param row the row to select
464  */
465 void cf_unselect_packet(capture_file *cf);
466
467 /**
468  * Unselect all protocol tree fields, if any.
469  *
470  * @param cf the capture file
471  * @param row the row to select
472  */
473 void cf_unselect_field(capture_file *cf);
474
475 /**
476  * Mark a particular frame in a particular capture.
477  *
478  * @param cf the capture file
479  * @param frame the frame to be marked
480  */
481 void cf_mark_frame(capture_file *cf, frame_data *frame);
482
483 /**
484  * Unmark a particular frame in a particular capture.
485  *
486  * @param cf the capture file
487  * @param frame the frame to be unmarked
488  */
489 void cf_unmark_frame(capture_file *cf, frame_data *frame);
490
491 /**
492  * Ignore a particular frame in a particular capture.
493  *
494  * @param cf the capture file
495  * @param frame the frame to be ignored
496  */
497 void cf_ignore_frame(capture_file *cf, frame_data *frame);
498
499 /**
500  * Unignore a particular frame in a particular capture.
501  *
502  * @param cf the capture file
503  * @param frame the frame to be unignored
504  */
505 void cf_unignore_frame(capture_file *cf, frame_data *frame);
506
507 /**
508  * Convert error number and info to a complete message.
509  *
510  * @param err the error number
511  * @param err_info a string with additional details about this error
512  * @return statically allocated error message
513  */
514 char *cf_read_error_message(int err, gchar *err_info);
515
516 /**
517  * Merge two (or more) capture files into one.
518  * @todo is this the right place for this function? It doesn't have to do a lot with capture_file.
519  *
520  * @param out_filename pointer to output filename; if output filename is
521  * NULL, a temporary file name is generated and *out_filename is set
522  * to point to the generated file name
523  * @param in_file_count the number of input files to merge
524  * @param in_filnames array of input filenames
525  * @param file_type the output filetype
526  * @param do_append FALSE to merge chronologically, TRUE simply append
527  * @return one of cf_status_t
528  */
529 cf_status_t
530 cf_merge_files(char **out_filename, int in_file_count,
531                char *const *in_filenames, int file_type, gboolean do_append);
532
533 #if defined(HAVE_HEIMDAL_KERBEROS) || defined(HAVE_MIT_KERBEROS)
534 void read_keytab_file(const char *);
535 #endif
536
537 #endif /* file.h */