Replace relative timestamp with reference frame number. Saves 16B per frame.
[metze/wireshark/wip.git] / tshark.c
1 /* tshark.c
2  *
3  * Text-mode variant of Wireshark, along the lines of tcpdump and snoop,
4  * by Gilbert Ramirez <gram@alumni.rice.edu> and Guy Harris <guy@alum.mit.edu>.
5  *
6  * $Id$
7  *
8  * Wireshark - Network traffic analyzer
9  * By Gerald Combs <gerald@wireshark.org>
10  * Copyright 1998 Gerald Combs
11  *
12  * This program is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU General Public License
14  * as published by the Free Software Foundation; either version 2
15  * of the License, or (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25  */
26
27 #include "config.h"
28
29 #include <stdlib.h>
30 #include <stdio.h>
31 #include <string.h>
32 #include <ctype.h>
33 #include <locale.h>
34 #include <limits.h>
35
36 #ifdef HAVE_UNISTD_H
37 #include <unistd.h>
38 #endif
39
40 #include <errno.h>
41
42 #ifdef HAVE_FCNTL_H
43 #include <fcntl.h>
44 #endif
45
46 #include <signal.h>
47
48 #ifdef HAVE_SYS_STAT_H
49 # include <sys/stat.h>
50 #endif
51
52 #ifndef HAVE_GETOPT
53 #include "wsutil/wsgetopt.h"
54 #endif
55
56 #include <glib.h>
57 #include <epan/epan-int.h>
58 #include <epan/epan.h>
59 #include <epan/filesystem.h>
60 #include <wsutil/crash_info.h>
61 #include <wsutil/privileges.h>
62 #include <wsutil/file_util.h>
63
64 #include "globals.h"
65 #include <epan/timestamp.h>
66 #include <epan/packet.h>
67 #include "file.h"
68 #include "frame_tvbuff.h"
69 #include <epan/disabled_protos.h>
70 #include <epan/prefs.h>
71 #include <epan/column.h>
72 #include <epan/print.h>
73 #include <epan/addr_resolv.h>
74 #include "ui/util.h"
75 #include "clopts_common.h"
76 #include "cmdarg_err.h"
77 #include "version_info.h"
78 #include <epan/plugins.h>
79 #include "register.h"
80 #include <epan/epan_dissect.h>
81 #include <epan/tap.h>
82 #include <epan/stat_cmd_args.h>
83 #include <epan/timestamp.h>
84 #include <epan/ex-opt.h>
85
86 #ifdef HAVE_LIBPCAP
87 #include "capture_ui_utils.h"
88 #include "capture_ifinfo.h"
89 #include "capture-pcap-util.h"
90 #ifdef _WIN32
91 #include "capture-wpcap.h"
92 #include <wsutil/unicode-utils.h>
93 #endif /* _WIN32 */
94 #include "capture_session.h"
95 #include "capture_sync.h"
96 #include "capture_opts.h"
97 #endif /* HAVE_LIBPCAP */
98 #include "log.h"
99 #include <epan/funnel.h>
100
101 /*
102  * This is the template for the decode as option; it is shared between the
103  * various functions that output the usage for this parameter.
104  */
105 static const gchar decode_as_arg_template[] = "<layer_type>==<selector>,<decode_as_protocol>";
106
107 static guint32 cum_bytes;
108 static const frame_data *ref;
109 static frame_data ref_frame;
110 static frame_data *prev_dis;
111 static frame_data prev_dis_frame;
112 static frame_data *prev_cap;
113 static frame_data prev_cap_frame;
114
115 static const char* prev_display_dissector_name = NULL;
116
117 static gboolean perform_two_pass_analysis;
118
119 /*
120  * The way the packet decode is to be written.
121  */
122 typedef enum {
123   WRITE_TEXT,   /* summary or detail text */
124   WRITE_XML,    /* PDML or PSML */
125   WRITE_FIELDS  /* User defined list of fields */
126   /* Add CSV and the like here */
127 } output_action_e;
128
129 static output_action_e output_action;
130 static gboolean do_dissection;     /* TRUE if we have to dissect each packet */
131 static gboolean print_packet_info; /* TRUE if we're to print packet information */
132 static gint print_summary = -1;    /* TRUE if we're to print packet summary information */
133 static gboolean print_details;     /* TRUE if we're to print packet details information */
134 static gboolean print_hex;         /* TRUE if we're to print hex/ascci information */
135 static gboolean line_buffered;
136 static gboolean really_quiet = FALSE;
137
138 static print_format_e print_format = PR_FMT_TEXT;
139 static print_stream_t *print_stream;
140
141 static output_fields_t* output_fields  = NULL;
142
143 /* The line separator used between packets, changeable via the -S option */
144 static const char *separator = "";
145
146 #ifdef HAVE_LIBPCAP
147 /*
148  * TRUE if we're to print packet counts to keep track of captured packets.
149  */
150 static gboolean print_packet_counts = TRUE;
151
152 static capture_options global_capture_opts;
153 static capture_session global_capture_session;
154
155 #ifdef SIGINFO
156 static gboolean infodelay;      /* if TRUE, don't print capture info in SIGINFO handler */
157 static gboolean infoprint;      /* if TRUE, print capture info after clearing infodelay */
158 #endif /* SIGINFO */
159
160 static gboolean capture(void);
161 static void report_counts(void);
162 #ifdef _WIN32
163 static BOOL WINAPI capture_cleanup(DWORD);
164 #else /* _WIN32 */
165 static void capture_cleanup(int);
166 #ifdef SIGINFO
167 static void report_counts_siginfo(int);
168 #endif /* SIGINFO */
169 #endif /* _WIN32 */
170 #endif /* HAVE_LIBPCAP */
171
172 static int load_cap_file(capture_file *, char *, int, gboolean, int, gint64);
173 static gboolean process_packet(capture_file *cf, gint64 offset,
174     struct wtap_pkthdr *whdr, const guchar *pd,
175     gboolean filtering_tap_listeners, guint tap_flags);
176 static void show_capture_file_io_error(const char *, int, gboolean);
177 static void show_print_file_io_error(int err);
178 static gboolean write_preamble(capture_file *cf);
179 static gboolean print_packet(capture_file *cf, epan_dissect_t *edt);
180 static gboolean write_finale(void);
181 static const char *cf_open_error_message(int err, gchar *err_info,
182     gboolean for_writing, int file_type);
183
184 static void open_failure_message(const char *filename, int err,
185     gboolean for_writing);
186 static void failure_message(const char *msg_format, va_list ap);
187 static void read_failure_message(const char *filename, int err);
188 static void write_failure_message(const char *filename, int err);
189
190 capture_file cfile;
191
192 struct string_elem {
193   const char *sstr;   /* The short string */
194   const char *lstr;   /* The long string */
195 };
196
197 static gint
198 string_compare(gconstpointer a, gconstpointer b)
199 {
200   return strcmp(((const struct string_elem *)a)->sstr,
201                 ((const struct string_elem *)b)->sstr);
202 }
203
204 static void
205 string_elem_print(gpointer data, gpointer not_used _U_)
206 {
207   fprintf(stderr, "    %s - %s\n",
208           ((struct string_elem *)data)->sstr,
209           ((struct string_elem *)data)->lstr);
210 }
211
212 static void
213 list_capture_types(void) {
214   int                 i;
215   struct string_elem *captypes;
216   GSList             *list = NULL;
217
218   captypes = g_new(struct string_elem, WTAP_NUM_FILE_TYPES);
219
220   fprintf(stderr, "tshark: The available capture file types for the \"-F\" flag are:\n");
221   for (i = 0; i < WTAP_NUM_FILE_TYPES; i++) {
222     if (wtap_dump_can_open(i)) {
223       captypes[i].sstr = wtap_file_type_short_string(i);
224       captypes[i].lstr = wtap_file_type_string(i);
225       list = g_slist_insert_sorted(list, &captypes[i], string_compare);
226     }
227   }
228   g_slist_foreach(list, string_elem_print, NULL);
229   g_slist_free(list);
230   g_free(captypes);
231 }
232
233 static void
234 print_usage(gboolean print_ver)
235 {
236   FILE *output;
237
238   if (print_ver) {
239     output = stdout;
240     fprintf(output,
241         "TShark " VERSION "%s\n"
242         "Dump and analyze network traffic.\n"
243         "See http://www.wireshark.org for more information.\n"
244         "\n"
245         "%s",
246          wireshark_svnversion, get_copyright_info());
247   } else {
248     output = stderr;
249   }
250   fprintf(output, "\n");
251   fprintf(output, "Usage: tshark [options] ...\n");
252   fprintf(output, "\n");
253
254 #ifdef HAVE_LIBPCAP
255   fprintf(output, "Capture interface:\n");
256   fprintf(output, "  -i <interface>           name or idx of interface (def: first non-loopback)\n");
257   fprintf(output, "  -f <capture filter>      packet filter in libpcap filter syntax\n");
258   fprintf(output, "  -s <snaplen>             packet snapshot length (def: 65535)\n");
259   fprintf(output, "  -p                       don't capture in promiscuous mode\n");
260 #ifdef HAVE_PCAP_CREATE
261   fprintf(output, "  -I                       capture in monitor mode, if available\n");
262 #endif
263 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
264   fprintf(output, "  -B <buffer size>         size of kernel buffer (def: %dMB)\n", DEFAULT_CAPTURE_BUFFER_SIZE);
265 #endif
266   fprintf(output, "  -y <link type>           link layer type (def: first appropriate)\n");
267   fprintf(output, "  -D                       print list of interfaces and exit\n");
268   fprintf(output, "  -L                       print list of link-layer types of iface and exit\n");
269   fprintf(output, "\n");
270   fprintf(output, "Capture stop conditions:\n");
271   fprintf(output, "  -c <packet count>        stop after n packets (def: infinite)\n");
272   fprintf(output, "  -a <autostop cond.> ...  duration:NUM - stop after NUM seconds\n");
273   fprintf(output, "                           filesize:NUM - stop this file after NUM KB\n");
274   fprintf(output, "                              files:NUM - stop after NUM files\n");
275   /*fprintf(output, "\n");*/
276   fprintf(output, "Capture output:\n");
277   fprintf(output, "  -b <ringbuffer opt.> ... duration:NUM - switch to next file after NUM secs\n");
278   fprintf(output, "                           filesize:NUM - switch to next file after NUM KB\n");
279   fprintf(output, "                              files:NUM - ringbuffer: replace after NUM files\n");
280 #endif  /* HAVE_LIBPCAP */
281 #ifdef HAVE_PCAP_REMOTE
282   fprintf(output, "RPCAP options:\n");
283   fprintf(output, "  -A <user>:<password>     use RPCAP password authentication\n");
284 #endif
285   /*fprintf(output, "\n");*/
286   fprintf(output, "Input file:\n");
287   fprintf(output, "  -r <infile>              set the filename to read from (no pipes or stdin!)\n");
288
289   fprintf(output, "\n");
290   fprintf(output, "Processing:\n");
291   fprintf(output, "  -2                       perform a two-pass analysis\n");
292   fprintf(output, "  -R <read filter>         packet Read filter in Wireshark display filter syntax\n");
293   fprintf(output, "  -Y <display filter>      packet displaY filter in Wireshark display filter syntax\n");
294   fprintf(output, "  -n                       disable all name resolutions (def: all enabled)\n");
295   fprintf(output, "  -N <name resolve flags>  enable specific name resolution(s): \"mntC\"\n");
296   fprintf(output, "  -d %s ...\n", decode_as_arg_template);
297   fprintf(output, "                           \"Decode As\", see the man page for details\n");
298   fprintf(output, "                           Example: tcp.port==8888,http\n");
299   fprintf(output, "  -H <hosts file>          read a list of entries from a hosts file, which will\n");
300   fprintf(output, "                           then be written to a capture file. (Implies -W n)\n");
301
302   /*fprintf(output, "\n");*/
303   fprintf(output, "Output:\n");
304   fprintf(output, "  -w <outfile|->           write packets to a pcap-format file named \"outfile\"\n");
305   fprintf(output, "                           (or to the standard output for \"-\")\n");
306   fprintf(output, "  -C <config profile>      start with specified configuration profile\n");
307   fprintf(output, "  -F <output file type>    set the output file type, default is pcapng\n");
308   fprintf(output, "                           an empty \"-F\" option will list the file types\n");
309   fprintf(output, "  -V                       add output of packet tree        (Packet Details)\n");
310   fprintf(output, "  -O <protocols>           Only show packet details of these protocols, comma\n");
311   fprintf(output, "                           separated\n");
312   fprintf(output, "  -P                       print packet summary even when writing to a file\n");
313   fprintf(output, "  -S <separator>           the line separator to print between packets\n");
314   fprintf(output, "  -x                       add output of hex and ASCII dump (Packet Bytes)\n");
315   fprintf(output, "  -T pdml|ps|psml|text|fields\n");
316   fprintf(output, "                           format of text output (def: text)\n");
317   fprintf(output, "  -e <field>               field to print if -Tfields selected (e.g. tcp.port, col.Info);\n");
318   fprintf(output, "                           this option can be repeated to print multiple fields\n");
319   fprintf(output, "  -E<fieldsoption>=<value> set options for output when -Tfields selected:\n");
320   fprintf(output, "     header=y|n            switch headers on and off\n");
321   fprintf(output, "     separator=/t|/s|<char> select tab, space, printable character as separator\n");
322   fprintf(output, "     occurrence=f|l|a      print first, last or all occurrences of each field\n");
323   fprintf(output, "     aggregator=,|/s|<char> select comma, space, printable character as\n");
324   fprintf(output, "                           aggregator\n");
325   fprintf(output, "     quote=d|s|n           select double, single, no quotes for values\n");
326   fprintf(output, "  -t a|ad|d|dd|e|r|u|ud    output format of time stamps (def: r: rel. to first)\n");
327   fprintf(output, "  -u s|hms                 output format of seconds (def: s: seconds)\n");
328   fprintf(output, "  -l                       flush standard output after each packet\n");
329   fprintf(output, "  -q                       be more quiet on stdout (e.g. when using statistics)\n");
330   fprintf(output, "  -Q                       only log true errors to stderr (quieter than -q)\n");
331   fprintf(output, "  -g                       enable group read access on the output file(s)\n");
332   fprintf(output, "  -W n                     Save extra information in the file, if supported.\n");
333   fprintf(output, "                           n = write network address resolution information\n");
334   fprintf(output, "  -X <key>:<value>         eXtension options, see the man page for details\n");
335   fprintf(output, "  -z <statistics>          various statistics, see the man page for details\n");
336
337   fprintf(output, "\n");
338   fprintf(output, "Miscellaneous:\n");
339   fprintf(output, "  -h                       display this help and exit\n");
340   fprintf(output, "  -v                       display version info and exit\n");
341   fprintf(output, "  -o <name>:<value> ...    override preference setting\n");
342   fprintf(output, "  -K <keytab>              keytab file to use for kerberos decryption\n");
343   fprintf(output, "  -G [report]              dump one of several available reports and exit\n");
344   fprintf(output, "                           default report=\"fields\"\n");
345   fprintf(output, "                           use \"-G ?\" for more help\n");
346 }
347
348 static void
349 glossary_option_help(void)
350 {
351   FILE *output;
352
353   output = stdout;
354
355   fprintf(output, "TShark " VERSION "%s\n", wireshark_svnversion);
356
357   fprintf(output, "\n");
358   fprintf(output, "Usage: tshark -G [report]\n");
359   fprintf(output, "\n");
360   fprintf(output, "Glossary table reports:\n");
361   fprintf(output, "  -G fields                dump fields glossary and exit\n");
362   fprintf(output, "  -G protocols             dump protocols in registration database and exit\n");
363   fprintf(output, "  -G values                dump value, range, true/false strings and exit\n");
364   fprintf(output, "  -G ftypes                dump field type basic and descriptive names\n");
365   fprintf(output, "  -G decodes               dump \"layer type\"/\"decode as\" associations and exit\n");
366   fprintf(output, "  -G heuristic-decodes     dump heuristic dissector tables\n");
367   fprintf(output, "\n");
368   fprintf(output, "Preference reports:\n");
369   fprintf(output, "  -G defaultprefs          dump default preferences and exit\n");
370   fprintf(output, "  -G currentprefs          dump current preferences and exit\n");
371   fprintf(output, "\n");
372 }
373
374 /*
375  * For a dissector table, print on the stream described by output,
376  * its short name (which is what's used in the "-d" option) and its
377  * descriptive name.
378  */
379 static void
380 display_dissector_table_names(const char *table_name, const char *ui_name,
381                               gpointer output)
382 {
383   if ((prev_display_dissector_name == NULL) ||
384       (strcmp(prev_display_dissector_name, table_name) != 0)) {
385      fprintf((FILE *)output, "\t%s (%s)\n", table_name, ui_name);
386      prev_display_dissector_name = table_name;
387   }
388 }
389
390 /*
391  * For a dissector handle, print on the stream described by output,
392  * the filter name (which is what's used in the "-d" option) and the full
393  * name for the protocol that corresponds to this handle.
394  */
395 static void
396 display_dissector_names(const gchar *table _U_, gpointer handle, gpointer output)
397 {
398   int          proto_id;
399   const gchar *proto_filter_name;
400   const gchar *proto_ui_name;
401
402   proto_id = dissector_handle_get_protocol_index((dissector_handle_t)handle);
403
404   if (proto_id != -1) {
405     proto_filter_name = proto_get_protocol_filter_name(proto_id);
406     proto_ui_name =  proto_get_protocol_name(proto_id);
407     g_assert(proto_filter_name != NULL);
408     g_assert(proto_ui_name != NULL);
409
410     if ((prev_display_dissector_name == NULL) ||
411         (strcmp(prev_display_dissector_name, proto_filter_name) != 0)) {
412       fprintf((FILE *)output, "\t%s (%s)\n",
413               proto_filter_name,
414               proto_ui_name);
415        prev_display_dissector_name = proto_filter_name;
416     }
417   }
418 }
419
420 /*
421  * The protocol_name_search structure is used by find_protocol_name_func()
422  * to pass parameters and store results
423  */
424 struct protocol_name_search{
425   gchar              *searched_name;  /* Protocol filter name we are looking for */
426   dissector_handle_t  matched_handle; /* Handle for a dissector whose protocol has the specified filter name */
427   guint               nb_match;       /* How many dissectors matched searched_name */
428 };
429 typedef struct protocol_name_search *protocol_name_search_t;
430
431 /*
432  * This function parses all dissectors associated with a table to find the
433  * one whose protocol has the specified filter name.  It is called
434  * as a reference function in a call to dissector_table_foreach_handle.
435  * The name we are looking for, as well as the results, are stored in the
436  * protocol_name_search struct pointed to by user_data.
437  * If called using dissector_table_foreach_handle, we actually parse the
438  * whole list of dissectors.
439  */
440 static void
441 find_protocol_name_func(const gchar *table _U_, gpointer handle, gpointer user_data)
442
443 {
444   int                     proto_id;
445   const gchar            *protocol_filter_name;
446   protocol_name_search_t  search_info;
447
448   g_assert(handle);
449
450   search_info = (protocol_name_search_t)user_data;
451
452   proto_id = dissector_handle_get_protocol_index((dissector_handle_t)handle);
453   if (proto_id != -1) {
454     protocol_filter_name = proto_get_protocol_filter_name(proto_id);
455     g_assert(protocol_filter_name != NULL);
456     if (strcmp(protocol_filter_name, search_info->searched_name) == 0) {
457       /* Found a match */
458       if (search_info->nb_match == 0) {
459         /* Record this handle only if this is the first match */
460         search_info->matched_handle = (dissector_handle_t)handle; /* Record the handle for this matching dissector */
461       }
462       search_info->nb_match++;
463     }
464   }
465 }
466
467 /*
468  * Allow dissector key names to be sorted alphabetically
469  */
470
471 static gint
472 compare_dissector_key_name(gconstpointer dissector_a, gconstpointer dissector_b)
473 {
474   return strcmp((const char*)dissector_a, (const char*)dissector_b);
475 }
476
477 /*
478  * Print all layer type names supported.
479  * We send the output to the stream described by the handle output.
480  */
481
482 static void
483 fprint_all_layer_types(FILE *output)
484
485 {
486   prev_display_dissector_name = NULL;
487   dissector_all_tables_foreach_table(display_dissector_table_names, (gpointer)output, (GCompareFunc)compare_dissector_key_name);
488 }
489
490 /*
491  * Print all protocol names supported for a specific layer type.
492  * table_name contains the layer type name in which the search is performed.
493  * We send the output to the stream described by the handle output.
494  */
495
496 static void
497 fprint_all_protocols_for_layer_types(FILE *output, gchar *table_name)
498
499 {
500   prev_display_dissector_name = NULL;
501   dissector_table_foreach_handle(table_name,
502                                  display_dissector_names,
503                                  (gpointer)output);
504 }
505
506 /*
507  * The function below parses the command-line parameters for the decode as
508  * feature (a string pointer by cl_param).
509  * It checks the format of the command-line, searches for a matching table
510  * and dissector.  If a table/dissector match is not found, we display a
511  * summary of the available tables/dissectors (on stderr) and return FALSE.
512  * If everything is fine, we get the "Decode as" preference activated,
513  * then we return TRUE.
514  */
515 static gboolean
516 add_decode_as(const gchar *cl_param)
517 {
518   gchar                        *table_name;
519   guint32                       selector, selector2;
520   gchar                        *decoded_param;
521   gchar                        *remaining_param;
522   gchar                        *selector_str;
523   gchar                        *dissector_str;
524   dissector_handle_t            dissector_matching;
525   dissector_table_t             table_matching;
526   ftenum_t                      dissector_table_selector_type;
527   struct protocol_name_search   user_protocol_name;
528   guint64                       i;
529   char                          op;
530
531   /* The following code will allocate and copy the command-line options in a string pointed by decoded_param */
532
533   g_assert(cl_param);
534   decoded_param = g_strdup(cl_param);
535   g_assert(decoded_param);
536
537
538   /* The lines below will parse this string (modifying it) to extract all
539     necessary information.  Note that decoded_param is still needed since
540     strings are not copied - we just save pointers. */
541
542   /* This section extracts a layer type (table_name) from decoded_param */
543   table_name = decoded_param; /* Layer type string starts from beginning */
544
545   remaining_param = strchr(table_name, '=');
546   if (remaining_param == NULL) {
547     cmdarg_err("Parameter \"%s\" doesn't follow the template \"%s\"", cl_param, decode_as_arg_template);
548     /* If the argument does not follow the template, carry on anyway to check
549        if the table name is at least correct.  If remaining_param is NULL,
550        we'll exit anyway further down */
551   }
552   else {
553     *remaining_param = '\0'; /* Terminate the layer type string (table_name) where '=' was detected */
554   }
555
556   /* Remove leading and trailing spaces from the table name */
557   while ( table_name[0] == ' ' )
558     table_name++;
559   while ( table_name[strlen(table_name) - 1] == ' ' )
560     table_name[strlen(table_name) - 1] = '\0'; /* Note: if empty string, while loop will eventually exit */
561
562 /* The following part searches a table matching with the layer type specified */
563   table_matching = NULL;
564
565 /* Look for the requested table */
566   if ( !(*(table_name)) ) { /* Is the table name empty, if so, don't even search for anything, display a message */
567     cmdarg_err("No layer type specified"); /* Note, we don't exit here, but table_matching will remain NULL, so we exit below */
568   }
569   else {
570     table_matching = find_dissector_table(table_name);
571     if (!table_matching) {
572       cmdarg_err("Unknown layer type -- %s", table_name); /* Note, we don't exit here, but table_matching will remain NULL, so we exit below */
573     }
574   }
575
576   if (!table_matching) {
577     /* Display a list of supported layer types to help the user, if the
578        specified layer type was not found */
579     cmdarg_err("Valid layer types are:");
580     fprint_all_layer_types(stderr);
581   }
582   if (remaining_param == NULL || !table_matching) {
583     /* Exit if the layer type was not found, or if no '=' separator was found
584        (see above) */
585     g_free(decoded_param);
586     return FALSE;
587   }
588
589   if (*(remaining_param + 1) != '=') { /* Check for "==" and not only '=' */
590     cmdarg_err("WARNING: -d requires \"==\" instead of \"=\". Option will be treated as \"%s==%s\"", table_name, remaining_param + 1);
591   }
592   else {
593     remaining_param++; /* Move to the second '=' */
594     *remaining_param = '\0'; /* Remove the second '=' */
595   }
596   remaining_param++; /* Position after the layer type string */
597
598   /* This section extracts a selector value (selector_str) from decoded_param */
599
600   selector_str = remaining_param; /* Next part starts with the selector number */
601
602   remaining_param = strchr(selector_str, ',');
603   if (remaining_param == NULL) {
604     cmdarg_err("Parameter \"%s\" doesn't follow the template \"%s\"", cl_param, decode_as_arg_template);
605     /* If the argument does not follow the template, carry on anyway to check
606        if the selector value is at least correct.  If remaining_param is NULL,
607        we'll exit anyway further down */
608   }
609   else {
610     *remaining_param = '\0'; /* Terminate the selector number string (selector_str) where ',' was detected */
611   }
612
613   dissector_table_selector_type = get_dissector_table_selector_type(table_name);
614
615   switch (dissector_table_selector_type) {
616
617   case FT_UINT8:
618   case FT_UINT16:
619   case FT_UINT24:
620   case FT_UINT32:
621     /* The selector for this table is an unsigned number.  Parse it as such.
622        There's no need to remove leading and trailing spaces from the
623        selector number string, because sscanf will do that for us. */
624     switch (sscanf(selector_str, "%u%c%u", &selector, &op, &selector2)) {
625       case 1:
626         op = '\0';
627         break;
628       case 3:
629         if (op != ':' && op != '-') {
630             cmdarg_err("Invalid selector numeric range \"%s\"", selector_str);
631             g_free(decoded_param);
632             return FALSE;
633         }
634         if (op == ':') {
635             if ((selector2 == 0) || ((guint64)selector + selector2 - 1) > G_MAXUINT32) {
636                 cmdarg_err("Invalid selector numeric range \"%s\"", selector_str);
637                 g_free(decoded_param);
638                 return FALSE;
639             }
640         }
641         else if (selector2 < selector) {
642             /* We could swap them for the user, but maybe it's better to call
643              * this out as an error in case it's not what was intended? */
644             cmdarg_err("Invalid selector numeric range \"%s\"", selector_str);
645             g_free(decoded_param);
646             return FALSE;
647         }
648         break;
649       default:
650         cmdarg_err("Invalid selector number \"%s\"", selector_str);
651         g_free(decoded_param);
652         return FALSE;
653     }
654     break;
655
656   case FT_STRING:
657   case FT_STRINGZ:
658     /* The selector for this table is a string. */
659     break;
660
661   default:
662     /* There are currently no dissector tables with any types other
663        than the ones listed above. */
664     g_assert_not_reached();
665   }
666
667   if (remaining_param == NULL) {
668     /* Exit if no ',' separator was found (see above) */
669     cmdarg_err("Valid protocols for layer type \"%s\" are:", table_name);
670     fprint_all_protocols_for_layer_types(stderr, table_name);
671     g_free(decoded_param);
672     return FALSE;
673   }
674
675   remaining_param++; /* Position after the selector number string */
676
677   /* This section extracts a protocol filter name (dissector_str) from decoded_param */
678
679   dissector_str = remaining_param; /* All the rest of the string is the dissector (decode as protocol) name */
680
681   /* Remove leading and trailing spaces from the dissector name */
682   while ( dissector_str[0] == ' ' )
683     dissector_str++;
684   while ( dissector_str[strlen(dissector_str) - 1] == ' ' )
685     dissector_str[strlen(dissector_str) - 1] = '\0'; /* Note: if empty string, while loop will eventually exit */
686
687   dissector_matching = NULL;
688
689   /* We now have a pointer to the handle for the requested table inside the variable table_matching */
690   if ( ! (*dissector_str) ) { /* Is the dissector name empty, if so, don't even search for a matching dissector and display all dissectors found for the selected table */
691     cmdarg_err("No protocol name specified"); /* Note, we don't exit here, but dissector_matching will remain NULL, so we exit below */
692   }
693   else {
694     user_protocol_name.nb_match = 0;
695     user_protocol_name.searched_name = dissector_str;
696     user_protocol_name.matched_handle = NULL;
697
698     dissector_table_foreach_handle(table_name, find_protocol_name_func, &user_protocol_name); /* Go and perform the search for this dissector in the this table's dissectors' names and shortnames */
699
700     if (user_protocol_name.nb_match != 0) {
701       dissector_matching = user_protocol_name.matched_handle;
702       if (user_protocol_name.nb_match > 1) {
703         cmdarg_err("WARNING: Protocol \"%s\" matched %u dissectors, first one will be used", dissector_str, user_protocol_name.nb_match);
704       }
705     }
706     else {
707       /* OK, check whether the problem is that there isn't any such
708          protocol, or that there is but it's not specified as a protocol
709          that's valid for that dissector table.
710          Note, we don't exit here, but dissector_matching will remain NULL,
711          so we exit below */
712       if (proto_get_id_by_filter_name(dissector_str) == -1) {
713         /* No such protocol */
714         cmdarg_err("Unknown protocol -- \"%s\"", dissector_str);
715       } else {
716         cmdarg_err("Protocol \"%s\" isn't valid for layer type \"%s\"",
717                    dissector_str, table_name);
718       }
719     }
720   }
721
722   if (!dissector_matching) {
723     cmdarg_err("Valid protocols for layer type \"%s\" are:", table_name);
724     fprint_all_protocols_for_layer_types(stderr, table_name);
725     g_free(decoded_param);
726     return FALSE;
727   }
728
729 /* This is the end of the code that parses the command-line options.
730    All information is now stored in the variables:
731    table_name
732    selector
733    dissector_matching
734    The above variables that are strings are still pointing to areas within
735    decoded_parm.  decoded_parm thus still needs to be kept allocated in
736    until we stop needing these variables
737    decoded_param will be deallocated at each exit point of this function */
738
739
740   /* We now have a pointer to the handle for the requested dissector
741      (requested protocol) inside the variable dissector_matching */
742   switch (dissector_table_selector_type) {
743
744   case FT_UINT8:
745   case FT_UINT16:
746   case FT_UINT24:
747   case FT_UINT32:
748     /* The selector for this table is an unsigned number. */
749     if (op == '\0') {
750       dissector_change_uint(table_name, selector, dissector_matching);
751     } else if (op == ':') {
752       for (i = selector; i < (guint64)selector + selector2; i++) {
753         dissector_change_uint(table_name, (guint32)i, dissector_matching);
754       }
755     } else { /* op == '-' */
756       for (i = selector; i <= selector2; i++) {
757         dissector_change_uint(table_name, (guint32)i, dissector_matching);
758       }
759     }
760     break;
761
762   case FT_STRING:
763   case FT_STRINGZ:
764     /* The selector for this table is a string. */
765     dissector_change_string(table_name, selector_str, dissector_matching);
766     break;
767
768   default:
769     /* There are currently no dissector tables with any types other
770        than the ones listed above. */
771     g_assert_not_reached();
772   }
773   g_free(decoded_param); /* "Decode As" rule has been successfully added */
774   return TRUE;
775 }
776
777 static void
778 tshark_log_handler (const gchar *log_domain, GLogLevelFlags log_level,
779     const gchar *message, gpointer user_data)
780 {
781   /* ignore log message, if log_level isn't interesting based
782      upon the console log preferences.
783      If the preferences haven't been loaded loaded yet, display the
784      message anyway.
785
786      The default console_log_level preference value is such that only
787        ERROR, CRITICAL and WARNING level messages are processed;
788        MESSAGE, INFO and DEBUG level messages are ignored.
789
790      XXX: Aug 07, 2009: Prior tshark g_log code was hardwired to process only
791            ERROR and CRITICAL level messages so the current code is a behavioral
792            change.  The current behavior is the same as in Wireshark.
793   */
794   if ((log_level & G_LOG_LEVEL_MASK & prefs.console_log_level) == 0 &&
795      prefs.console_log_level != 0) {
796     return;
797   }
798
799   g_log_default_handler(log_domain, log_level, message, user_data);
800
801 }
802
803 static char *
804 output_file_description(const char *fname)
805 {
806   char *save_file_string;
807
808   /* Get a string that describes what we're writing to */
809   if (strcmp(fname, "-") == 0) {
810     /* We're writing to the standard output */
811     save_file_string = g_strdup("standard output");
812   } else {
813     /* We're writing to a file with the name in save_file */
814     save_file_string = g_strdup_printf("file \"%s\"", fname);
815   }
816   return save_file_string;
817 }
818
819 static void
820 print_current_user(void) {
821   gchar *cur_user, *cur_group;
822
823   if (started_with_special_privs()) {
824     cur_user = get_cur_username();
825     cur_group = get_cur_groupname();
826     fprintf(stderr, "Running as user \"%s\" and group \"%s\".",
827       cur_user, cur_group);
828     g_free(cur_user);
829     g_free(cur_group);
830     if (running_with_special_privs()) {
831       fprintf(stderr, " This could be dangerous.");
832     }
833     fprintf(stderr, "\n");
834   }
835 }
836
837 static void
838 check_capture_privs(void) {
839 #ifdef _WIN32
840   load_wpcap();
841   /* Warn the user if npf.sys isn't loaded. */
842   if (!npf_sys_is_running() && get_os_major_version() >= 6) {
843     fprintf(stderr, "The NPF driver isn't running.  You may have trouble "
844       "capturing or\nlisting interfaces.\n");
845   }
846 #endif
847 }
848
849 static void
850 show_version(GString *comp_info_str, GString *runtime_info_str)
851 {
852   printf("TShark " VERSION "%s\n"
853          "\n"
854          "%s"
855          "\n"
856          "%s"
857          "\n"
858          "%s",
859          wireshark_svnversion, get_copyright_info(), comp_info_str->str,
860          runtime_info_str->str);
861 }
862
863 int
864 main(int argc, char *argv[])
865 {
866   GString             *comp_info_str;
867   GString             *runtime_info_str;
868   char                *init_progfile_dir_error;
869   int                  opt;
870   gboolean             arg_error = FALSE;
871
872 #ifdef _WIN32
873   WSADATA              wsaData;
874 #endif  /* _WIN32 */
875
876   char                *gpf_path, *pf_path;
877   char                *gdp_path, *dp_path;
878   int                  gpf_open_errno, gpf_read_errno;
879   int                  pf_open_errno, pf_read_errno;
880   int                  gdp_open_errno, gdp_read_errno;
881   int                  dp_open_errno, dp_read_errno;
882   int                  err;
883   volatile int         exit_status = 0;
884 #ifdef HAVE_LIBPCAP
885   gboolean             list_link_layer_types = FALSE;
886   gboolean             start_capture = FALSE;
887   int                  status;
888   GList               *if_list;
889   gchar               *err_str;
890 #else
891   gboolean             capture_option_specified = FALSE;
892 #endif
893   gboolean             quiet = FALSE;
894 #ifdef PCAP_NG_DEFAULT
895   volatile int         out_file_type = WTAP_FILE_PCAPNG;
896 #else
897   volatile int         out_file_type = WTAP_FILE_PCAP;
898 #endif
899   volatile gboolean    out_file_name_res = FALSE;
900   gchar               *volatile cf_name = NULL;
901   gchar               *rfilter = NULL;
902   gchar               *dfilter = NULL;
903 #ifdef HAVE_PCAP_OPEN_DEAD
904   struct bpf_program   fcode;
905 #endif
906   dfilter_t           *rfcode = NULL;
907   dfilter_t           *dfcode = NULL;
908   e_prefs             *prefs_p;
909   char                 badopt;
910   int                  log_flags;
911   int                  optind_initial;
912   gchar               *output_only = NULL;
913
914 #ifdef HAVE_PCAP_REMOTE
915 #define OPTSTRING_A "A:"
916 #else
917 #define OPTSTRING_A ""
918 #endif
919 #ifdef HAVE_LIBPCAP
920 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
921 #define OPTSTRING_B "B:"
922 #else
923 #define OPTSTRING_B ""
924 #endif  /* _WIN32 or HAVE_PCAP_CREATE */
925 #else /* HAVE_LIBPCAP */
926 #define OPTSTRING_B ""
927 #endif  /* HAVE_LIBPCAP */
928
929 #ifdef HAVE_PCAP_CREATE
930 #define OPTSTRING_I "I"
931 #else
932 #define OPTSTRING_I ""
933 #endif
934
935 #define OPTSTRING "2a:" OPTSTRING_A "b:" OPTSTRING_B "c:C:d:De:E:f:F:gG:hH:i:" OPTSTRING_I "K:lLnN:o:O:pPqQr:R:s:S:t:T:u:vVw:W:xX:y:Y:z:"
936
937   static const char    optstring[] = OPTSTRING;
938
939   /* Assemble the compile-time version information string */
940   comp_info_str = g_string_new("Compiled ");
941   get_compiled_version_info(comp_info_str, NULL, epan_get_compiled_version_info);
942
943   /* Assemble the run-time version information string */
944   runtime_info_str = g_string_new("Running ");
945   get_runtime_version_info(runtime_info_str, NULL);
946
947   /* Add it to the information to be reported on a crash. */
948   ws_add_crash_info("TShark " VERSION "%s\n"
949          "\n"
950          "%s"
951          "\n"
952          "%s",
953       wireshark_svnversion, comp_info_str->str, runtime_info_str->str);
954
955 #ifdef _WIN32
956   arg_list_utf_16to8(argc, argv);
957   create_app_running_mutex();
958 #if !GLIB_CHECK_VERSION(2,31,0)
959   g_thread_init(NULL);
960 #endif
961 #endif /* _WIN32 */
962
963   /*
964    * Get credential information for later use.
965    */
966   init_process_policies();
967
968   /*
969    * Attempt to get the pathname of the executable file.
970    */
971   init_progfile_dir_error = init_progfile_dir(argv[0], main);
972   if (init_progfile_dir_error != NULL) {
973     fprintf(stderr, "tshark: Can't get pathname of tshark program: %s.\n",
974             init_progfile_dir_error);
975   }
976
977   /*
978    * In order to have the -X opts assigned before the wslua machine starts
979    * we need to call getopts before epan_init() gets called.
980    */
981   opterr = 0;
982   optind_initial = optind;
983
984   while ((opt = getopt(argc, argv, optstring)) != -1) {
985     switch (opt) {
986     case 'C':        /* Configuration Profile */
987       if (profile_exists (optarg, FALSE)) {
988         set_profile_name (optarg);
989       } else {
990         cmdarg_err("Configuration Profile \"%s\" does not exist", optarg);
991         return 1;
992       }
993       break;
994     case 'P':        /* Print packet summary info even when writing to a file */
995       print_packet_info = TRUE;
996       print_summary = TRUE;
997       break;
998     case 'O':        /* Only output these protocols */
999       output_only = g_strdup(optarg);
1000       /* FALLTHROUGH */
1001     case 'V':        /* Verbose */
1002       print_details = TRUE;
1003       print_packet_info = TRUE;
1004       break;
1005     case 'x':        /* Print packet data in hex (and ASCII) */
1006       print_hex = TRUE;
1007       /*  The user asked for hex output, so let's ensure they get it,
1008        *  even if they're writing to a file.
1009        */
1010       print_packet_info = TRUE;
1011       break;
1012     case 'X':
1013       ex_opt_add(optarg);
1014       break;
1015     default:
1016       break;
1017     }
1018   }
1019
1020   /*
1021    * Print packet summary information is the default, unless either -V or -x
1022    * were specified and -P was not.  Note that this is new behavior, which
1023    * allows for the possibility of printing only hex/ascii output without
1024    * necessarily requiring that either the summary or details be printed too.
1025    */
1026   if (print_summary == -1)
1027     print_summary = (print_details || print_hex) ? FALSE : TRUE;
1028
1029   optind = optind_initial;
1030   opterr = 1;
1031
1032
1033
1034 /** Send All g_log messages to our own handler **/
1035
1036   log_flags =
1037                     G_LOG_LEVEL_ERROR|
1038                     G_LOG_LEVEL_CRITICAL|
1039                     G_LOG_LEVEL_WARNING|
1040                     G_LOG_LEVEL_MESSAGE|
1041                     G_LOG_LEVEL_INFO|
1042                     G_LOG_LEVEL_DEBUG|
1043                     G_LOG_FLAG_FATAL|G_LOG_FLAG_RECURSION;
1044
1045   g_log_set_handler(NULL,
1046                     (GLogLevelFlags)log_flags,
1047                     tshark_log_handler, NULL /* user_data */);
1048   g_log_set_handler(LOG_DOMAIN_MAIN,
1049                     (GLogLevelFlags)log_flags,
1050                     tshark_log_handler, NULL /* user_data */);
1051
1052 #ifdef HAVE_LIBPCAP
1053   g_log_set_handler(LOG_DOMAIN_CAPTURE,
1054                     (GLogLevelFlags)log_flags,
1055                     tshark_log_handler, NULL /* user_data */);
1056   g_log_set_handler(LOG_DOMAIN_CAPTURE_CHILD,
1057                     (GLogLevelFlags)log_flags,
1058                     tshark_log_handler, NULL /* user_data */);
1059 #endif
1060
1061   initialize_funnel_ops();
1062
1063 #ifdef HAVE_LIBPCAP
1064   capture_opts_init(&global_capture_opts);
1065   capture_session_init(&global_capture_session, (void *)&cfile);
1066 #endif
1067
1068   timestamp_set_type(TS_RELATIVE);
1069   timestamp_set_precision(TS_PREC_AUTO);
1070   timestamp_set_seconds_type(TS_SECONDS_DEFAULT);
1071
1072   /* Register all dissectors; we must do this before checking for the
1073      "-G" flag, as the "-G" flag dumps information registered by the
1074      dissectors, and we must do it before we read the preferences, in
1075      case any dissectors register preferences. */
1076   epan_init(register_all_protocols, register_all_protocol_handoffs, NULL, NULL,
1077             failure_message, open_failure_message, read_failure_message,
1078             write_failure_message);
1079
1080   /* Register all tap listeners; we do this before we parse the arguments,
1081      as the "-z" argument can specify a registered tap. */
1082
1083   /* we register the plugin taps before the other taps because
1084      stats_tree taps plugins will be registered as tap listeners
1085      by stats_tree_stat.c and need to registered before that */
1086 #ifdef HAVE_PLUGINS
1087   register_all_plugin_tap_listeners();
1088 #endif
1089   register_all_tap_listeners();
1090
1091   /* If invoked with the "-G" flag, we dump out information based on
1092      the argument to the "-G" flag; if no argument is specified,
1093      for backwards compatibility we dump out a glossary of display
1094      filter symbols.
1095
1096      XXX - we do this here, for now, to support "-G" with no arguments.
1097      If none of our build or other processes uses "-G" with no arguments,
1098      we can just process it with the other arguments. */
1099   if (argc >= 2 && strcmp(argv[1], "-G") == 0) {
1100     proto_initialize_all_prefixes();
1101
1102     if (argc == 2)
1103       proto_registrar_dump_fields();
1104     else {
1105       if (strcmp(argv[2], "fields") == 0)
1106         proto_registrar_dump_fields();
1107       else if (strcmp(argv[2], "protocols") == 0)
1108         proto_registrar_dump_protocols();
1109       else if (strcmp(argv[2], "values") == 0)
1110         proto_registrar_dump_values();
1111       else if (strcmp(argv[2], "ftypes") == 0)
1112         proto_registrar_dump_ftypes();
1113       else if (strcmp(argv[2], "decodes") == 0)
1114         dissector_dump_decodes();
1115       else if (strcmp(argv[2], "heuristic-decodes") == 0)
1116         dissector_dump_heur_decodes();
1117       else if (strcmp(argv[2], "defaultprefs") == 0)
1118         write_prefs(NULL);
1119       else if (strcmp(argv[2], "plugins") == 0)
1120         plugins_dump_all();
1121       else if (strcmp(argv[2], "?") == 0)
1122         glossary_option_help();
1123       else if (strcmp(argv[2], "-?") == 0)
1124         glossary_option_help();
1125       else if (strcmp(argv[2], "currentprefs") == 0) {
1126         read_prefs(&gpf_open_errno, &gpf_read_errno, &gpf_path,
1127             &pf_open_errno, &pf_read_errno, &pf_path);
1128         write_prefs(NULL);
1129       } else {
1130         cmdarg_err("Invalid \"%s\" option for -G flag, enter -G ? for more help.", argv[2]);
1131         return 1;
1132       }
1133     }
1134     return 0;
1135   }
1136
1137   /* Set the C-language locale to the native environment. */
1138   setlocale(LC_ALL, "");
1139
1140   prefs_p = read_prefs(&gpf_open_errno, &gpf_read_errno, &gpf_path,
1141                      &pf_open_errno, &pf_read_errno, &pf_path);
1142   if (gpf_path != NULL) {
1143     if (gpf_open_errno != 0) {
1144       cmdarg_err("Can't open global preferences file \"%s\": %s.",
1145               pf_path, g_strerror(gpf_open_errno));
1146     }
1147     if (gpf_read_errno != 0) {
1148       cmdarg_err("I/O error reading global preferences file \"%s\": %s.",
1149               pf_path, g_strerror(gpf_read_errno));
1150     }
1151   }
1152   if (pf_path != NULL) {
1153     if (pf_open_errno != 0) {
1154       cmdarg_err("Can't open your preferences file \"%s\": %s.", pf_path,
1155               g_strerror(pf_open_errno));
1156     }
1157     if (pf_read_errno != 0) {
1158       cmdarg_err("I/O error reading your preferences file \"%s\": %s.",
1159               pf_path, g_strerror(pf_read_errno));
1160     }
1161     g_free(pf_path);
1162     pf_path = NULL;
1163   }
1164
1165   /* Read the disabled protocols file. */
1166   read_disabled_protos_list(&gdp_path, &gdp_open_errno, &gdp_read_errno,
1167                             &dp_path, &dp_open_errno, &dp_read_errno);
1168   if (gdp_path != NULL) {
1169     if (gdp_open_errno != 0) {
1170       cmdarg_err("Could not open global disabled protocols file\n\"%s\": %s.",
1171                  gdp_path, g_strerror(gdp_open_errno));
1172     }
1173     if (gdp_read_errno != 0) {
1174       cmdarg_err("I/O error reading global disabled protocols file\n\"%s\": %s.",
1175                  gdp_path, g_strerror(gdp_read_errno));
1176     }
1177     g_free(gdp_path);
1178   }
1179   if (dp_path != NULL) {
1180     if (dp_open_errno != 0) {
1181       cmdarg_err(
1182         "Could not open your disabled protocols file\n\"%s\": %s.", dp_path,
1183         g_strerror(dp_open_errno));
1184     }
1185     if (dp_read_errno != 0) {
1186       cmdarg_err(
1187         "I/O error reading your disabled protocols file\n\"%s\": %s.", dp_path,
1188         g_strerror(dp_read_errno));
1189     }
1190     g_free(dp_path);
1191   }
1192
1193   check_capture_privs();
1194
1195   cap_file_init(&cfile);
1196
1197   /* Print format defaults to this. */
1198   print_format = PR_FMT_TEXT;
1199
1200   output_fields = output_fields_new();
1201
1202   /* Now get our args */
1203   while ((opt = getopt(argc, argv, optstring)) != -1) {
1204     switch (opt) {
1205     case '2':        /* Perform two pass analysis */
1206       perform_two_pass_analysis = TRUE;
1207       break;
1208     case 'a':        /* autostop criteria */
1209     case 'b':        /* Ringbuffer option */
1210     case 'c':        /* Capture x packets */
1211     case 'f':        /* capture filter */
1212     case 'g':        /* enable group read access on file(s) */
1213     case 'i':        /* Use interface x */
1214     case 'p':        /* Don't capture in promiscuous mode */
1215 #ifdef HAVE_PCAP_REMOTE
1216     case 'A':        /* Authentication */
1217 #endif
1218 #ifdef HAVE_PCAP_CREATE
1219     case 'I':        /* Capture in monitor mode, if available */
1220 #endif
1221     case 's':        /* Set the snapshot (capture) length */
1222     case 'w':        /* Write to capture file x */
1223     case 'y':        /* Set the pcap data link type */
1224 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
1225     case 'B':        /* Buffer size */
1226 #endif /* _WIN32 or HAVE_PCAP_CREATE */
1227 #ifdef HAVE_LIBPCAP
1228       status = capture_opts_add_opt(&global_capture_opts, opt, optarg, &start_capture);
1229       if (status != 0) {
1230         return status;
1231       }
1232 #else
1233       capture_option_specified = TRUE;
1234       arg_error = TRUE;
1235 #endif
1236       break;
1237     case 'C':
1238       /* Configuration profile settings were already processed just ignore them this time*/
1239       break;
1240     case 'd':        /* Decode as rule */
1241       if (!add_decode_as(optarg))
1242         return 1;
1243       break;
1244 #if defined(HAVE_HEIMDAL_KERBEROS) || defined(HAVE_MIT_KERBEROS)
1245     case 'K':        /* Kerberos keytab file */
1246       read_keytab_file(optarg);
1247       break;
1248 #endif
1249     case 'D':        /* Print a list of capture devices and exit */
1250 #ifdef HAVE_LIBPCAP
1251       if_list = capture_interface_list(&err, &err_str,NULL);
1252       if (if_list == NULL) {
1253         switch (err) {
1254         case CANT_GET_INTERFACE_LIST:
1255         case DONT_HAVE_PCAP:
1256           cmdarg_err("%s", err_str);
1257           g_free(err_str);
1258           break;
1259
1260         case NO_INTERFACES_FOUND:
1261           cmdarg_err("There are no interfaces on which a capture can be done");
1262           break;
1263         }
1264         return 2;
1265       }
1266       capture_opts_print_interfaces(if_list);
1267       free_interface_list(if_list);
1268       return 0;
1269 #else
1270       capture_option_specified = TRUE;
1271       arg_error = TRUE;
1272 #endif
1273       break;
1274     case 'e':
1275       /* Field entry */
1276       output_fields_add(output_fields, optarg);
1277       break;
1278     case 'E':
1279       /* Field option */
1280       if (!output_fields_set_option(output_fields, optarg)) {
1281         cmdarg_err("\"%s\" is not a valid field output option=value pair.", optarg);
1282         output_fields_list_options(stderr);
1283         return 1;
1284       }
1285       break;
1286     case 'F':
1287       out_file_type = wtap_short_string_to_file_type(optarg);
1288       if (out_file_type < 0) {
1289         cmdarg_err("\"%s\" isn't a valid capture file type", optarg);
1290         list_capture_types();
1291         return 1;
1292       }
1293       break;
1294     case 'W':        /* Select extra information to save in our capture file */
1295       /* This is patterned after the -N flag which may not be the best idea. */
1296       if (strchr(optarg, 'n')) {
1297         out_file_name_res = TRUE;
1298       } else {
1299         cmdarg_err("Invalid -W argument \"%s\"", optarg);
1300         return 1;
1301       }
1302       break;
1303     case 'H':        /* Read address to name mappings from a hosts file */
1304       if (! add_hosts_file(optarg))
1305       {
1306         cmdarg_err("Can't read host entries from \"%s\"", optarg);
1307         return 1;
1308       }
1309       out_file_name_res = TRUE;
1310       break;
1311
1312     case 'h':        /* Print help and exit */
1313       print_usage(TRUE);
1314       return 0;
1315       break;
1316     case 'l':        /* "Line-buffer" standard output */
1317       /* This isn't line-buffering, strictly speaking, it's just
1318          flushing the standard output after the information for
1319          each packet is printed; however, that should be good
1320          enough for all the purposes to which "-l" is put (and
1321          is probably actually better for "-V", as it does fewer
1322          writes).
1323
1324          See the comment in "process_packet()" for an explanation of
1325          why we do that, and why we don't just use "setvbuf()" to
1326          make the standard output line-buffered (short version: in
1327          Windows, "line-buffered" is the same as "fully-buffered",
1328          and the output buffer is only flushed when it fills up). */
1329       line_buffered = TRUE;
1330       break;
1331     case 'L':        /* Print list of link-layer types and exit */
1332 #ifdef HAVE_LIBPCAP
1333       list_link_layer_types = TRUE;
1334 #else
1335       capture_option_specified = TRUE;
1336       arg_error = TRUE;
1337 #endif
1338       break;
1339     case 'n':        /* No name resolution */
1340       gbl_resolv_flags.mac_name = FALSE;
1341       gbl_resolv_flags.network_name = FALSE;
1342       gbl_resolv_flags.transport_name = FALSE;
1343       gbl_resolv_flags.concurrent_dns = FALSE;
1344       break;
1345     case 'N':        /* Select what types of addresses/port #s to resolve */
1346       badopt = string_to_name_resolve(optarg, &gbl_resolv_flags);
1347       if (badopt != '\0') {
1348         cmdarg_err("-N specifies unknown resolving option '%c';",
1349                    badopt);
1350         cmdarg_err_cont( "           Valid options are 'm', 'n', 't', and 'C'");
1351         return 1;
1352       }
1353       break;
1354     case 'o':        /* Override preference from command line */
1355       switch (prefs_set_pref(optarg)) {
1356
1357       case PREFS_SET_OK:
1358         break;
1359
1360       case PREFS_SET_SYNTAX_ERR:
1361         cmdarg_err("Invalid -o flag \"%s\"", optarg);
1362         return 1;
1363         break;
1364
1365       case PREFS_SET_NO_SUCH_PREF:
1366       case PREFS_SET_OBSOLETE:
1367         cmdarg_err("-o flag \"%s\" specifies unknown preference", optarg);
1368         return 1;
1369         break;
1370       }
1371       break;
1372     case 'q':        /* Quiet */
1373       quiet = TRUE;
1374       break;
1375     case 'Q':        /* Really quiet */
1376       quiet = TRUE;
1377       really_quiet = TRUE;
1378       break;
1379     case 'r':        /* Read capture file x */
1380       cf_name = g_strdup(optarg);
1381       break;
1382     case 'R':        /* Read file filter */
1383       rfilter = optarg;
1384       break;
1385     case 'P':
1386         /* already processed; just ignore it now */
1387         break;
1388     case 'S':        /* Set the line Separator to be printed between packets */
1389       separator = strdup(optarg);
1390       break;
1391     case 't':        /* Time stamp type */
1392       if (strcmp(optarg, "r") == 0)
1393         timestamp_set_type(TS_RELATIVE);
1394       else if (strcmp(optarg, "a") == 0)
1395         timestamp_set_type(TS_ABSOLUTE);
1396       else if (strcmp(optarg, "ad") == 0)
1397         timestamp_set_type(TS_ABSOLUTE_WITH_DATE);
1398       else if (strcmp(optarg, "d") == 0)
1399         timestamp_set_type(TS_DELTA);
1400       else if (strcmp(optarg, "dd") == 0)
1401         timestamp_set_type(TS_DELTA_DIS);
1402       else if (strcmp(optarg, "e") == 0)
1403         timestamp_set_type(TS_EPOCH);
1404       else if (strcmp(optarg, "u") == 0)
1405         timestamp_set_type(TS_UTC);
1406       else if (strcmp(optarg, "ud") == 0)
1407         timestamp_set_type(TS_UTC_WITH_DATE);
1408       else {
1409         cmdarg_err("Invalid time stamp type \"%s\"",
1410                    optarg);
1411         cmdarg_err_cont("It must be \"a\" for absolute, \"ad\" for absolute with date, \"d\" for delta,");
1412         cmdarg_err_cont("\"dd\" for delta displayed, \"e\" for epoch, \"r\" for relative, \"u\" for UTC, ");
1413         cmdarg_err_cont("or \"ud\" for UTC with date.");
1414         return 1;
1415       }
1416       break;
1417     case 'T':        /* printing Type */
1418       if (strcmp(optarg, "text") == 0) {
1419         output_action = WRITE_TEXT;
1420         print_format = PR_FMT_TEXT;
1421       } else if (strcmp(optarg, "ps") == 0) {
1422         output_action = WRITE_TEXT;
1423         print_format = PR_FMT_PS;
1424       } else if (strcmp(optarg, "pdml") == 0) {
1425         output_action = WRITE_XML;
1426         print_details = TRUE;   /* Need details */
1427         print_summary = FALSE;  /* Don't allow summary */
1428       } else if (strcmp(optarg, "psml") == 0) {
1429         output_action = WRITE_XML;
1430         print_details = FALSE;  /* Don't allow details */
1431         print_summary = TRUE;   /* Need summary */
1432       } else if (strcmp(optarg, "fields") == 0) {
1433         output_action = WRITE_FIELDS;
1434         print_details = TRUE;   /* Need full tree info */
1435         print_summary = FALSE;  /* Don't allow summary */
1436       } else {
1437         cmdarg_err("Invalid -T parameter.");
1438         cmdarg_err_cont("It must be \"ps\", \"text\", \"pdml\", \"psml\" or \"fields\".");
1439         return 1;
1440       }
1441       break;
1442     case 'u':        /* Seconds type */
1443       if (strcmp(optarg, "s") == 0)
1444         timestamp_set_seconds_type(TS_SECONDS_DEFAULT);
1445       else if (strcmp(optarg, "hms") == 0)
1446         timestamp_set_seconds_type(TS_SECONDS_HOUR_MIN_SEC);
1447       else {
1448         cmdarg_err("Invalid seconds type \"%s\"", optarg);
1449         cmdarg_err_cont("It must be \"s\" for seconds or \"hms\" for hours, minutes and seconds.");
1450         return 1;
1451       }
1452       break;
1453     case 'v':         /* Show version and exit */
1454     {
1455       show_version(comp_info_str, runtime_info_str);
1456       g_string_free(comp_info_str, TRUE);
1457       g_string_free(runtime_info_str, TRUE);
1458       /* We don't really have to cleanup here, but it's a convenient way to test
1459        * start-up and shut-down of the epan library without any UI-specific
1460        * cruft getting in the way. Makes the results of running
1461        * $ ./tools/valgrind-wireshark -n
1462        * much more useful. */
1463       epan_cleanup();
1464       return 0;
1465     }
1466     case 'O':        /* Only output these protocols */
1467       /* already processed; just ignore it now */
1468       break;
1469     case 'V':        /* Verbose */
1470       /* already processed; just ignore it now */
1471       break;
1472     case 'x':        /* Print packet data in hex (and ASCII) */
1473       /* already processed; just ignore it now */
1474       break;
1475     case 'X':
1476       break;
1477     case 'Y':
1478       dfilter = optarg;
1479       break;
1480     case 'z':
1481       /* We won't call the init function for the stat this soon
1482          as it would disallow MATE's fields (which are registered
1483          by the preferences set callback) from being used as
1484          part of a tap filter.  Instead, we just add the argument
1485          to a list of stat arguments. */
1486       if (!process_stat_cmd_arg(optarg)) {
1487         if (strcmp("help", optarg)==0) {
1488           fprintf(stderr, "tshark: The available statistics for the \"-z\" option are:\n");
1489           list_stat_cmd_args();
1490           return 0;
1491         }
1492         cmdarg_err("Invalid -z argument \"%s\".", optarg);
1493         cmdarg_err_cont("  -z argument must be one of :");
1494         list_stat_cmd_args();
1495         return 1;
1496       }
1497       break;
1498     default:
1499     case '?':        /* Bad flag - print usage message */
1500       switch(optopt) {
1501       case 'F':
1502         list_capture_types();
1503         break;
1504       default:
1505         print_usage(TRUE);
1506       }
1507       return 1;
1508       break;
1509     }
1510   }
1511
1512   /* If we specified output fields, but not the output field type... */
1513   if (WRITE_FIELDS != output_action && 0 != output_fields_num_fields(output_fields)) {
1514         cmdarg_err("Output fields were specified with \"-e\", "
1515             "but \"-Tfields\" was not specified.");
1516         return 1;
1517   } else if (WRITE_FIELDS == output_action && 0 == output_fields_num_fields(output_fields)) {
1518         cmdarg_err("\"-Tfields\" was specified, but no fields were "
1519                     "specified with \"-e\".");
1520
1521         return 1;
1522   }
1523
1524   /* If no capture filter or display filter has been specified, and there are
1525      still command-line arguments, treat them as the tokens of a capture
1526      filter (if no "-r" flag was specified) or a display filter (if a "-r"
1527      flag was specified. */
1528   if (optind < argc) {
1529     if (cf_name != NULL) {
1530       if (dfilter != NULL) {
1531         cmdarg_err("Display filters were specified both with \"-d\" "
1532             "and with additional command-line arguments.");
1533         return 1;
1534       }
1535       dfilter = get_args_as_string(argc, argv, optind);
1536     } else {
1537 #ifdef HAVE_LIBPCAP
1538       guint i;
1539
1540       if (global_capture_opts.default_options.cfilter) {
1541         cmdarg_err("A default capture filter was specified both with \"-f\""
1542             " and with additional command-line arguments.");
1543         return 1;
1544       }
1545       for (i = 0; i < global_capture_opts.ifaces->len; i++) {
1546         interface_options interface_opts;
1547         interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
1548         if (interface_opts.cfilter == NULL) {
1549           interface_opts.cfilter = get_args_as_string(argc, argv, optind);
1550           global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, i);
1551           g_array_insert_val(global_capture_opts.ifaces, i, interface_opts);
1552         } else {
1553           cmdarg_err("A capture filter was specified both with \"-f\""
1554               " and with additional command-line arguments.");
1555           return 1;
1556         }
1557       }
1558       global_capture_opts.default_options.cfilter = get_args_as_string(argc, argv, optind);
1559 #else
1560       capture_option_specified = TRUE;
1561 #endif
1562     }
1563   }
1564
1565 #ifdef HAVE_LIBPCAP
1566   if (!global_capture_opts.saving_to_file) {
1567     /* We're not saving the capture to a file; if "-q" wasn't specified,
1568        we should print packet information */
1569     if (!quiet)
1570       print_packet_info = TRUE;
1571   } else {
1572     /* We're saving to a file; if we're writing to the standard output.
1573        and we'll also be writing dissected packets to the standard
1574        output, reject the request.  At best, we could redirect that
1575        to the standard error; we *can't* write both to the standard
1576        output and have either of them be useful. */
1577     if (strcmp(global_capture_opts.save_file, "-") == 0 && print_packet_info) {
1578       cmdarg_err("You can't write both raw packet data and dissected packets"
1579           " to the standard output.");
1580       return 1;
1581     }
1582   }
1583 #else
1584   /* We're not saving the capture to a file; if "-q" wasn't specified,
1585      we should print packet information */
1586   if (!quiet)
1587     print_packet_info = TRUE;
1588 #endif
1589
1590 #ifndef HAVE_LIBPCAP
1591   if (capture_option_specified)
1592     cmdarg_err("This version of TShark was not built with support for capturing packets.");
1593 #endif
1594   if (arg_error) {
1595     print_usage(FALSE);
1596     return 1;
1597   }
1598
1599   /* We don't support capture filters when reading from a capture file
1600      (the BPF compiler doesn't support all link-layer types that we
1601      support in capture files we read). */
1602 #ifdef HAVE_LIBPCAP
1603   if (cf_name != NULL) {
1604     if (global_capture_opts.default_options.cfilter) {
1605       cmdarg_err("Only read filters, not capture filters, "
1606           "can be specified when reading a capture file.");
1607       return 1;
1608     }
1609   }
1610 #endif
1611
1612   if (print_hex) {
1613     if (output_action != WRITE_TEXT) {
1614       cmdarg_err("Raw packet hex data can only be printed as text or PostScript");
1615       return 1;
1616     }
1617   }
1618
1619   if (output_only != NULL) {
1620     char *ps;
1621
1622     if (!print_details) {
1623       cmdarg_err("-O requires -V");
1624       return 1;
1625     }
1626
1627     output_only_tables = g_hash_table_new (g_str_hash, g_str_equal);
1628     for (ps = strtok (output_only, ","); ps; ps = strtok (NULL, ",")) {
1629       g_hash_table_insert(output_only_tables, (gpointer)ps, (gpointer)ps);
1630     }
1631   }
1632
1633   if (rfilter != NULL && !perform_two_pass_analysis) {
1634     /* Just a warning, so we don't return */
1635     cmdarg_err("-R without -2 is deprecated. For single-pass filtering use -Y.");
1636   }
1637
1638 #ifdef HAVE_LIBPCAP
1639   if (list_link_layer_types) {
1640     /* We're supposed to list the link-layer types for an interface;
1641        did the user also specify a capture file to be read? */
1642     if (cf_name) {
1643       /* Yes - that's bogus. */
1644       cmdarg_err("You can't specify -L and a capture file to be read.");
1645       return 1;
1646     }
1647     /* No - did they specify a ring buffer option? */
1648     if (global_capture_opts.multi_files_on) {
1649       cmdarg_err("Ring buffer requested, but a capture isn't being done.");
1650       return 1;
1651     }
1652   } else {
1653     if (cf_name) {
1654       /*
1655        * "-r" was specified, so we're reading a capture file.
1656        * Capture options don't apply here.
1657        */
1658       if (global_capture_opts.multi_files_on) {
1659         cmdarg_err("Multiple capture files requested, but "
1660                    "a capture isn't being done.");
1661         return 1;
1662       }
1663       if (global_capture_opts.has_file_duration) {
1664         cmdarg_err("Switching capture files after a time interval was specified, but "
1665                    "a capture isn't being done.");
1666         return 1;
1667       }
1668       if (global_capture_opts.has_ring_num_files) {
1669         cmdarg_err("A ring buffer of capture files was specified, but "
1670           "a capture isn't being done.");
1671         return 1;
1672       }
1673       if (global_capture_opts.has_autostop_files) {
1674         cmdarg_err("A maximum number of capture files was specified, but "
1675           "a capture isn't being done.");
1676         return 1;
1677       }
1678
1679       /* Note: TShark now allows the restriction of a _read_ file by packet count
1680        * and byte count as well as a write file. Other autostop options remain valid
1681        * only for a write file.
1682        */
1683       if (global_capture_opts.has_autostop_duration) {
1684         cmdarg_err("A maximum capture time was specified, but "
1685           "a capture isn't being done.");
1686         return 1;
1687       }
1688     } else {
1689       /*
1690        * "-r" wasn't specified, so we're doing a live capture.
1691        */
1692       if (global_capture_opts.saving_to_file) {
1693         /* They specified a "-w" flag, so we'll be saving to a capture file. */
1694
1695         /* When capturing, we only support writing pcap or pcap-ng format. */
1696         if (out_file_type != WTAP_FILE_PCAP && out_file_type != WTAP_FILE_PCAPNG) {
1697           cmdarg_err("Live captures can only be saved in libpcap format.");
1698           return 1;
1699         }
1700         if (global_capture_opts.multi_files_on) {
1701           /* Multiple-file mode doesn't work under certain conditions:
1702              a) it doesn't work if you're writing to the standard output;
1703              b) it doesn't work if you're writing to a pipe;
1704           */
1705           if (strcmp(global_capture_opts.save_file, "-") == 0) {
1706             cmdarg_err("Multiple capture files requested, but "
1707               "the capture is being written to the standard output.");
1708             return 1;
1709           }
1710           if (global_capture_opts.output_to_pipe) {
1711             cmdarg_err("Multiple capture files requested, but "
1712               "the capture file is a pipe.");
1713             return 1;
1714           }
1715           if (!global_capture_opts.has_autostop_filesize &&
1716               !global_capture_opts.has_file_duration) {
1717             cmdarg_err("Multiple capture files requested, but "
1718               "no maximum capture file size or duration was specified.");
1719             return 1;
1720           }
1721         }
1722         /* Currently, we don't support read or display filters when capturing
1723            and saving the packets. */
1724         if (rfilter != NULL) {
1725           cmdarg_err("Read filters aren't supported when capturing and saving the captured packets.");
1726           return 1;
1727         }
1728         if (dfilter != NULL) {
1729           cmdarg_err("Display filters aren't supported when capturing and saving the captured packets.");
1730           return 1;
1731         }
1732       } else {
1733         /* They didn't specify a "-w" flag, so we won't be saving to a
1734            capture file.  Check for options that only make sense if
1735            we're saving to a file. */
1736         if (global_capture_opts.has_autostop_filesize) {
1737           cmdarg_err("Maximum capture file size specified, but "
1738            "capture isn't being saved to a file.");
1739           return 1;
1740         }
1741         if (global_capture_opts.multi_files_on) {
1742           cmdarg_err("Multiple capture files requested, but "
1743             "the capture isn't being saved to a file.");
1744           return 1;
1745         }
1746       }
1747     }
1748   }
1749 #endif
1750
1751 #ifdef _WIN32
1752   /* Start windows sockets */
1753   WSAStartup( MAKEWORD( 1, 1 ), &wsaData );
1754 #endif /* _WIN32 */
1755
1756   /* Notify all registered modules that have had any of their preferences
1757      changed either from one of the preferences file or from the command
1758      line that their preferences have changed. */
1759   prefs_apply_all();
1760
1761   /* At this point MATE will have registered its field array so we can
1762      have a tap filter with one of MATE's late-registered fields as part
1763      of the filter.  We can now process all the "-z" arguments. */
1764   start_requested_stats();
1765
1766 #ifdef HAVE_LIBPCAP
1767   /* We currently don't support taps, or printing dissected packets,
1768      if we're writing to a pipe. */
1769   if (global_capture_opts.saving_to_file &&
1770       global_capture_opts.output_to_pipe) {
1771     if (tap_listeners_require_dissection()) {
1772       cmdarg_err("Taps aren't supported when saving to a pipe.");
1773       return 1;
1774     }
1775     if (print_packet_info) {
1776       cmdarg_err("Printing dissected packets isn't supported when saving to a pipe.");
1777       return 1;
1778     }
1779   }
1780 #endif
1781
1782   /* disabled protocols as per configuration file */
1783   if (gdp_path == NULL && dp_path == NULL) {
1784     set_disabled_protos_list();
1785   }
1786
1787   /* Build the column format array */
1788   build_column_format_array(&cfile.cinfo, prefs_p->num_cols, TRUE);
1789
1790 #ifdef HAVE_LIBPCAP
1791   capture_opts_trim_snaplen(&global_capture_opts, MIN_PACKET_SIZE);
1792   capture_opts_trim_ring_num_files(&global_capture_opts);
1793 #endif
1794
1795   if (rfilter != NULL) {
1796     if (!dfilter_compile(rfilter, &rfcode)) {
1797       cmdarg_err("%s", dfilter_error_msg);
1798       epan_cleanup();
1799 #ifdef HAVE_PCAP_OPEN_DEAD
1800       {
1801         pcap_t *pc;
1802
1803         pc = pcap_open_dead(DLT_EN10MB, MIN_PACKET_SIZE);
1804         if (pc != NULL) {
1805           if (pcap_compile(pc, &fcode, rfilter, 0, 0) != -1) {
1806             cmdarg_err_cont(
1807               "  Note: That read filter code looks like a valid capture filter;");
1808             cmdarg_err_cont(
1809               "        maybe you mixed them up?");
1810           }
1811           pcap_close(pc);
1812         }
1813       }
1814 #endif
1815       return 2;
1816     }
1817   }
1818   cfile.rfcode = rfcode;
1819
1820   if (dfilter != NULL) {
1821     if (!dfilter_compile(dfilter, &dfcode)) {
1822       cmdarg_err("%s", dfilter_error_msg);
1823       epan_cleanup();
1824 #ifdef HAVE_PCAP_OPEN_DEAD
1825       {
1826         pcap_t *pc;
1827
1828         pc = pcap_open_dead(DLT_EN10MB, MIN_PACKET_SIZE);
1829         if (pc != NULL) {
1830           if (pcap_compile(pc, &fcode, dfilter, 0, 0) != -1) {
1831             cmdarg_err_cont(
1832               "  Note: That display filter code looks like a valid capture filter;");
1833             cmdarg_err_cont(
1834               "        maybe you mixed them up?");
1835           }
1836           pcap_close(pc);
1837         }
1838       }
1839 #endif
1840       return 2;
1841     }
1842   }
1843   cfile.dfcode = dfcode;
1844
1845   if (print_packet_info) {
1846     /* If we're printing as text or PostScript, we have
1847        to create a print stream. */
1848     if (output_action == WRITE_TEXT) {
1849       switch (print_format) {
1850
1851       case PR_FMT_TEXT:
1852         print_stream = print_stream_text_stdio_new(stdout);
1853         break;
1854
1855       case PR_FMT_PS:
1856         print_stream = print_stream_ps_stdio_new(stdout);
1857         break;
1858
1859       default:
1860         g_assert_not_reached();
1861       }
1862     }
1863   }
1864
1865   /* We have to dissect each packet if:
1866
1867         we're printing information about each packet;
1868
1869         we're using a read filter on the packets;
1870
1871         we're using a display filter on the packets;
1872
1873         we're using any taps that need dissection. */
1874   do_dissection = print_packet_info || rfcode || dfcode || tap_listeners_require_dissection();
1875
1876   if (cf_name) {
1877     /*
1878      * We're reading a capture file.
1879      */
1880
1881     /*
1882      * Immediately relinquish any special privileges we have; we must not
1883      * be allowed to read any capture files the user running TShark
1884      * can't open.
1885      */
1886     relinquish_special_privs_perm();
1887     print_current_user();
1888
1889     if (cf_open(&cfile, cf_name, FALSE, &err) != CF_OK) {
1890       epan_cleanup();
1891       return 2;
1892     }
1893
1894     /* Set timestamp precision; there should arguably be a command-line
1895        option to let the user set this. */
1896     switch(wtap_file_tsprecision(cfile.wth)) {
1897     case(WTAP_FILE_TSPREC_SEC):
1898       timestamp_set_precision(TS_PREC_AUTO_SEC);
1899       break;
1900     case(WTAP_FILE_TSPREC_DSEC):
1901       timestamp_set_precision(TS_PREC_AUTO_DSEC);
1902       break;
1903     case(WTAP_FILE_TSPREC_CSEC):
1904       timestamp_set_precision(TS_PREC_AUTO_CSEC);
1905       break;
1906     case(WTAP_FILE_TSPREC_MSEC):
1907       timestamp_set_precision(TS_PREC_AUTO_MSEC);
1908       break;
1909     case(WTAP_FILE_TSPREC_USEC):
1910       timestamp_set_precision(TS_PREC_AUTO_USEC);
1911       break;
1912     case(WTAP_FILE_TSPREC_NSEC):
1913       timestamp_set_precision(TS_PREC_AUTO_NSEC);
1914       break;
1915     default:
1916       g_assert_not_reached();
1917     }
1918
1919     /* Process the packets in the file */
1920     TRY {
1921 #ifdef HAVE_LIBPCAP
1922       err = load_cap_file(&cfile, global_capture_opts.save_file, out_file_type, out_file_name_res,
1923           global_capture_opts.has_autostop_packets ? global_capture_opts.autostop_packets : 0,
1924           global_capture_opts.has_autostop_filesize ? global_capture_opts.autostop_filesize : 0);
1925 #else
1926       err = load_cap_file(&cfile, NULL, out_file_type, out_file_name_res, 0, 0);
1927 #endif
1928     }
1929     CATCH(OutOfMemoryError) {
1930       fprintf(stderr,
1931               "Out Of Memory!\n"
1932               "\n"
1933               "Sorry, but TShark has to terminate now!\n"
1934               "\n"
1935               "Some infos / workarounds can be found at:\n"
1936               "http://wiki.wireshark.org/KnownBugs/OutOfMemory\n");
1937       err = ENOMEM;
1938     }
1939     ENDTRY;
1940     if (err != 0) {
1941       /* We still dump out the results of taps, etc., as we might have
1942          read some packets; however, we exit with an error status. */
1943       exit_status = 2;
1944     }
1945   } else {
1946     /* No capture file specified, so we're supposed to do a live capture
1947        or get a list of link-layer types for a live capture device;
1948        do we have support for live captures? */
1949 #ifdef HAVE_LIBPCAP
1950     /* if no interface was specified, pick a default */
1951     exit_status = capture_opts_default_iface_if_necessary(&global_capture_opts,
1952         ((prefs_p->capture_device) && (*prefs_p->capture_device != '\0')) ? get_if_name(prefs_p->capture_device) : NULL);
1953     if (exit_status != 0)
1954         return exit_status;
1955
1956     /* if requested, list the link layer types and exit */
1957     if (list_link_layer_types) {
1958         guint i;
1959
1960         /* Get the list of link-layer types for the capture devices. */
1961         for (i = 0; i < global_capture_opts.ifaces->len; i++) {
1962           interface_options  interface_opts;
1963           if_capabilities_t *caps;
1964
1965           interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
1966           caps = capture_get_if_capabilities(interface_opts.name, interface_opts.monitor_mode, &err_str, NULL);
1967           if (caps == NULL) {
1968             cmdarg_err("%s", err_str);
1969             g_free(err_str);
1970             return 2;
1971           }
1972           if (caps->data_link_types == NULL) {
1973             cmdarg_err("The capture device \"%s\" has no data link types.", interface_opts.name);
1974             return 2;
1975           }
1976           capture_opts_print_if_capabilities(caps, interface_opts.name, interface_opts.monitor_mode);
1977           free_if_capabilities(caps);
1978         }
1979         return 0;
1980     }
1981
1982     if (print_packet_info) {
1983       if (!write_preamble(NULL)) {
1984         show_print_file_io_error(errno);
1985         return 2;
1986       }
1987     } else if (!quiet) {
1988       /*
1989        * We're not printing information for each packet, and the user
1990        * didn't ask us not to print a count of packets as they arrive,
1991        * so print that count so the user knows that packets are arriving.
1992        *
1993        * XXX - what if the user wants to do a live capture, doesn't want
1994        * to save it to a file, doesn't want information printed for each
1995        * packet, does want some "-z" statistic, and wants packet counts
1996        * so they know whether they're seeing any packets?
1997        */
1998       print_packet_counts = TRUE;
1999     }
2000
2001     /* For now, assume libpcap gives microsecond precision. */
2002     timestamp_set_precision(TS_PREC_AUTO_USEC);
2003
2004     /*
2005      * XXX - this returns FALSE if an error occurred, but it also
2006      * returns FALSE if the capture stops because a time limit
2007      * was reached (and possibly other limits), so we can't assume
2008      * it means an error.
2009      *
2010      * The capture code is a bit twisty, so it doesn't appear to
2011      * be an easy fix.  We just ignore the return value for now.
2012      * Instead, pass on the exit status from the capture child.
2013      */
2014     capture();
2015     exit_status = global_capture_session.fork_child_status;
2016
2017     if (print_packet_info) {
2018       if (!write_finale()) {
2019         err = errno;
2020         show_print_file_io_error(err);
2021       }
2022     }
2023 #else
2024     /* No - complain. */
2025     cmdarg_err("This version of TShark was not built with support for capturing packets.");
2026     return 2;
2027 #endif
2028   }
2029
2030   g_free(cf_name);
2031
2032   if (cfile.frames != NULL) {
2033     free_frame_data_sequence(cfile.frames);
2034     cfile.frames = NULL;
2035   }
2036
2037   draw_tap_listeners(TRUE);
2038   funnel_dump_all_text_windows();
2039   epan_cleanup();
2040
2041   output_fields_free(output_fields);
2042   output_fields = NULL;
2043
2044   return exit_status;
2045 }
2046
2047 /*#define USE_BROKEN_G_MAIN_LOOP*/
2048
2049 #ifdef USE_BROKEN_G_MAIN_LOOP
2050   GMainLoop *loop;
2051 #else
2052   gboolean loop_running = FALSE;
2053 #endif
2054   guint32 packet_count = 0;
2055
2056
2057 /* XXX - move to the right position / file */
2058 /* read from a pipe (callback) */
2059 typedef gboolean (*pipe_input_cb_t) (gint source, gpointer user_data);
2060
2061 typedef struct pipe_input_tag {
2062   gint             source;
2063   gpointer         user_data;
2064   int             *child_process;
2065   pipe_input_cb_t  input_cb;
2066   guint            pipe_input_id;
2067 #ifdef _WIN32
2068   GMutex          *callback_running;
2069 #endif
2070 } pipe_input_t;
2071
2072 static pipe_input_t pipe_input;
2073
2074 #ifdef _WIN32
2075 /* The timer has expired, see if there's stuff to read from the pipe,
2076    if so, do the callback */
2077 static gint
2078 pipe_timer_cb(gpointer data)
2079 {
2080   HANDLE        handle;
2081   DWORD         avail        = 0;
2082   gboolean      result;
2083   DWORD         childstatus;
2084   pipe_input_t *pipe_input_p = data;
2085   gint          iterations   = 0;
2086
2087   g_mutex_lock (pipe_input_p->callback_running);
2088
2089   /* try to read data from the pipe only 5 times, to avoid blocking */
2090   while(iterations < 5) {
2091     /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: new iteration");*/
2092
2093     /* Oddly enough although Named pipes don't work on win9x,
2094        PeekNamedPipe does !!! */
2095     handle = (HANDLE) _get_osfhandle (pipe_input_p->source);
2096     result = PeekNamedPipe(handle, NULL, 0, NULL, &avail, NULL);
2097
2098     /* Get the child process exit status */
2099     GetExitCodeProcess((HANDLE)*(pipe_input_p->child_process),
2100                        &childstatus);
2101
2102     /* If the Peek returned an error, or there are bytes to be read
2103        or the childwatcher thread has terminated then call the normal
2104        callback */
2105     if (!result || avail > 0 || childstatus != STILL_ACTIVE) {
2106
2107       /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: data avail");*/
2108
2109       /* And call the real handler */
2110       if (!pipe_input_p->input_cb(pipe_input_p->source, pipe_input_p->user_data)) {
2111         g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: input pipe closed, iterations: %u", iterations);
2112         /* pipe closed, return false so that the timer is stopped */
2113         g_mutex_unlock (pipe_input_p->callback_running);
2114         return FALSE;
2115       }
2116     }
2117     else {
2118       /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: no data avail");*/
2119       /* No data, stop now */
2120       break;
2121     }
2122
2123     iterations++;
2124   }
2125
2126   /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: finished with iterations: %u, new timer", iterations);*/
2127
2128   g_mutex_unlock (pipe_input_p->callback_running);
2129
2130   /* we didn't stopped the timer, so let it run */
2131   return TRUE;
2132 }
2133 #endif
2134
2135
2136 void
2137 pipe_input_set_handler(gint source, gpointer user_data, int *child_process, pipe_input_cb_t input_cb)
2138 {
2139
2140   pipe_input.source         = source;
2141   pipe_input.child_process  = child_process;
2142   pipe_input.user_data      = user_data;
2143   pipe_input.input_cb       = input_cb;
2144
2145 #ifdef _WIN32
2146 #if GLIB_CHECK_VERSION(2,31,0)
2147   pipe_input.callback_running = g_malloc(sizeof(GMutex));
2148   g_mutex_init(pipe_input.callback_running);
2149 #else
2150   pipe_input.callback_running = g_mutex_new();
2151 #endif
2152   /* Tricky to use pipes in win9x, as no concept of wait.  NT can
2153      do this but that doesn't cover all win32 platforms.  GTK can do
2154      this but doesn't seem to work over processes.  Attempt to do
2155      something similar here, start a timer and check for data on every
2156      timeout. */
2157   /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_input_set_handler: new");*/
2158   pipe_input.pipe_input_id = g_timeout_add(200, pipe_timer_cb, &pipe_input);
2159 #endif
2160 }
2161
2162 const nstime_t *
2163 tshark_get_frame_ts(void *data, guint32 frame_num)
2164 {
2165   capture_file *cf = (capture_file *) data;
2166
2167   if (ref && ref->num == frame_num)
2168     return &ref->abs_ts;
2169
2170   if (prev_dis && prev_dis->num == frame_num)
2171     return &prev_dis->abs_ts;
2172
2173   if (prev_cap && prev_cap->num == frame_num)
2174     return &prev_cap->abs_ts;
2175
2176   if (cf->frames) {
2177      frame_data *fd = frame_data_sequence_find(cf->frames, frame_num);
2178
2179      return (fd) ? &fd->abs_ts : NULL;
2180   }
2181
2182   return NULL;
2183 }
2184
2185 epan_t *
2186 tshark_epan_new(capture_file *cf)
2187 {
2188   epan_t *epan = epan_new();
2189
2190   epan->data = cf;
2191   epan->get_frame_ts = tshark_get_frame_ts;
2192
2193   return epan;
2194 }
2195
2196 #ifdef HAVE_LIBPCAP
2197 static gboolean
2198 capture(void)
2199 {
2200   gboolean          ret;
2201   guint             i;
2202   GString          *str = g_string_new("");
2203 #ifdef USE_TSHARK_SELECT
2204   fd_set            readfds;
2205 #endif
2206 #ifndef _WIN32
2207   struct sigaction  action, oldaction;
2208 #endif
2209
2210   /*
2211    * XXX - dropping privileges is still required, until code cleanup is done
2212    *
2213    * remove all dependencies to pcap specific code and using only dumpcap is almost done.
2214    * when it's done, we don't need special privileges to run tshark at all,
2215    * therefore we don't need to drop these privileges
2216    * The only thing we might want to keep is a warning if tshark is run as root,
2217    * as it's no longer necessary and potentially dangerous.
2218    *
2219    * THE FOLLOWING IS THE FORMER COMMENT WHICH IS NO LONGER REALLY VALID:
2220    * We've opened the capture device, so we shouldn't need any special
2221    * privileges any more; relinquish those privileges.
2222    *
2223    * XXX - if we have saved set-user-ID support, we should give up those
2224    * privileges immediately, and then reclaim them long enough to get
2225    * a list of network interfaces and to open one, and then give them
2226    * up again, so that stuff we do while processing the argument list,
2227    * reading the user's preferences, loading and starting plugins
2228    * (especially *user* plugins), etc. is done with the user's privileges,
2229    * not special privileges.
2230    */
2231   relinquish_special_privs_perm();
2232   print_current_user();
2233
2234   /* Create new dissection section. */
2235   epan_free(cfile.epan);
2236   cfile.epan = tshark_epan_new(&cfile);
2237
2238 #ifdef _WIN32
2239   /* Catch a CTRL+C event and, if we get it, clean up and exit. */
2240   SetConsoleCtrlHandler(capture_cleanup, TRUE);
2241 #else /* _WIN32 */
2242   /* Catch SIGINT and SIGTERM and, if we get either of them,
2243      clean up and exit.  If SIGHUP isn't being ignored, catch
2244      it too and, if we get it, clean up and exit.
2245
2246      We restart any read that was in progress, so that it doesn't
2247      disrupt reading from the sync pipe.  The signal handler tells
2248      the capture child to finish; it will report that it finished,
2249      or will exit abnormally, so  we'll stop reading from the sync
2250      pipe, pick up the exit status, and quit. */
2251   memset(&action, 0, sizeof(action));
2252   action.sa_handler = capture_cleanup;
2253   action.sa_flags = SA_RESTART;
2254   sigemptyset(&action.sa_mask);
2255   sigaction(SIGTERM, &action, NULL);
2256   sigaction(SIGINT, &action, NULL);
2257   sigaction(SIGHUP, NULL, &oldaction);
2258   if (oldaction.sa_handler == SIG_DFL)
2259     sigaction(SIGHUP, &action, NULL);
2260
2261 #ifdef SIGINFO
2262   /* Catch SIGINFO and, if we get it and we're capturing to a file in
2263      quiet mode, report the number of packets we've captured.
2264
2265      Again, restart any read that was in progress, so that it doesn't
2266      disrupt reading from the sync pipe. */
2267   action.sa_handler = report_counts_siginfo;
2268   action.sa_flags = SA_RESTART;
2269   sigemptyset(&action.sa_mask);
2270   sigaction(SIGINFO, &action, NULL);
2271 #endif /* SIGINFO */
2272 #endif /* _WIN32 */
2273
2274   global_capture_session.state = CAPTURE_PREPARING;
2275
2276   /* Let the user know which interfaces were chosen. */
2277   for (i = 0; i < global_capture_opts.ifaces->len; i++) {
2278     interface_options interface_opts;
2279
2280     interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
2281     interface_opts.descr = get_interface_descriptive_name(interface_opts.name);
2282     global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, i);
2283     g_array_insert_val(global_capture_opts.ifaces, i, interface_opts);
2284   }
2285 #ifdef _WIN32
2286   if (global_capture_opts.ifaces->len < 2) {
2287 #else
2288   if (global_capture_opts.ifaces->len < 4) {
2289 #endif
2290     for (i = 0; i < global_capture_opts.ifaces->len; i++) {
2291       interface_options interface_opts;
2292
2293       interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
2294       if (i > 0) {
2295           if (global_capture_opts.ifaces->len > 2) {
2296               g_string_append_printf(str, ",");
2297           }
2298           g_string_append_printf(str, " ");
2299           if (i == global_capture_opts.ifaces->len - 1) {
2300               g_string_append_printf(str, "and ");
2301           }
2302       }
2303       g_string_append_printf(str, "'%s'", interface_opts.descr);
2304     }
2305   } else {
2306     g_string_append_printf(str, "%u interfaces", global_capture_opts.ifaces->len);
2307   }
2308   if (really_quiet == FALSE)
2309     fprintf(stderr, "Capturing on %s\n", str->str);
2310   fflush(stderr);
2311   g_string_free(str, TRUE);
2312
2313   ret = sync_pipe_start(&global_capture_opts, &global_capture_session, NULL);
2314
2315   if (!ret)
2316     return FALSE;
2317
2318   /* the actual capture loop
2319    *
2320    * XXX - glib doesn't seem to provide any event based loop handling.
2321    *
2322    * XXX - for whatever reason,
2323    * calling g_main_loop_new() ends up in 100% cpu load.
2324    *
2325    * But that doesn't matter: in UNIX we can use select() to find an input
2326    * source with something to do.
2327    *
2328    * But that doesn't matter because we're in a CLI (that doesn't need to
2329    * update a GUI or something at the same time) so it's OK if we block
2330    * trying to read from the pipe.
2331    *
2332    * So all the stuff in USE_TSHARK_SELECT could be removed unless I'm
2333    * wrong (but I leave it there in case I am...).
2334    */
2335
2336 #ifdef USE_TSHARK_SELECT
2337   FD_ZERO(&readfds);
2338   FD_SET(pipe_input.source, &readfds);
2339 #endif
2340
2341   loop_running = TRUE;
2342
2343   TRY
2344   {
2345     while (loop_running)
2346     {
2347 #ifdef USE_TSHARK_SELECT
2348       ret = select(pipe_input.source+1, &readfds, NULL, NULL, NULL);
2349
2350       if (ret == -1)
2351       {
2352         perror("select()");
2353         return TRUE;
2354       } else if (ret == 1) {
2355 #endif
2356         /* Call the real handler */
2357         if (!pipe_input.input_cb(pipe_input.source, pipe_input.user_data)) {
2358           g_log(NULL, G_LOG_LEVEL_DEBUG, "input pipe closed");
2359           return FALSE;
2360         }
2361 #ifdef USE_TSHARK_SELECT
2362       }
2363 #endif
2364     }
2365   }
2366   CATCH(OutOfMemoryError) {
2367     fprintf(stderr,
2368             "Out Of Memory!\n"
2369             "\n"
2370             "Sorry, but TShark has to terminate now!\n"
2371             "\n"
2372             "Some infos / workarounds can be found at:\n"
2373             "http://wiki.wireshark.org/KnownBugs/OutOfMemory\n");
2374     exit(1);
2375   }
2376   ENDTRY;
2377   return TRUE;
2378 }
2379
2380 /* capture child detected an error */
2381 void
2382 capture_input_error_message(capture_session *cap_session _U_, char *error_msg, char *secondary_error_msg)
2383 {
2384   cmdarg_err("%s", error_msg);
2385   cmdarg_err_cont("%s", secondary_error_msg);
2386 }
2387
2388
2389 /* capture child detected an capture filter related error */
2390 void
2391 capture_input_cfilter_error_message(capture_session *cap_session, guint i, char *error_message)
2392 {
2393   capture_options *capture_opts = cap_session->capture_opts;
2394   dfilter_t         *rfcode = NULL;
2395   interface_options  interface_opts;
2396
2397   g_assert(i < capture_opts->ifaces->len);
2398   interface_opts = g_array_index(capture_opts->ifaces, interface_options, i);
2399
2400   if (dfilter_compile(interface_opts.cfilter, &rfcode) && rfcode != NULL) {
2401     cmdarg_err(
2402       "Invalid capture filter \"%s\" for interface %s!\n"
2403       "\n"
2404       "That string looks like a valid display filter; however, it isn't a valid\n"
2405       "capture filter (%s).\n"
2406       "\n"
2407       "Note that display filters and capture filters don't have the same syntax,\n"
2408       "so you can't use most display filter expressions as capture filters.\n"
2409       "\n"
2410       "See the User's Guide for a description of the capture filter syntax.",
2411       interface_opts.cfilter, interface_opts.descr, error_message);
2412     dfilter_free(rfcode);
2413   } else {
2414     cmdarg_err(
2415       "Invalid capture filter \"%s\" for interface %s!\n"
2416       "\n"
2417       "That string isn't a valid capture filter (%s).\n"
2418       "See the User's Guide for a description of the capture filter syntax.",
2419       interface_opts.cfilter, interface_opts.descr, error_message);
2420   }
2421 }
2422
2423
2424 /* capture child tells us we have a new (or the first) capture file */
2425 gboolean
2426 capture_input_new_file(capture_session *cap_session, gchar *new_file)
2427 {
2428   capture_options *capture_opts = cap_session->capture_opts;
2429   gboolean is_tempfile;
2430   int      err;
2431
2432   if (cap_session->state == CAPTURE_PREPARING) {
2433     g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "Capture started!");
2434   }
2435   g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "File: \"%s\"", new_file);
2436
2437   g_assert(cap_session->state == CAPTURE_PREPARING || cap_session->state == CAPTURE_RUNNING);
2438
2439   /* free the old filename */
2440   if (capture_opts->save_file != NULL) {
2441
2442     /* we start a new capture file, close the old one (if we had one before) */
2443     if ( ((capture_file *) cap_session->cf)->state != FILE_CLOSED) {
2444       if ( ((capture_file *) cap_session->cf)->wth != NULL) {
2445         wtap_close(((capture_file *) cap_session->cf)->wth);
2446       }
2447       ((capture_file *) cap_session->cf)->state = FILE_CLOSED;
2448     }
2449
2450     g_free(capture_opts->save_file);
2451     is_tempfile = FALSE;
2452   } else {
2453     /* we didn't had a save_file before, must be a tempfile */
2454     is_tempfile = TRUE;
2455   }
2456
2457   /* save the new filename */
2458   capture_opts->save_file = g_strdup(new_file);
2459
2460   /* if we are in real-time mode, open the new file now */
2461   if (do_dissection) {
2462     /* Attempt to open the capture file and set up to read from it. */
2463     switch(cf_open((capture_file *)cap_session->cf, capture_opts->save_file, is_tempfile, &err)) {
2464     case CF_OK:
2465       break;
2466     case CF_ERROR:
2467       /* Don't unlink (delete) the save file - leave it around,
2468          for debugging purposes. */
2469       g_free(capture_opts->save_file);
2470       capture_opts->save_file = NULL;
2471       return FALSE;
2472     }
2473   }
2474
2475   cap_session->state = CAPTURE_RUNNING;
2476
2477   return TRUE;
2478 }
2479
2480
2481 /* capture child tells us we have new packets to read */
2482 void
2483 capture_input_new_packets(capture_session *cap_session, int to_read)
2484 {
2485   gboolean      ret;
2486   int           err;
2487   gchar        *err_info;
2488   gint64        data_offset;
2489   capture_file *cf = (capture_file *)cap_session->cf;
2490   gboolean      filtering_tap_listeners;
2491   guint         tap_flags;
2492
2493 #ifdef SIGINFO
2494   /*
2495    * Prevent a SIGINFO handler from writing to the standard error while
2496    * we're doing so or writing to the standard output; instead, have it
2497    * just set a flag telling us to print that information when we're done.
2498    */
2499   infodelay = TRUE;
2500 #endif /* SIGINFO */
2501
2502   /* Do we have any tap listeners with filters? */
2503   filtering_tap_listeners = have_filtering_tap_listeners();
2504
2505   /* Get the union of the flags for all tap listeners. */
2506   tap_flags = union_of_tap_listener_flags();
2507
2508   if (do_dissection) {
2509     while (to_read-- && cf->wth) {
2510       wtap_cleareof(cf->wth);
2511       ret = wtap_read(cf->wth, &err, &err_info, &data_offset);
2512       if (ret == FALSE) {
2513         /* read from file failed, tell the capture child to stop */
2514         sync_pipe_stop(cap_session);
2515         wtap_close(cf->wth);
2516         cf->wth = NULL;
2517       } else {
2518         ret = process_packet(cf, data_offset, wtap_phdr(cf->wth),
2519                              wtap_buf_ptr(cf->wth),
2520                              filtering_tap_listeners, tap_flags);
2521       }
2522       if (ret != FALSE) {
2523         /* packet successfully read and gone through the "Read Filter" */
2524         packet_count++;
2525       }
2526     }
2527   } else {
2528     /*
2529      * Dumpcap's doing all the work; we're not doing any dissection.
2530      * Count all the packets it wrote.
2531      */
2532     packet_count += to_read;
2533   }
2534
2535   if (print_packet_counts) {
2536       /* We're printing packet counts. */
2537       if (packet_count != 0) {
2538         fprintf(stderr, "\r%u ", packet_count);
2539         /* stderr could be line buffered */
2540         fflush(stderr);
2541       }
2542   }
2543
2544 #ifdef SIGINFO
2545   /*
2546    * Allow SIGINFO handlers to write.
2547    */
2548   infodelay = FALSE;
2549
2550   /*
2551    * If a SIGINFO handler asked us to write out capture counts, do so.
2552    */
2553   if (infoprint)
2554     report_counts();
2555 #endif /* SIGINFO */
2556 }
2557
2558 static void
2559 report_counts(void)
2560 {
2561   if ((print_packet_counts == FALSE) && (really_quiet == FALSE)) {
2562     /* Report the count only if we aren't printing a packet count
2563        as packets arrive. */
2564       fprintf(stderr, "%u packet%s captured\n", packet_count,
2565             plurality(packet_count, "", "s"));
2566   }
2567 #ifdef SIGINFO
2568   infoprint = FALSE; /* we just reported it */
2569 #endif /* SIGINFO */
2570 }
2571
2572 #ifdef SIGINFO
2573 static void
2574 report_counts_siginfo(int signum _U_)
2575 {
2576   int sav_errno = errno;
2577   /* If we've been told to delay printing, just set a flag asking
2578      that we print counts (if we're supposed to), otherwise print
2579      the count of packets captured (if we're supposed to). */
2580   if (infodelay)
2581     infoprint = TRUE;
2582   else
2583     report_counts();
2584   errno = sav_errno;
2585 }
2586 #endif /* SIGINFO */
2587
2588
2589 /* capture child detected any packet drops? */
2590 void
2591 capture_input_drops(capture_session *cap_session _U_, guint32 dropped)
2592 {
2593   if (print_packet_counts) {
2594     /* We're printing packet counts to stderr.
2595        Send a newline so that we move to the line after the packet count. */
2596     fprintf(stderr, "\n");
2597   }
2598
2599   if (dropped != 0) {
2600     /* We're printing packet counts to stderr.
2601        Send a newline so that we move to the line after the packet count. */
2602     fprintf(stderr, "%u packet%s dropped\n", dropped, plurality(dropped, "", "s"));
2603   }
2604 }
2605
2606
2607 /*
2608  * Capture child closed its side of the pipe, report any error and
2609  * do the required cleanup.
2610  */
2611 void
2612 capture_input_closed(capture_session *cap_session, gchar *msg)
2613 {
2614   capture_file *cf = (capture_file *) cap_session->cf;
2615
2616   if (msg != NULL)
2617     fprintf(stderr, "tshark: %s\n", msg);
2618
2619   report_counts();
2620
2621   if (cf != NULL && cf->wth != NULL) {
2622     wtap_close(cf->wth);
2623     if (cf->is_tempfile) {
2624       ws_unlink(cf->filename);
2625     }
2626   }
2627 #ifdef USE_BROKEN_G_MAIN_LOOP
2628   /*g_main_loop_quit(loop);*/
2629   g_main_quit(loop);
2630 #else
2631   loop_running = FALSE;
2632 #endif
2633 }
2634
2635
2636
2637
2638 #ifdef _WIN32
2639 static BOOL WINAPI
2640 capture_cleanup(DWORD ctrltype _U_)
2641 {
2642   /* CTRL_C_EVENT is sort of like SIGINT, CTRL_BREAK_EVENT is unique to
2643      Windows, CTRL_CLOSE_EVENT is sort of like SIGHUP, CTRL_LOGOFF_EVENT
2644      is also sort of like SIGHUP, and CTRL_SHUTDOWN_EVENT is sort of
2645      like SIGTERM at least when the machine's shutting down.
2646
2647      For now, we handle them all as indications that we should clean up
2648      and quit, just as we handle SIGINT, SIGHUP, and SIGTERM in that
2649      way on UNIX.
2650
2651      We must return TRUE so that no other handler - such as one that would
2652      terminate the process - gets called.
2653
2654      XXX - for some reason, typing ^C to TShark, if you run this in
2655      a Cygwin console window in at least some versions of Cygwin,
2656      causes TShark to terminate immediately; this routine gets
2657      called, but the main loop doesn't get a chance to run and
2658      exit cleanly, at least if this is compiled with Microsoft Visual
2659      C++ (i.e., it's a property of the Cygwin console window or Bash;
2660      it happens if TShark is not built with Cygwin - for all I know,
2661      building it with Cygwin may make the problem go away). */
2662
2663   /* tell the capture child to stop */
2664   sync_pipe_stop(&global_capture_session);
2665
2666   /* don't stop our own loop already here, otherwise status messages and
2667    * cleanup wouldn't be done properly. The child will indicate the stop of
2668    * everything by calling capture_input_closed() later */
2669
2670   return TRUE;
2671 }
2672 #else
2673 static void
2674 capture_cleanup(int signum _U_)
2675 {
2676   /* tell the capture child to stop */
2677   sync_pipe_stop(&global_capture_session);
2678
2679   /* don't stop our own loop already here, otherwise status messages and
2680    * cleanup wouldn't be done properly. The child will indicate the stop of
2681    * everything by calling capture_input_closed() later */
2682 }
2683 #endif /* _WIN32 */
2684 #endif /* HAVE_LIBPCAP */
2685
2686 static gboolean
2687 process_packet_first_pass(capture_file *cf,
2688                gint64 offset, struct wtap_pkthdr *whdr,
2689                const guchar *pd)
2690 {
2691   frame_data     fdlocal;
2692   guint32        framenum;
2693   gboolean       create_proto_tree = FALSE;
2694   epan_dissect_t edt;
2695   gboolean       passed;
2696
2697   /* The frame number of this packet is one more than the count of
2698      frames in this packet. */
2699   framenum = cf->count + 1;
2700
2701   /* If we're not running a display filter and we're not printing any
2702      packet information, we don't need to do a dissection. This means
2703      that all packets can be marked as 'passed'. */
2704   passed = TRUE;
2705
2706   frame_data_init(&fdlocal, framenum, whdr, offset, cum_bytes);
2707
2708   /* If we're going to print packet information, or we're going to
2709      run a read filter, or display filter, or we're going to process taps, set up to
2710      do a dissection and do so. */
2711   if (do_dissection) {
2712     if (gbl_resolv_flags.mac_name || gbl_resolv_flags.network_name ||
2713         gbl_resolv_flags.transport_name || gbl_resolv_flags.concurrent_dns)
2714       /* Grab any resolved addresses */
2715       host_name_lookup_process();
2716
2717     /* If we're going to be applying a filter, we'll need to
2718        create a protocol tree against which to apply the filter. */
2719     if (cf->rfcode)
2720       create_proto_tree = TRUE;
2721
2722     /* We're not going to display the protocol tree on this pass,
2723        so it's not going to be "visible". */
2724     epan_dissect_init(&edt, cf->epan, create_proto_tree, FALSE);
2725
2726     /* If we're running a read filter, prime the epan_dissect_t with that
2727        filter. */
2728     if (cf->rfcode)
2729       epan_dissect_prime_dfilter(&edt, cf->rfcode);
2730
2731     frame_data_set_before_dissect(&fdlocal, &cf->elapsed_time,
2732                                   &ref, prev_dis);
2733     if (ref == &fdlocal) {
2734       ref_frame = fdlocal;
2735       ref = &ref_frame;
2736     }
2737
2738     epan_dissect_run(&edt, whdr, frame_tvbuff_new(&fdlocal, pd), &fdlocal, NULL);
2739
2740     /* Run the read filter if we have one. */
2741     if (cf->rfcode)
2742       passed = dfilter_apply_edt(cf->rfcode, &edt);
2743   }
2744
2745   if (passed) {
2746     frame_data_set_after_dissect(&fdlocal, &cum_bytes);
2747     prev_cap = prev_dis = frame_data_sequence_add(cf->frames, &fdlocal);
2748
2749     /* If we're not doing dissection then there won't be any dependent frames.
2750      * More importantly, edt.pi.dependent_frames won't be initialized because
2751      * epan hasn't been initialized.
2752      */
2753     if (do_dissection) {
2754       g_slist_foreach(edt.pi.dependent_frames, find_and_mark_frame_depended_upon, cf->frames);
2755     }
2756
2757     cf->count++;
2758   } else {
2759     /* if we don't add it to the frame_data_sequence, clean it up right now
2760      * to avoid leaks */
2761     frame_data_destroy(&fdlocal);
2762   }
2763
2764   if (do_dissection)
2765     epan_dissect_cleanup(&edt);
2766
2767   return passed;
2768 }
2769
2770 static gboolean
2771 process_packet_second_pass(capture_file *cf, frame_data *fdata,
2772                struct wtap_pkthdr *phdr, Buffer *buf,
2773                gboolean filtering_tap_listeners, guint tap_flags)
2774 {
2775   gboolean        create_proto_tree;
2776   column_info    *cinfo;
2777   epan_dissect_t  edt;
2778   gboolean        passed;
2779
2780   /* If we're not running a display filter and we're not printing any
2781      packet information, we don't need to do a dissection. This means
2782      that all packets can be marked as 'passed'. */
2783   passed = TRUE;
2784
2785   /* If we're going to print packet information, or we're going to
2786      run a read filter, or we're going to process taps, set up to
2787      do a dissection and do so. */
2788   if (do_dissection) {
2789     if (gbl_resolv_flags.mac_name || gbl_resolv_flags.network_name ||
2790         gbl_resolv_flags.transport_name || gbl_resolv_flags.concurrent_dns)
2791       /* Grab any resolved addresses */
2792       host_name_lookup_process();
2793
2794     if (cf->dfcode || print_details || filtering_tap_listeners ||
2795         (tap_flags & TL_REQUIRES_PROTO_TREE) || have_custom_cols(&cf->cinfo))
2796       create_proto_tree = TRUE;
2797     else
2798       create_proto_tree = FALSE;
2799
2800     /* The protocol tree will be "visible", i.e., printed, only if we're
2801        printing packet details, which is true if we're printing stuff
2802        ("print_packet_info" is true) and we're in verbose mode
2803        ("packet_details" is true). */
2804     epan_dissect_init(&edt, cf->epan, create_proto_tree, print_packet_info && print_details);
2805
2806     /* If we're running a display filter, prime the epan_dissect_t with that
2807        filter. */
2808     if (cf->dfcode)
2809       epan_dissect_prime_dfilter(&edt, cf->dfcode);
2810
2811     col_custom_prime_edt(&edt, &cf->cinfo);
2812
2813     /* We only need the columns if either
2814          1) some tap needs the columns
2815        or
2816          2) we're printing packet info but we're *not* verbose; in verbose
2817             mode, we print the protocol tree, not the protocol summary.
2818      */
2819     if ((tap_flags & TL_REQUIRES_COLUMNS) || (print_packet_info && print_summary))
2820       cinfo = &cf->cinfo;
2821     else
2822       cinfo = NULL;
2823
2824     frame_data_set_before_dissect(fdata, &cf->elapsed_time,
2825                                   &ref, prev_dis);
2826     if (ref == fdata) {
2827       ref_frame = *fdata;
2828       ref = &ref_frame;
2829     }
2830
2831     epan_dissect_run_with_taps(&edt, phdr, frame_tvbuff_new_buffer(fdata, buf), fdata, cinfo);
2832
2833     /* Run the read/display filter if we have one. */
2834     if (cf->dfcode)
2835       passed = dfilter_apply_edt(cf->dfcode, &edt);
2836   }
2837
2838   if (passed) {
2839     frame_data_set_after_dissect(fdata, &cum_bytes);
2840     /* Process this packet. */
2841     if (print_packet_info) {
2842       /* We're printing packet information; print the information for
2843          this packet. */
2844       if (do_dissection)
2845         print_packet(cf, &edt);
2846       else
2847         print_packet(cf, NULL);
2848
2849       /* The ANSI C standard does not appear to *require* that a line-buffered
2850          stream be flushed to the host environment whenever a newline is
2851          written, it just says that, on such a stream, characters "are
2852          intended to be transmitted to or from the host environment as a
2853          block when a new-line character is encountered".
2854
2855          The Visual C++ 6.0 C implementation doesn't do what is intended;
2856          even if you set a stream to be line-buffered, it still doesn't
2857          flush the buffer at the end of every line.
2858
2859          So, if the "-l" flag was specified, we flush the standard output
2860          at the end of a packet.  This will do the right thing if we're
2861          printing packet summary lines, and, as we print the entire protocol
2862          tree for a single packet without waiting for anything to happen,
2863          it should be as good as line-buffered mode if we're printing
2864          protocol trees.  (The whole reason for the "-l" flag in either
2865          tcpdump or TShark is to allow the output of a live capture to
2866          be piped to a program or script and to have that script see the
2867          information for the packet as soon as it's printed, rather than
2868          having to wait until a standard I/O buffer fills up. */
2869       if (line_buffered)
2870         fflush(stdout);
2871
2872       if (ferror(stdout)) {
2873         show_print_file_io_error(errno);
2874         exit(2);
2875       }
2876     }
2877     prev_dis = fdata;
2878   }
2879   prev_cap = fdata;
2880
2881   if (do_dissection) {
2882     epan_dissect_cleanup(&edt);
2883   }
2884   return passed || fdata->flags.dependent_of_displayed;
2885 }
2886
2887 static int
2888 load_cap_file(capture_file *cf, char *save_file, int out_file_type,
2889     gboolean out_file_name_res, int max_packet_count, gint64 max_byte_count)
2890 {
2891   gint         linktype;
2892   int          snapshot_length;
2893   wtap_dumper *pdh;
2894   guint32      framenum;
2895   int          err;
2896   gchar       *err_info = NULL;
2897   gint64       data_offset;
2898   char        *save_file_string = NULL;
2899   gboolean     filtering_tap_listeners;
2900   guint        tap_flags;
2901   wtapng_section_t            *shb_hdr;
2902   wtapng_iface_descriptions_t *idb_inf;
2903   char         appname[100];
2904   Buffer       buf;
2905
2906   shb_hdr = wtap_file_get_shb_info(cf->wth);
2907   idb_inf = wtap_file_get_idb_info(cf->wth);
2908 #ifdef PCAP_NG_DEFAULT
2909   if (idb_inf->number_of_interfaces > 1) {
2910     linktype = WTAP_ENCAP_PER_PACKET;
2911   } else {
2912     linktype = wtap_file_encap(cf->wth);
2913   }
2914 #else
2915   linktype = wtap_file_encap(cf->wth);
2916 #endif
2917   if (save_file != NULL) {
2918     /* Get a string that describes what we're writing to */
2919     save_file_string = output_file_description(save_file);
2920
2921     /* Set up to write to the capture file. */
2922     snapshot_length = wtap_snapshot_length(cf->wth);
2923     if (snapshot_length == 0) {
2924       /* Snapshot length of input file not known. */
2925       snapshot_length = WTAP_MAX_PACKET_SIZE;
2926     }
2927     /* If we don't have an application name add Tshark */
2928     if (shb_hdr->shb_user_appl == NULL) {
2929         g_snprintf(appname, sizeof(appname), "TShark " VERSION "%s", wireshark_svnversion);
2930         shb_hdr->shb_user_appl = appname;
2931     }
2932
2933     if (linktype != WTAP_ENCAP_PER_PACKET && out_file_type == WTAP_FILE_PCAP)
2934         pdh = wtap_dump_open(save_file, out_file_type, linktype,
2935             snapshot_length, FALSE /* compressed */, &err);
2936     else
2937         pdh = wtap_dump_open_ng(save_file, out_file_type, linktype,
2938             snapshot_length, FALSE /* compressed */, shb_hdr, idb_inf, &err);
2939
2940     g_free(idb_inf);
2941     idb_inf = NULL;
2942
2943     if (pdh == NULL) {
2944       /* We couldn't set up to write to the capture file. */
2945       switch (err) {
2946
2947       case WTAP_ERR_UNSUPPORTED_FILE_TYPE:
2948         cmdarg_err("Capture files can't be written in that format.");
2949         break;
2950
2951       case WTAP_ERR_UNSUPPORTED_ENCAP:
2952       case WTAP_ERR_ENCAP_PER_PACKET_UNSUPPORTED:
2953         cmdarg_err("The capture file being read can't be written as a "
2954           "\"%s\" file.", wtap_file_type_short_string(out_file_type));
2955         break;
2956
2957       case WTAP_ERR_CANT_OPEN:
2958         cmdarg_err("The %s couldn't be created for some "
2959           "unknown reason.", save_file_string);
2960         break;
2961
2962       case WTAP_ERR_SHORT_WRITE:
2963         cmdarg_err("A full header couldn't be written to the %s.",
2964                    save_file_string);
2965         break;
2966
2967       default:
2968         cmdarg_err("The %s could not be created: %s.", save_file_string,
2969                    wtap_strerror(err));
2970         break;
2971       }
2972       goto out;
2973     }
2974   } else {
2975     if (print_packet_info) {
2976       if (!write_preamble(cf)) {
2977         err = errno;
2978         show_print_file_io_error(err);
2979         goto out;
2980       }
2981     }
2982     pdh = NULL;
2983   }
2984
2985   if (pdh && out_file_name_res) {
2986     if (!wtap_dump_set_addrinfo_list(pdh, get_addrinfo_list())) {
2987       cmdarg_err("The file format \"%s\" doesn't support name resolution information.",
2988                  wtap_file_type_short_string(out_file_type));
2989     }
2990   }
2991
2992   /* Do we have any tap listeners with filters? */
2993   filtering_tap_listeners = have_filtering_tap_listeners();
2994
2995   /* Get the union of the flags for all tap listeners. */
2996   tap_flags = union_of_tap_listener_flags();
2997
2998   if (perform_two_pass_analysis) {
2999     frame_data *fdata;
3000     int old_max_packet_count = max_packet_count;
3001
3002     /* Allocate a frame_data_sequence for all the frames. */
3003     cf->frames = new_frame_data_sequence();
3004
3005     while (wtap_read(cf->wth, &err, &err_info, &data_offset)) {
3006       if (process_packet_first_pass(cf, data_offset, wtap_phdr(cf->wth),
3007                          wtap_buf_ptr(cf->wth))) {
3008         /* Stop reading if we have the maximum number of packets;
3009          * When the -c option has not been used, max_packet_count
3010          * starts at 0, which practically means, never stop reading.
3011          * (unless we roll over max_packet_count ?)
3012          */
3013         if ( (--max_packet_count == 0) || (max_byte_count != 0 && data_offset >= max_byte_count)) {
3014           err = 0; /* This is not an error */
3015           break;
3016         }
3017       }
3018     }
3019
3020     /* Close the sequential I/O side, to free up memory it requires. */
3021     wtap_sequential_close(cf->wth);
3022
3023     /* Allow the protocol dissectors to free up memory that they
3024      * don't need after the sequential run-through of the packets. */
3025     postseq_cleanup_all_protocols();
3026
3027     max_packet_count = old_max_packet_count;
3028
3029     prev_dis = NULL;
3030     prev_cap = NULL;
3031     buffer_init(&buf, 1500);
3032     for (framenum = 1; err == 0 && framenum <= cf->count; framenum++) {
3033       fdata = frame_data_sequence_find(cf->frames, framenum);
3034       if (wtap_seek_read(cf->wth, fdata->file_off, &cf->phdr,
3035           &buf, fdata->cap_len, &err, &err_info)) {
3036         if (process_packet_second_pass(cf, fdata, &cf->phdr, &buf,
3037                                        filtering_tap_listeners, tap_flags)) {
3038           /* Either there's no read filtering or this packet passed the
3039              filter, so, if we're writing to a capture file, write
3040              this packet out. */
3041           if (pdh != NULL) {
3042             if (!wtap_dump(pdh, &cf->phdr, buffer_start_ptr(&cf->buf), &err)) {
3043               /* Error writing to a capture file */
3044               switch (err) {
3045
3046               case WTAP_ERR_UNSUPPORTED_ENCAP:
3047                 /*
3048                  * This is a problem with the particular frame we're writing;
3049                  * note that, and give the frame number.
3050                  *
3051                  * XXX - framenum is not necessarily the frame number in
3052                  * the input file if there was a read filter.
3053                  */
3054                 fprintf(stderr,
3055                         "Frame %u of \"%s\" has a network type that can't be saved in a \"%s\" file.\n",
3056                         framenum, cf->filename,
3057                         wtap_file_type_short_string(out_file_type));
3058                 break;
3059
3060               default:
3061                 show_capture_file_io_error(save_file, err, FALSE);
3062                 break;
3063               }
3064               wtap_dump_close(pdh, &err);
3065               g_free(shb_hdr);
3066               exit(2);
3067             }
3068           }
3069           /* Stop reading if we have the maximum number of packets;
3070            * When the -c option has not been used, max_packet_count
3071            * starts at 0, which practically means, never stop reading.
3072            * (unless we roll over max_packet_count ?)
3073            */
3074           if ( (--max_packet_count == 0) || (max_byte_count != 0 && data_offset >= max_byte_count)) {
3075             err = 0; /* This is not an error */
3076             break;
3077           }
3078         }
3079       }
3080     }
3081     buffer_free(&buf);
3082   }
3083   else {
3084     framenum = 0;
3085     while (wtap_read(cf->wth, &err, &err_info, &data_offset)) {
3086       framenum++;
3087
3088       if (process_packet(cf, data_offset, wtap_phdr(cf->wth),
3089                          wtap_buf_ptr(cf->wth),
3090                          filtering_tap_listeners, tap_flags)) {
3091         /* Either there's no read filtering or this packet passed the
3092            filter, so, if we're writing to a capture file, write
3093            this packet out. */
3094         if (pdh != NULL) {
3095           if (!wtap_dump(pdh, wtap_phdr(cf->wth), wtap_buf_ptr(cf->wth), &err)) {
3096             /* Error writing to a capture file */
3097             switch (err) {
3098
3099             case WTAP_ERR_UNSUPPORTED_ENCAP:
3100               /*
3101                * This is a problem with the particular frame we're writing;
3102                * note that, and give the frame number.
3103                */
3104               fprintf(stderr,
3105                       "Frame %u of \"%s\" has a network type that can't be saved in a \"%s\" file.\n",
3106                       framenum, cf->filename,
3107                       wtap_file_type_short_string(out_file_type));
3108               break;
3109
3110             default:
3111               show_capture_file_io_error(save_file, err, FALSE);
3112               break;
3113             }
3114             wtap_dump_close(pdh, &err);
3115             g_free(shb_hdr);
3116             exit(2);
3117           }
3118         }
3119         /* Stop reading if we have the maximum number of packets;
3120          * When the -c option has not been used, max_packet_count
3121          * starts at 0, which practically means, never stop reading.
3122          * (unless we roll over max_packet_count ?)
3123          */
3124         if ( (--max_packet_count == 0) || (max_byte_count != 0 && data_offset >= max_byte_count)) {
3125           err = 0; /* This is not an error */
3126           break;
3127         }
3128       }
3129     }
3130   }
3131
3132   if (err != 0) {
3133     /*
3134      * Print a message noting that the read failed somewhere along the line.
3135      *
3136      * If we're printing packet data, and the standard output and error are
3137      * going to the same place, flush the standard output, so everything
3138      * buffered up is written, and then print a newline to the standard error
3139      * before printing the error message, to separate it from the packet
3140      * data.  (Alas, that only works on UN*X; st_dev is meaningless, and
3141      * the _fstat() documentation at Microsoft doesn't indicate whether
3142      * st_ino is even supported.)
3143      */
3144 #ifndef _WIN32
3145     if (print_packet_info) {
3146       struct stat stat_stdout, stat_stderr;
3147
3148       if (fstat(1, &stat_stdout) == 0 && fstat(2, &stat_stderr) == 0) {
3149         if (stat_stdout.st_dev == stat_stderr.st_dev &&
3150             stat_stdout.st_ino == stat_stderr.st_ino) {
3151           fflush(stdout);
3152           fprintf(stderr, "\n");
3153         }
3154       }
3155     }
3156 #endif
3157     switch (err) {
3158
3159     case WTAP_ERR_UNSUPPORTED:
3160       cmdarg_err("The file \"%s\" contains record data that TShark doesn't support.\n(%s)",
3161                  cf->filename, err_info);
3162       g_free(err_info);
3163       break;
3164
3165     case WTAP_ERR_UNSUPPORTED_ENCAP:
3166       cmdarg_err("The file \"%s\" has a packet with a network type that TShark doesn't support.\n(%s)",
3167                  cf->filename, err_info);
3168       g_free(err_info);
3169       break;
3170
3171     case WTAP_ERR_CANT_READ:
3172       cmdarg_err("An attempt to read from the file \"%s\" failed for some unknown reason.",
3173                  cf->filename);
3174       break;
3175
3176     case WTAP_ERR_SHORT_READ:
3177       cmdarg_err("The file \"%s\" appears to have been cut short in the middle of a packet.",
3178                  cf->filename);
3179       break;
3180
3181     case WTAP_ERR_BAD_FILE:
3182       cmdarg_err("The file \"%s\" appears to be damaged or corrupt.\n(%s)",
3183                  cf->filename, err_info);
3184       g_free(err_info);
3185       break;
3186
3187     case WTAP_ERR_DECOMPRESS:
3188       cmdarg_err("The compressed file \"%s\" appears to be damaged or corrupt.\n"
3189                  "(%s)", cf->filename, err_info);
3190       break;
3191
3192     default:
3193       cmdarg_err("An error occurred while reading the file \"%s\": %s.",
3194                  cf->filename, wtap_strerror(err));
3195       break;
3196     }
3197     if (save_file != NULL) {
3198       /* Now close the capture file. */
3199       if (!wtap_dump_close(pdh, &err))
3200         show_capture_file_io_error(save_file, err, TRUE);
3201     }
3202   } else {
3203     if (save_file != NULL) {
3204       /* Now close the capture file. */
3205       if (!wtap_dump_close(pdh, &err))
3206         show_capture_file_io_error(save_file, err, TRUE);
3207     } else {
3208       if (print_packet_info) {
3209         if (!write_finale()) {
3210           err = errno;
3211           show_print_file_io_error(err);
3212         }
3213       }
3214     }
3215   }
3216
3217 out:
3218   wtap_close(cf->wth);
3219   cf->wth = NULL;
3220
3221   g_free(save_file_string);
3222   g_free(shb_hdr);
3223
3224   return err;
3225 }
3226
3227 static gboolean
3228 process_packet(capture_file *cf, gint64 offset, struct wtap_pkthdr *whdr,
3229                const guchar *pd,
3230                gboolean filtering_tap_listeners, guint tap_flags)
3231 {
3232   frame_data      fdata;
3233   gboolean        create_proto_tree;
3234   column_info    *cinfo;
3235   epan_dissect_t  edt;
3236   gboolean        passed;
3237
3238   /* Count this packet. */
3239   cf->count++;
3240
3241   /* If we're not running a display filter and we're not printing any
3242      packet information, we don't need to do a dissection. This means
3243      that all packets can be marked as 'passed'. */
3244   passed = TRUE;
3245
3246   frame_data_init(&fdata, cf->count, whdr, offset, cum_bytes);
3247
3248   /* If we're going to print packet information, or we're going to
3249      run a read filter, or we're going to process taps, set up to
3250      do a dissection and do so. */
3251   if (do_dissection) {
3252     if (print_packet_info && (gbl_resolv_flags.mac_name || gbl_resolv_flags.network_name ||
3253         gbl_resolv_flags.transport_name || gbl_resolv_flags.concurrent_dns))
3254       /* Grab any resolved addresses */
3255       host_name_lookup_process();
3256
3257     if (cf->rfcode || cf->dfcode || print_details || filtering_tap_listeners ||
3258         (tap_flags & TL_REQUIRES_PROTO_TREE) || have_custom_cols(&cf->cinfo))
3259       create_proto_tree = TRUE;
3260     else
3261       create_proto_tree = FALSE;
3262
3263     /* The protocol tree will be "visible", i.e., printed, only if we're
3264        printing packet details, which is true if we're printing stuff
3265        ("print_packet_info" is true) and we're in verbose mode
3266        ("packet_details" is true). */
3267     epan_dissect_init(&edt, cf->epan, create_proto_tree, print_packet_info && print_details);
3268
3269     /* If we're running a filter, prime the epan_dissect_t with that
3270        filter. */
3271     if (cf->rfcode)
3272       epan_dissect_prime_dfilter(&edt, cf->rfcode);
3273     if (cf->dfcode)
3274       epan_dissect_prime_dfilter(&edt, cf->dfcode);
3275
3276     col_custom_prime_edt(&edt, &cf->cinfo);
3277
3278     /* We only need the columns if either
3279          1) some tap needs the columns
3280        or
3281          2) we're printing packet info but we're *not* verbose; in verbose
3282             mode, we print the protocol tree, not the protocol summary.
3283        or
3284          3) there is a column mapped as an individual field */
3285     if ((tap_flags & TL_REQUIRES_COLUMNS) || (print_packet_info && print_summary) || output_fields_has_cols(output_fields))
3286       cinfo = &cf->cinfo;
3287     else
3288       cinfo = NULL;
3289
3290     frame_data_set_before_dissect(&fdata, &cf->elapsed_time,
3291                                   &ref, prev_dis);
3292     if (ref == &fdata) {
3293       ref_frame = fdata;
3294       ref = &ref_frame;
3295     }
3296
3297     epan_dissect_run_with_taps(&edt, whdr, frame_tvbuff_new(&fdata, pd), &fdata, cinfo);
3298
3299     /* Run the filters if we have them. */
3300     if (cf->rfcode)
3301       passed = dfilter_apply_edt(cf->rfcode, &edt);
3302     if (passed && cf->dfcode)
3303       passed = dfilter_apply_edt(cf->dfcode, &edt);
3304   }
3305
3306   if (passed) {
3307     frame_data_set_after_dissect(&fdata, &cum_bytes);
3308
3309     /* Process this packet. */
3310     if (print_packet_info) {
3311       /* We're printing packet information; print the information for
3312          this packet. */
3313       if (do_dissection)
3314         print_packet(cf, &edt);
3315       else
3316         print_packet(cf, NULL);
3317
3318       /* The ANSI C standard does not appear to *require* that a line-buffered
3319          stream be flushed to the host environment whenever a newline is
3320          written, it just says that, on such a stream, characters "are
3321          intended to be transmitted to or from the host environment as a
3322          block when a new-line character is encountered".
3323
3324          The Visual C++ 6.0 C implementation doesn't do what is intended;
3325          even if you set a stream to be line-buffered, it still doesn't
3326          flush the buffer at the end of every line.
3327
3328          So, if the "-l" flag was specified, we flush the standard output
3329          at the end of a packet.  This will do the right thing if we're
3330          printing packet summary lines, and, as we print the entire protocol
3331          tree for a single packet without waiting for anything to happen,
3332          it should be as good as line-buffered mode if we're printing
3333          protocol trees.  (The whole reason for the "-l" flag in either
3334          tcpdump or TShark is to allow the output of a live capture to
3335          be piped to a program or script and to have that script see the
3336          information for the packet as soon as it's printed, rather than
3337          having to wait until a standard I/O buffer fills up. */
3338       if (line_buffered)
3339         fflush(stdout);
3340
3341       if (ferror(stdout)) {
3342         show_print_file_io_error(errno);
3343         exit(2);
3344       }
3345     }
3346
3347     /* this must be set after print_packet() [bug #8160] */
3348     prev_dis_frame = fdata;
3349     prev_dis = &prev_dis_frame;
3350   }
3351
3352   prev_cap_frame = fdata;
3353   prev_cap = &prev_cap_frame;
3354
3355   if (do_dissection) {
3356     epan_dissect_cleanup(&edt);
3357     frame_data_destroy(&fdata);
3358   }
3359   return passed;
3360 }
3361
3362 static gboolean
3363 write_preamble(capture_file *cf)
3364 {
3365   switch (output_action) {
3366
3367   case WRITE_TEXT:
3368     return print_preamble(print_stream, cf ? cf->filename : NULL, wireshark_svnversion);
3369
3370   case WRITE_XML:
3371     if (print_details)
3372       write_pdml_preamble(stdout, cf ? cf->filename : NULL);
3373     else
3374       write_psml_preamble(stdout);
3375     return !ferror(stdout);
3376
3377   case WRITE_FIELDS:
3378     write_fields_preamble(output_fields, stdout);
3379     return !ferror(stdout);
3380
3381   default:
3382     g_assert_not_reached();
3383     return FALSE;
3384   }
3385 }
3386
3387 static char *
3388 get_line_buf(size_t len)
3389 {
3390   static char   *line_bufp    = NULL;
3391   static size_t  line_buf_len = 256;
3392   size_t         new_line_buf_len;
3393
3394   for (new_line_buf_len = line_buf_len; len > new_line_buf_len;
3395        new_line_buf_len *= 2)
3396     ;
3397   if (line_bufp == NULL) {
3398     line_buf_len = new_line_buf_len;
3399     line_bufp = (char *)g_malloc(line_buf_len + 1);
3400   } else {
3401     if (new_line_buf_len > line_buf_len) {
3402       line_buf_len = new_line_buf_len;
3403       line_bufp = (char *)g_realloc(line_bufp, line_buf_len + 1);
3404     }
3405   }
3406   return line_bufp;
3407 }
3408
3409 static gboolean
3410 print_columns(capture_file *cf)
3411 {
3412   char   *line_bufp;
3413   int     i;
3414   size_t  buf_offset;
3415   size_t  column_len;
3416
3417   line_bufp = get_line_buf(256);
3418   buf_offset = 0;
3419   *line_bufp = '\0';
3420   for (i = 0; i < cf->cinfo.num_cols; i++) {
3421     /* Skip columns not marked as visible. */
3422     if (!get_column_visible(i))
3423       continue;
3424     switch (cf->cinfo.col_fmt[i]) {
3425     case COL_NUMBER:
3426 #ifdef HAVE_LIBPCAP
3427       /*
3428        * Don't print this if we're doing a live capture from a network
3429        * interface - if we're doing a live capture, you won't be
3430        * able to look at the capture in the future (it's not being
3431        * saved anywhere), so the frame numbers are unlikely to be
3432        * useful.
3433        *
3434        * (XXX - it might be nice to be able to save and print at
3435        * the same time, sort of like an "Update list of packets
3436        * in real time" capture in Wireshark.)
3437        */
3438       if (global_capture_opts.ifaces->len > 0)
3439         continue;
3440 #endif
3441       column_len = strlen(cf->cinfo.col_data[i]);
3442       if (column_len < 3)
3443         column_len = 3;
3444       line_bufp = get_line_buf(buf_offset + column_len);
3445       g_snprintf(line_bufp + buf_offset, (int)column_len + 1, "%3s", cf->cinfo.col_data[i]);
3446       break;
3447
3448     case COL_CLS_TIME:
3449     case COL_REL_TIME:
3450     case COL_ABS_TIME:
3451     case COL_ABS_DATE_TIME:
3452     case COL_UTC_TIME:
3453     case COL_UTC_DATE_TIME: /* XXX - wider */
3454       column_len = strlen(cf->cinfo.col_data[i]);
3455       if (column_len < 10)
3456         column_len = 10;
3457       line_bufp = get_line_buf(buf_offset + column_len);
3458       g_snprintf(line_bufp + buf_offset, (int)column_len + 1, "%10s", cf->cinfo.col_data[i]);
3459       break;
3460
3461     case COL_DEF_SRC:
3462     case COL_RES_SRC:
3463     case COL_UNRES_SRC:
3464     case COL_DEF_DL_SRC:
3465     case COL_RES_DL_SRC:
3466     case COL_UNRES_DL_SRC:
3467     case COL_DEF_NET_SRC:
3468     case COL_RES_NET_SRC:
3469     case COL_UNRES_NET_SRC:
3470       column_len = strlen(cf->cinfo.col_data[i]);
3471       if (column_len < 12)
3472         column_len = 12;
3473       line_bufp = get_line_buf(buf_offset + column_len);
3474       g_snprintf(line_bufp + buf_offset, (int)column_len + 1, "%12s", cf->cinfo.col_data[i]);
3475       break;
3476
3477     case COL_DEF_DST:
3478     case COL_RES_DST:
3479     case COL_UNRES_DST:
3480     case COL_DEF_DL_DST:
3481     case COL_RES_DL_DST:
3482     case COL_UNRES_DL_DST:
3483     case COL_DEF_NET_DST:
3484     case COL_RES_NET_DST:
3485     case COL_UNRES_NET_DST:
3486       column_len = strlen(cf->cinfo.col_data[i]);
3487       if (column_len < 12)
3488         column_len = 12;
3489       line_bufp = get_line_buf(buf_offset + column_len);
3490       g_snprintf(line_bufp + buf_offset, (int)column_len + 1, "%-12s", cf->cinfo.col_data[i]);
3491       break;
3492
3493     default:
3494       column_len = strlen(cf->cinfo.col_data[i]);
3495       line_bufp = get_line_buf(buf_offset + column_len);
3496       g_strlcat(line_bufp + buf_offset, cf->cinfo.col_data[i], column_len + 1);
3497       break;
3498     }
3499     buf_offset += column_len;
3500     if (i != cf->cinfo.num_cols - 1) {
3501       /*
3502        * This isn't the last column, so we need to print a
3503        * separator between this column and the next.
3504        *
3505        * If we printed a network source and are printing a
3506        * network destination of the same type next, separate
3507        * them with " -> "; if we printed a network destination
3508        * and are printing a network source of the same type
3509        * next, separate them with " <- "; otherwise separate them
3510        * with a space.
3511        *
3512        * We add enough space to the buffer for " <- " or " -> ",
3513        * even if we're only adding " ".
3514        */
3515       line_bufp = get_line_buf(buf_offset + 4);
3516       switch (cf->cinfo.col_fmt[i]) {
3517
3518       case COL_DEF_SRC:
3519       case COL_RES_SRC:
3520       case COL_UNRES_SRC:
3521         switch (cf->cinfo.col_fmt[i + 1]) {
3522
3523         case COL_DEF_DST:
3524         case COL_RES_DST:
3525         case COL_UNRES_DST:
3526           g_strlcat(line_bufp + buf_offset, " -> ", 5);
3527           buf_offset += 4;
3528           break;
3529
3530         default:
3531           g_strlcat(line_bufp + buf_offset, " ", 5);
3532           buf_offset += 1;
3533           break;
3534         }
3535         break;
3536
3537       case COL_DEF_DL_SRC:
3538       case COL_RES_DL_SRC:
3539       case COL_UNRES_DL_SRC:
3540         switch (cf->cinfo.col_fmt[i + 1]) {
3541
3542         case COL_DEF_DL_DST:
3543         case COL_RES_DL_DST:
3544         case COL_UNRES_DL_DST:
3545           g_strlcat(line_bufp + buf_offset, " -> ", 5);
3546           buf_offset += 4;
3547           break;
3548
3549         default:
3550           g_strlcat(line_bufp + buf_offset, " ", 5);
3551           buf_offset += 1;
3552           break;
3553         }
3554         break;
3555
3556       case COL_DEF_NET_SRC:
3557       case COL_RES_NET_SRC:
3558       case COL_UNRES_NET_SRC:
3559         switch (cf->cinfo.col_fmt[i + 1]) {
3560
3561         case COL_DEF_NET_DST:
3562         case COL_RES_NET_DST:
3563         case COL_UNRES_NET_DST:
3564           g_strlcat(line_bufp + buf_offset, " -> ", 5);
3565           buf_offset += 4;
3566           break;
3567
3568         default:
3569           g_strlcat(line_bufp + buf_offset, " ", 5);
3570           buf_offset += 1;
3571           break;
3572         }
3573         break;
3574
3575       case COL_DEF_DST:
3576       case COL_RES_DST:
3577       case COL_UNRES_DST:
3578         switch (cf->cinfo.col_fmt[i + 1]) {
3579
3580         case COL_DEF_SRC:
3581         case COL_RES_SRC:
3582         case COL_UNRES_SRC:
3583           g_strlcat(line_bufp + buf_offset, " <- ", 5);
3584           buf_offset += 4;
3585           break;
3586
3587         default:
3588           g_strlcat(line_bufp + buf_offset, " ", 5);
3589           buf_offset += 1;
3590           break;
3591         }
3592         break;
3593
3594       case COL_DEF_DL_DST:
3595       case COL_RES_DL_DST:
3596       case COL_UNRES_DL_DST:
3597         switch (cf->cinfo.col_fmt[i + 1]) {
3598
3599         case COL_DEF_DL_SRC:
3600         case COL_RES_DL_SRC:
3601         case COL_UNRES_DL_SRC:
3602           g_strlcat(line_bufp + buf_offset, " <- ", 5);
3603           buf_offset += 4;
3604           break;
3605
3606         default:
3607           g_strlcat(line_bufp + buf_offset, " ", 5);
3608           buf_offset += 1;
3609           break;
3610         }
3611         break;
3612
3613       case COL_DEF_NET_DST:
3614       case COL_RES_NET_DST:
3615       case COL_UNRES_NET_DST:
3616         switch (cf->cinfo.col_fmt[i + 1]) {
3617
3618         case COL_DEF_NET_SRC:
3619         case COL_RES_NET_SRC:
3620         case COL_UNRES_NET_SRC:
3621           g_strlcat(line_bufp + buf_offset, " <- ", 5);
3622           buf_offset += 4;
3623           break;
3624
3625         default:
3626           g_strlcat(line_bufp + buf_offset, " ", 5);
3627           buf_offset += 1;
3628           break;
3629         }
3630         break;
3631
3632       default:
3633         g_strlcat(line_bufp + buf_offset, " ", 5);
3634         buf_offset += 1;
3635         break;
3636       }
3637     }
3638   }
3639   return print_line(print_stream, 0, line_bufp);
3640 }
3641
3642 static gboolean
3643 print_packet(capture_file *cf, epan_dissect_t *edt)
3644 {
3645   print_args_t print_args;
3646
3647   if (print_summary || output_fields_has_cols(output_fields)) {
3648     /* Just fill in the columns. */
3649     epan_dissect_fill_in_columns(edt, FALSE, TRUE);
3650
3651     if (print_summary) {
3652       /* Now print them. */
3653       switch (output_action) {
3654
3655       case WRITE_TEXT:
3656         if (!print_columns(cf))
3657           return FALSE;
3658         break;
3659
3660       case WRITE_XML:
3661         proto_tree_write_psml(edt, stdout);
3662         return !ferror(stdout);
3663       case WRITE_FIELDS: /*No non-verbose "fields" format */
3664         g_assert_not_reached();
3665         break;
3666       }
3667     }
3668   }
3669   if (print_details) {
3670     /* Print the information in the protocol tree. */
3671     switch (output_action) {
3672
3673     case WRITE_TEXT:
3674       /* Only initialize the fields that are actually used in proto_tree_print.
3675        * This is particularly important for .range, as that's heap memory which
3676        * we would otherwise have to g_free().
3677       print_args.to_file = TRUE;
3678       print_args.format = print_format;
3679       print_args.print_summary = print_summary;
3680       print_args.print_formfeed = FALSE;
3681       packet_range_init(&print_args.range, &cfile);
3682       */
3683       print_args.print_hex = print_hex;
3684       print_args.print_dissections = print_details ? print_dissections_expanded : print_dissections_none;
3685
3686       if (!proto_tree_print(&print_args, edt, print_stream))
3687         return FALSE;
3688       if (!print_hex) {
3689         if (!print_line(print_stream, 0, separator))
3690           return FALSE;
3691       }
3692       break;
3693
3694     case WRITE_XML:
3695       proto_tree_write_pdml(edt, stdout);
3696       printf("\n");
3697       return !ferror(stdout);
3698     case WRITE_FIELDS:
3699       proto_tree_write_fields(output_fields, edt, &cf->cinfo, stdout);
3700       printf("\n");
3701       return !ferror(stdout);
3702     }
3703   }
3704   if (print_hex) {
3705     if (print_summary || print_details) {
3706       if (!print_line(print_stream, 0, ""))
3707         return FALSE;
3708     }
3709     if (!print_hex_data(print_stream, edt))
3710       return FALSE;
3711     if (!print_line(print_stream, 0, separator))
3712       return FALSE;
3713   }
3714   return TRUE;
3715 }
3716
3717 static gboolean
3718 write_finale(void)
3719 {
3720   switch (output_action) {
3721
3722   case WRITE_TEXT:
3723     return print_finale(print_stream);
3724
3725   case WRITE_XML:
3726     if (print_details)
3727       write_pdml_finale(stdout);
3728     else
3729       write_psml_finale(stdout);
3730     return !ferror(stdout);
3731
3732   case WRITE_FIELDS:
3733     write_fields_finale(output_fields, stdout);
3734     return !ferror(stdout);
3735
3736   default:
3737     g_assert_not_reached();
3738     return FALSE;
3739   }
3740 }
3741
3742 cf_status_t
3743 cf_open(capture_file *cf, const char *fname, gboolean is_tempfile, int *err)
3744 {
3745   wtap  *wth;
3746   gchar *err_info;
3747   char   err_msg[2048+1];
3748
3749   wth = wtap_open_offline(fname, err, &err_info, perform_two_pass_analysis);
3750   if (wth == NULL)
3751     goto fail;
3752
3753   /* The open succeeded.  Fill in the information for this file. */
3754
3755   /* Create new epan session for dissection. */
3756   epan_free(cf->epan);
3757   cf->epan = tshark_epan_new(cf);
3758
3759   cf->wth = wth;
3760   cf->f_datalen = 0; /* not used, but set it anyway */
3761
3762   /* Set the file name because we need it to set the follow stream filter.
3763      XXX - is that still true?  We need it for other reasons, though,
3764      in any case. */
3765   cf->filename = g_strdup(fname);
3766
3767   /* Indicate whether it's a permanent or temporary file. */
3768   cf->is_tempfile = is_tempfile;
3769
3770   /* No user changes yet. */
3771   cf->unsaved_changes = FALSE;
3772
3773   cf->cd_t      = wtap_file_type(cf->wth);
3774   cf->count     = 0;
3775   cf->drops_known = FALSE;
3776   cf->drops     = 0;
3777   cf->snap      = wtap_snapshot_length(cf->wth);
3778   if (cf->snap == 0) {
3779     /* Snapshot length not known. */
3780     cf->has_snap = FALSE;
3781     cf->snap = WTAP_MAX_PACKET_SIZE;
3782   } else
3783     cf->has_snap = TRUE;
3784   nstime_set_zero(&cf->elapsed_time);
3785   ref = NULL;
3786   prev_dis = NULL;
3787   prev_cap = NULL;
3788
3789   cf->state = FILE_READ_IN_PROGRESS;
3790
3791   wtap_set_cb_new_ipv4(cf->wth, add_ipv4_name);
3792   wtap_set_cb_new_ipv6(cf->wth, (wtap_new_ipv6_callback_t) add_ipv6_name);
3793
3794   return CF_OK;
3795
3796 fail:
3797   g_snprintf(err_msg, sizeof err_msg,
3798              cf_open_error_message(*err, err_info, FALSE, cf->cd_t), fname);
3799   cmdarg_err("%s", err_msg);
3800   return CF_ERROR;
3801 }
3802
3803 static void
3804 show_capture_file_io_error(const char *fname, int err, gboolean is_close)
3805 {
3806   char *save_file_string;
3807
3808   save_file_string = output_file_description(fname);
3809
3810   switch (err) {
3811
3812   case ENOSPC:
3813     cmdarg_err("Not all the packets could be written to the %s because there is "
3814                "no space left on the file system.",
3815                save_file_string);
3816     break;
3817
3818 #ifdef EDQUOT
3819   case EDQUOT:
3820     cmdarg_err("Not all the packets could be written to the %s because you are "
3821                "too close to, or over your disk quota.",
3822                save_file_string);
3823   break;
3824 #endif
3825
3826   case WTAP_ERR_CANT_CLOSE:
3827     cmdarg_err("The %s couldn't be closed for some unknown reason.",
3828                save_file_string);
3829     break;
3830
3831   case WTAP_ERR_SHORT_WRITE:
3832     cmdarg_err("Not all the packets could be written to the %s.",
3833                save_file_string);
3834     break;
3835
3836   default:
3837     if (is_close) {
3838       cmdarg_err("The %s could not be closed: %s.", save_file_string,
3839                  wtap_strerror(err));
3840     } else {
3841       cmdarg_err("An error occurred while writing to the %s: %s.",
3842                  save_file_string, wtap_strerror(err));
3843     }
3844     break;
3845   }
3846   g_free(save_file_string);
3847 }
3848
3849 static void
3850 show_print_file_io_error(int err)
3851 {
3852   switch (err) {
3853
3854   case ENOSPC:
3855     cmdarg_err("Not all the packets could be printed because there is "
3856 "no space left on the file system.");
3857     break;
3858
3859 #ifdef EDQUOT
3860   case EDQUOT:
3861     cmdarg_err("Not all the packets could be printed because you are "
3862 "too close to, or over your disk quota.");
3863   break;
3864 #endif
3865
3866   default:
3867     cmdarg_err("An error occurred while printing packets: %s.",
3868       g_strerror(err));
3869     break;
3870   }
3871 }
3872
3873 static const char *
3874 cf_open_error_message(int err, gchar *err_info, gboolean for_writing,
3875                       int file_type)
3876 {
3877   const char *errmsg;
3878   static char errmsg_errno[1024+1];
3879
3880   if (err < 0) {
3881     /* Wiretap error. */
3882     switch (err) {
3883
3884     case WTAP_ERR_NOT_REGULAR_FILE:
3885       errmsg = "The file \"%s\" is a \"special file\" or socket or other non-regular file.";
3886       break;
3887
3888     case WTAP_ERR_RANDOM_OPEN_PIPE:
3889       /* Seen only when opening a capture file for reading. */
3890       errmsg = "The file \"%s\" is a pipe or FIFO; TShark can't read pipe or FIFO files in two-pass mode.";
3891       break;
3892
3893     case WTAP_ERR_FILE_UNKNOWN_FORMAT:
3894       /* Seen only when opening a capture file for reading. */
3895       errmsg = "The file \"%s\" isn't a capture file in a format TShark understands.";
3896       break;
3897
3898     case WTAP_ERR_UNSUPPORTED:
3899       /* Seen only when opening a capture file for reading. */
3900       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3901                "The file \"%%s\" isn't a capture file in a format TShark understands.\n"
3902                "(%s)", err_info);
3903       g_free(err_info);
3904       errmsg = errmsg_errno;
3905       break;
3906
3907     case WTAP_ERR_CANT_WRITE_TO_PIPE:
3908       /* Seen only when opening a capture file for writing. */
3909       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3910                  "The file \"%%s\" is a pipe, and \"%s\" capture files can't be "
3911                  "written to a pipe.", wtap_file_type_short_string(file_type));
3912       errmsg = errmsg_errno;
3913       break;
3914
3915     case WTAP_ERR_UNSUPPORTED_FILE_TYPE:
3916       /* Seen only when opening a capture file for writing. */
3917       errmsg = "TShark doesn't support writing capture files in that format.";
3918       break;
3919
3920     case WTAP_ERR_UNSUPPORTED_ENCAP:
3921       if (for_writing) {
3922         g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3923                    "TShark can't save this capture as a \"%s\" file.",
3924                    wtap_file_type_short_string(file_type));
3925       } else {
3926         g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3927                  "The file \"%%s\" is a capture for a network type that TShark doesn't support.\n"
3928                  "(%s)", err_info);
3929         g_free(err_info);
3930       }
3931       errmsg = errmsg_errno;
3932       break;
3933
3934     case WTAP_ERR_ENCAP_PER_PACKET_UNSUPPORTED:
3935       if (for_writing) {
3936         g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3937                    "TShark can't save this capture as a \"%s\" file.",
3938                    wtap_file_type_short_string(file_type));
3939         errmsg = errmsg_errno;
3940       } else
3941         errmsg = "The file \"%s\" is a capture for a network type that TShark doesn't support.";
3942       break;
3943
3944     case WTAP_ERR_BAD_FILE:
3945       /* Seen only when opening a capture file for reading. */
3946       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3947                "The file \"%%s\" appears to be damaged or corrupt.\n"
3948                "(%s)", err_info);
3949       g_free(err_info);
3950       errmsg = errmsg_errno;
3951       break;
3952
3953     case WTAP_ERR_CANT_OPEN:
3954       if (for_writing)
3955         errmsg = "The file \"%s\" could not be created for some unknown reason.";
3956       else
3957         errmsg = "The file \"%s\" could not be opened for some unknown reason.";
3958       break;
3959
3960     case WTAP_ERR_SHORT_READ:
3961       errmsg = "The file \"%s\" appears to have been cut short"
3962                " in the middle of a packet or other data.";
3963       break;
3964
3965     case WTAP_ERR_SHORT_WRITE:
3966       errmsg = "A full header couldn't be written to the file \"%s\".";
3967       break;
3968
3969     case WTAP_ERR_COMPRESSION_NOT_SUPPORTED:
3970       errmsg = "This file type cannot be written as a compressed file.";
3971       break;
3972
3973     case WTAP_ERR_DECOMPRESS:
3974       /* Seen only when opening a capture file for reading. */
3975       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3976                  "The compressed file \"%%s\" appears to be damaged or corrupt.\n"
3977                  "(%s)", err_info);
3978       g_free(err_info);
3979       errmsg = errmsg_errno;
3980       break;
3981
3982     default:
3983       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3984                  "The file \"%%s\" could not be %s: %s.",
3985                  for_writing ? "created" : "opened",
3986                  wtap_strerror(err));
3987       errmsg = errmsg_errno;
3988       break;
3989     }
3990   } else
3991     errmsg = file_open_error_message(err, for_writing);
3992   return errmsg;
3993 }
3994
3995 /*
3996  * Open/create errors are reported with an console message in TShark.
3997  */
3998 static void
3999 open_failure_message(const char *filename, int err, gboolean for_writing)
4000 {
4001   fprintf(stderr, "tshark: ");
4002   fprintf(stderr, file_open_error_message(err, for_writing), filename);
4003   fprintf(stderr, "\n");
4004 }
4005
4006
4007 /*
4008  * General errors are reported with an console message in TShark.
4009  */
4010 static void
4011 failure_message(const char *msg_format, va_list ap)
4012 {
4013   fprintf(stderr, "tshark: ");
4014   vfprintf(stderr, msg_format, ap);
4015   fprintf(stderr, "\n");
4016 }
4017
4018 /*
4019  * Read errors are reported with an console message in TShark.
4020  */
4021 static void
4022 read_failure_message(const char *filename, int err)
4023 {
4024   cmdarg_err("An error occurred while reading from the file \"%s\": %s.",
4025           filename, g_strerror(err));
4026 }
4027
4028 /*
4029  * Write errors are reported with an console message in TShark.
4030  */
4031 static void
4032 write_failure_message(const char *filename, int err)
4033 {
4034   cmdarg_err("An error occurred while writing to the file \"%s\": %s.",
4035           filename, g_strerror(err));
4036 }
4037
4038 /*
4039  * Report an error in command-line arguments.
4040  */
4041 void
4042 cmdarg_err(const char *fmt, ...)
4043 {
4044   va_list ap;
4045
4046   va_start(ap, fmt);
4047   failure_message(fmt, ap);
4048   va_end(ap);
4049 }
4050
4051 /*
4052  * Report additional information for an error in command-line arguments.
4053  */
4054 void
4055 cmdarg_err_cont(const char *fmt, ...)
4056 {
4057   va_list ap;
4058
4059   va_start(ap, fmt);
4060   vfprintf(stderr, fmt, ap);
4061   fprintf(stderr, "\n");
4062   va_end(ap);
4063 }
4064
4065
4066 /*
4067  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
4068  *
4069  * Local variables:
4070  * c-basic-offset: 2
4071  * tab-width: 8
4072  * indent-tabs-mode: nil
4073  * End:
4074  *
4075  * vi: set shiftwidth=2 tabstop=8 expandtab:
4076  * :indentSize=2:tabSize=8:noTabs=true:
4077  */