simplify argument checking for tshark
[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   if (print_hex) {
1600     if (output_action != WRITE_TEXT) {
1601       cmdarg_err("Raw packet hex data can only be printed as text or PostScript");
1602       return 1;
1603     }
1604   }
1605
1606   if (output_only != NULL) {
1607     char *ps;
1608
1609     if (!print_details) {
1610       cmdarg_err("-O requires -V");
1611       return 1;
1612     }
1613
1614     output_only_tables = g_hash_table_new (g_str_hash, g_str_equal);
1615     for (ps = strtok (output_only, ","); ps; ps = strtok (NULL, ",")) {
1616       g_hash_table_insert(output_only_tables, (gpointer)ps, (gpointer)ps);
1617     }
1618   }
1619
1620   if (rfilter != NULL && !perform_two_pass_analysis) {
1621     /* Just a warning, so we don't return */
1622     cmdarg_err("-R without -2 is deprecated. For single-pass filtering use -Y.");
1623   }
1624
1625 #ifdef HAVE_LIBPCAP
1626   if (list_link_layer_types) {
1627     /* We're supposed to list the link-layer types for an interface;
1628        did the user also specify a capture file to be read? */
1629     if (cf_name) {
1630       /* Yes - that's bogus. */
1631       cmdarg_err("You can't specify -L and a capture file to be read.");
1632       return 1;
1633     }
1634     /* No - did they specify a ring buffer option? */
1635     if (global_capture_opts.multi_files_on) {
1636       cmdarg_err("Ring buffer requested, but a capture isn't being done.");
1637       return 1;
1638     }
1639   } else {
1640     if (cf_name) {
1641       /*
1642        * "-r" was specified, so we're reading a capture file.
1643        * Capture options don't apply here.
1644        */
1645
1646       /* We don't support capture filters when reading from a capture file
1647          (the BPF compiler doesn't support all link-layer types that we
1648          support in capture files we read). */
1649       if (global_capture_opts.default_options.cfilter) {
1650         cmdarg_err("Only read filters, not capture filters, "
1651           "can be specified when reading a capture file.");
1652         return 1;
1653       }
1654       if (global_capture_opts.multi_files_on) {
1655         cmdarg_err("Multiple capture files requested, but "
1656                    "a capture isn't being done.");
1657         return 1;
1658       }
1659       if (global_capture_opts.has_file_duration) {
1660         cmdarg_err("Switching capture files after a time interval was specified, but "
1661                    "a capture isn't being done.");
1662         return 1;
1663       }
1664       if (global_capture_opts.has_ring_num_files) {
1665         cmdarg_err("A ring buffer of capture files was specified, but "
1666           "a capture isn't being done.");
1667         return 1;
1668       }
1669       if (global_capture_opts.has_autostop_files) {
1670         cmdarg_err("A maximum number of capture files was specified, but "
1671           "a capture isn't being done.");
1672         return 1;
1673       }
1674
1675       /* Note: TShark now allows the restriction of a _read_ file by packet count
1676        * and byte count as well as a write file. Other autostop options remain valid
1677        * only for a write file.
1678        */
1679       if (global_capture_opts.has_autostop_duration) {
1680         cmdarg_err("A maximum capture time was specified, but "
1681           "a capture isn't being done.");
1682         return 1;
1683       }
1684     } else {
1685       /*
1686        * "-r" wasn't specified, so we're doing a live capture.
1687        */
1688       if (global_capture_opts.saving_to_file) {
1689         /* They specified a "-w" flag, so we'll be saving to a capture file. */
1690
1691         /* When capturing, we only support writing pcap or pcap-ng format. */
1692         if (out_file_type != WTAP_FILE_PCAP && out_file_type != WTAP_FILE_PCAPNG) {
1693           cmdarg_err("Live captures can only be saved in libpcap format.");
1694           return 1;
1695         }
1696         if (global_capture_opts.multi_files_on) {
1697           /* Multiple-file mode doesn't work under certain conditions:
1698              a) it doesn't work if you're writing to the standard output;
1699              b) it doesn't work if you're writing to a pipe;
1700           */
1701           if (strcmp(global_capture_opts.save_file, "-") == 0) {
1702             cmdarg_err("Multiple capture files requested, but "
1703               "the capture is being written to the standard output.");
1704             return 1;
1705           }
1706           if (global_capture_opts.output_to_pipe) {
1707             cmdarg_err("Multiple capture files requested, but "
1708               "the capture file is a pipe.");
1709             return 1;
1710           }
1711           if (!global_capture_opts.has_autostop_filesize &&
1712               !global_capture_opts.has_file_duration) {
1713             cmdarg_err("Multiple capture files requested, but "
1714               "no maximum capture file size or duration was specified.");
1715             return 1;
1716           }
1717         }
1718         /* Currently, we don't support read or display filters when capturing
1719            and saving the packets. */
1720         if (rfilter != NULL) {
1721           cmdarg_err("Read filters aren't supported when capturing and saving the captured packets.");
1722           return 1;
1723         }
1724         if (dfilter != NULL) {
1725           cmdarg_err("Display filters aren't supported when capturing and saving the captured packets.");
1726           return 1;
1727         }
1728       } else {
1729         /* They didn't specify a "-w" flag, so we won't be saving to a
1730            capture file.  Check for options that only make sense if
1731            we're saving to a file. */
1732         if (global_capture_opts.has_autostop_filesize) {
1733           cmdarg_err("Maximum capture file size specified, but "
1734            "capture isn't being saved to a file.");
1735           return 1;
1736         }
1737         if (global_capture_opts.multi_files_on) {
1738           cmdarg_err("Multiple capture files requested, but "
1739             "the capture isn't being saved to a file.");
1740           return 1;
1741         }
1742       }
1743     }
1744   }
1745 #endif
1746
1747 #ifdef _WIN32
1748   /* Start windows sockets */
1749   WSAStartup( MAKEWORD( 1, 1 ), &wsaData );
1750 #endif /* _WIN32 */
1751
1752   /* Notify all registered modules that have had any of their preferences
1753      changed either from one of the preferences file or from the command
1754      line that their preferences have changed. */
1755   prefs_apply_all();
1756
1757   /* At this point MATE will have registered its field array so we can
1758      have a tap filter with one of MATE's late-registered fields as part
1759      of the filter.  We can now process all the "-z" arguments. */
1760   start_requested_stats();
1761
1762 #ifdef HAVE_LIBPCAP
1763   /* We currently don't support taps, or printing dissected packets,
1764      if we're writing to a pipe. */
1765   if (global_capture_opts.saving_to_file &&
1766       global_capture_opts.output_to_pipe) {
1767     if (tap_listeners_require_dissection()) {
1768       cmdarg_err("Taps aren't supported when saving to a pipe.");
1769       return 1;
1770     }
1771     if (print_packet_info) {
1772       cmdarg_err("Printing dissected packets isn't supported when saving to a pipe.");
1773       return 1;
1774     }
1775   }
1776 #endif
1777
1778   /* disabled protocols as per configuration file */
1779   if (gdp_path == NULL && dp_path == NULL) {
1780     set_disabled_protos_list();
1781   }
1782
1783   /* Build the column format array */
1784   build_column_format_array(&cfile.cinfo, prefs_p->num_cols, TRUE);
1785
1786 #ifdef HAVE_LIBPCAP
1787   capture_opts_trim_snaplen(&global_capture_opts, MIN_PACKET_SIZE);
1788   capture_opts_trim_ring_num_files(&global_capture_opts);
1789 #endif
1790
1791   if (rfilter != NULL) {
1792     if (!dfilter_compile(rfilter, &rfcode)) {
1793       cmdarg_err("%s", dfilter_error_msg);
1794       epan_cleanup();
1795 #ifdef HAVE_PCAP_OPEN_DEAD
1796       {
1797         pcap_t *pc;
1798
1799         pc = pcap_open_dead(DLT_EN10MB, MIN_PACKET_SIZE);
1800         if (pc != NULL) {
1801           if (pcap_compile(pc, &fcode, rfilter, 0, 0) != -1) {
1802             cmdarg_err_cont(
1803               "  Note: That read filter code looks like a valid capture filter;");
1804             cmdarg_err_cont(
1805               "        maybe you mixed them up?");
1806           }
1807           pcap_close(pc);
1808         }
1809       }
1810 #endif
1811       return 2;
1812     }
1813   }
1814   cfile.rfcode = rfcode;
1815
1816   if (dfilter != NULL) {
1817     if (!dfilter_compile(dfilter, &dfcode)) {
1818       cmdarg_err("%s", dfilter_error_msg);
1819       epan_cleanup();
1820 #ifdef HAVE_PCAP_OPEN_DEAD
1821       {
1822         pcap_t *pc;
1823
1824         pc = pcap_open_dead(DLT_EN10MB, MIN_PACKET_SIZE);
1825         if (pc != NULL) {
1826           if (pcap_compile(pc, &fcode, dfilter, 0, 0) != -1) {
1827             cmdarg_err_cont(
1828               "  Note: That display filter code looks like a valid capture filter;");
1829             cmdarg_err_cont(
1830               "        maybe you mixed them up?");
1831           }
1832           pcap_close(pc);
1833         }
1834       }
1835 #endif
1836       return 2;
1837     }
1838   }
1839   cfile.dfcode = dfcode;
1840
1841   if (print_packet_info) {
1842     /* If we're printing as text or PostScript, we have
1843        to create a print stream. */
1844     if (output_action == WRITE_TEXT) {
1845       switch (print_format) {
1846
1847       case PR_FMT_TEXT:
1848         print_stream = print_stream_text_stdio_new(stdout);
1849         break;
1850
1851       case PR_FMT_PS:
1852         print_stream = print_stream_ps_stdio_new(stdout);
1853         break;
1854
1855       default:
1856         g_assert_not_reached();
1857       }
1858     }
1859   }
1860
1861   /* We have to dissect each packet if:
1862
1863         we're printing information about each packet;
1864
1865         we're using a read filter on the packets;
1866
1867         we're using a display filter on the packets;
1868
1869         we're using any taps that need dissection. */
1870   do_dissection = print_packet_info || rfcode || dfcode || tap_listeners_require_dissection();
1871
1872   if (cf_name) {
1873     /*
1874      * We're reading a capture file.
1875      */
1876
1877     /*
1878      * Immediately relinquish any special privileges we have; we must not
1879      * be allowed to read any capture files the user running TShark
1880      * can't open.
1881      */
1882     relinquish_special_privs_perm();
1883     print_current_user();
1884
1885     if (cf_open(&cfile, cf_name, FALSE, &err) != CF_OK) {
1886       epan_cleanup();
1887       return 2;
1888     }
1889
1890     /* Set timestamp precision; there should arguably be a command-line
1891        option to let the user set this. */
1892     switch(wtap_file_tsprecision(cfile.wth)) {
1893     case(WTAP_FILE_TSPREC_SEC):
1894       timestamp_set_precision(TS_PREC_AUTO_SEC);
1895       break;
1896     case(WTAP_FILE_TSPREC_DSEC):
1897       timestamp_set_precision(TS_PREC_AUTO_DSEC);
1898       break;
1899     case(WTAP_FILE_TSPREC_CSEC):
1900       timestamp_set_precision(TS_PREC_AUTO_CSEC);
1901       break;
1902     case(WTAP_FILE_TSPREC_MSEC):
1903       timestamp_set_precision(TS_PREC_AUTO_MSEC);
1904       break;
1905     case(WTAP_FILE_TSPREC_USEC):
1906       timestamp_set_precision(TS_PREC_AUTO_USEC);
1907       break;
1908     case(WTAP_FILE_TSPREC_NSEC):
1909       timestamp_set_precision(TS_PREC_AUTO_NSEC);
1910       break;
1911     default:
1912       g_assert_not_reached();
1913     }
1914
1915     /* Process the packets in the file */
1916     TRY {
1917 #ifdef HAVE_LIBPCAP
1918       err = load_cap_file(&cfile, global_capture_opts.save_file, out_file_type, out_file_name_res,
1919           global_capture_opts.has_autostop_packets ? global_capture_opts.autostop_packets : 0,
1920           global_capture_opts.has_autostop_filesize ? global_capture_opts.autostop_filesize : 0);
1921 #else
1922       err = load_cap_file(&cfile, NULL, out_file_type, out_file_name_res, 0, 0);
1923 #endif
1924     }
1925     CATCH(OutOfMemoryError) {
1926       fprintf(stderr,
1927               "Out Of Memory!\n"
1928               "\n"
1929               "Sorry, but TShark has to terminate now!\n"
1930               "\n"
1931               "Some infos / workarounds can be found at:\n"
1932               "http://wiki.wireshark.org/KnownBugs/OutOfMemory\n");
1933       err = ENOMEM;
1934     }
1935     ENDTRY;
1936     if (err != 0) {
1937       /* We still dump out the results of taps, etc., as we might have
1938          read some packets; however, we exit with an error status. */
1939       exit_status = 2;
1940     }
1941   } else {
1942     /* No capture file specified, so we're supposed to do a live capture
1943        or get a list of link-layer types for a live capture device;
1944        do we have support for live captures? */
1945 #ifdef HAVE_LIBPCAP
1946     /* if no interface was specified, pick a default */
1947     exit_status = capture_opts_default_iface_if_necessary(&global_capture_opts,
1948         ((prefs_p->capture_device) && (*prefs_p->capture_device != '\0')) ? get_if_name(prefs_p->capture_device) : NULL);
1949     if (exit_status != 0)
1950         return exit_status;
1951
1952     /* if requested, list the link layer types and exit */
1953     if (list_link_layer_types) {
1954         guint i;
1955
1956         /* Get the list of link-layer types for the capture devices. */
1957         for (i = 0; i < global_capture_opts.ifaces->len; i++) {
1958           interface_options  interface_opts;
1959           if_capabilities_t *caps;
1960
1961           interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
1962           caps = capture_get_if_capabilities(interface_opts.name, interface_opts.monitor_mode, &err_str, NULL);
1963           if (caps == NULL) {
1964             cmdarg_err("%s", err_str);
1965             g_free(err_str);
1966             return 2;
1967           }
1968           if (caps->data_link_types == NULL) {
1969             cmdarg_err("The capture device \"%s\" has no data link types.", interface_opts.name);
1970             return 2;
1971           }
1972           capture_opts_print_if_capabilities(caps, interface_opts.name, interface_opts.monitor_mode);
1973           free_if_capabilities(caps);
1974         }
1975         return 0;
1976     }
1977
1978     if (print_packet_info) {
1979       if (!write_preamble(NULL)) {
1980         show_print_file_io_error(errno);
1981         return 2;
1982       }
1983     } else if (!quiet) {
1984       /*
1985        * We're not printing information for each packet, and the user
1986        * didn't ask us not to print a count of packets as they arrive,
1987        * so print that count so the user knows that packets are arriving.
1988        *
1989        * XXX - what if the user wants to do a live capture, doesn't want
1990        * to save it to a file, doesn't want information printed for each
1991        * packet, does want some "-z" statistic, and wants packet counts
1992        * so they know whether they're seeing any packets?
1993        */
1994       print_packet_counts = TRUE;
1995     }
1996
1997     /* For now, assume libpcap gives microsecond precision. */
1998     timestamp_set_precision(TS_PREC_AUTO_USEC);
1999
2000     /*
2001      * XXX - this returns FALSE if an error occurred, but it also
2002      * returns FALSE if the capture stops because a time limit
2003      * was reached (and possibly other limits), so we can't assume
2004      * it means an error.
2005      *
2006      * The capture code is a bit twisty, so it doesn't appear to
2007      * be an easy fix.  We just ignore the return value for now.
2008      * Instead, pass on the exit status from the capture child.
2009      */
2010     capture();
2011     exit_status = global_capture_session.fork_child_status;
2012
2013     if (print_packet_info) {
2014       if (!write_finale()) {
2015         err = errno;
2016         show_print_file_io_error(err);
2017       }
2018     }
2019 #else
2020     /* No - complain. */
2021     cmdarg_err("This version of TShark was not built with support for capturing packets.");
2022     return 2;
2023 #endif
2024   }
2025
2026   g_free(cf_name);
2027
2028   if (cfile.frames != NULL) {
2029     free_frame_data_sequence(cfile.frames);
2030     cfile.frames = NULL;
2031   }
2032
2033   draw_tap_listeners(TRUE);
2034   funnel_dump_all_text_windows();
2035   epan_cleanup();
2036
2037   output_fields_free(output_fields);
2038   output_fields = NULL;
2039
2040   return exit_status;
2041 }
2042
2043 /*#define USE_BROKEN_G_MAIN_LOOP*/
2044
2045 #ifdef USE_BROKEN_G_MAIN_LOOP
2046   GMainLoop *loop;
2047 #else
2048   gboolean loop_running = FALSE;
2049 #endif
2050   guint32 packet_count = 0;
2051
2052
2053 /* XXX - move to the right position / file */
2054 /* read from a pipe (callback) */
2055 typedef gboolean (*pipe_input_cb_t) (gint source, gpointer user_data);
2056
2057 typedef struct pipe_input_tag {
2058   gint             source;
2059   gpointer         user_data;
2060   int             *child_process;
2061   pipe_input_cb_t  input_cb;
2062   guint            pipe_input_id;
2063 #ifdef _WIN32
2064   GMutex          *callback_running;
2065 #endif
2066 } pipe_input_t;
2067
2068 static pipe_input_t pipe_input;
2069
2070 #ifdef _WIN32
2071 /* The timer has expired, see if there's stuff to read from the pipe,
2072    if so, do the callback */
2073 static gint
2074 pipe_timer_cb(gpointer data)
2075 {
2076   HANDLE        handle;
2077   DWORD         avail        = 0;
2078   gboolean      result;
2079   DWORD         childstatus;
2080   pipe_input_t *pipe_input_p = data;
2081   gint          iterations   = 0;
2082
2083   g_mutex_lock (pipe_input_p->callback_running);
2084
2085   /* try to read data from the pipe only 5 times, to avoid blocking */
2086   while(iterations < 5) {
2087     /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: new iteration");*/
2088
2089     /* Oddly enough although Named pipes don't work on win9x,
2090        PeekNamedPipe does !!! */
2091     handle = (HANDLE) _get_osfhandle (pipe_input_p->source);
2092     result = PeekNamedPipe(handle, NULL, 0, NULL, &avail, NULL);
2093
2094     /* Get the child process exit status */
2095     GetExitCodeProcess((HANDLE)*(pipe_input_p->child_process),
2096                        &childstatus);
2097
2098     /* If the Peek returned an error, or there are bytes to be read
2099        or the childwatcher thread has terminated then call the normal
2100        callback */
2101     if (!result || avail > 0 || childstatus != STILL_ACTIVE) {
2102
2103       /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: data avail");*/
2104
2105       /* And call the real handler */
2106       if (!pipe_input_p->input_cb(pipe_input_p->source, pipe_input_p->user_data)) {
2107         g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: input pipe closed, iterations: %u", iterations);
2108         /* pipe closed, return false so that the timer is stopped */
2109         g_mutex_unlock (pipe_input_p->callback_running);
2110         return FALSE;
2111       }
2112     }
2113     else {
2114       /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: no data avail");*/
2115       /* No data, stop now */
2116       break;
2117     }
2118
2119     iterations++;
2120   }
2121
2122   /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_timer_cb: finished with iterations: %u, new timer", iterations);*/
2123
2124   g_mutex_unlock (pipe_input_p->callback_running);
2125
2126   /* we didn't stopped the timer, so let it run */
2127   return TRUE;
2128 }
2129 #endif
2130
2131
2132 void
2133 pipe_input_set_handler(gint source, gpointer user_data, int *child_process, pipe_input_cb_t input_cb)
2134 {
2135
2136   pipe_input.source         = source;
2137   pipe_input.child_process  = child_process;
2138   pipe_input.user_data      = user_data;
2139   pipe_input.input_cb       = input_cb;
2140
2141 #ifdef _WIN32
2142 #if GLIB_CHECK_VERSION(2,31,0)
2143   pipe_input.callback_running = g_malloc(sizeof(GMutex));
2144   g_mutex_init(pipe_input.callback_running);
2145 #else
2146   pipe_input.callback_running = g_mutex_new();
2147 #endif
2148   /* Tricky to use pipes in win9x, as no concept of wait.  NT can
2149      do this but that doesn't cover all win32 platforms.  GTK can do
2150      this but doesn't seem to work over processes.  Attempt to do
2151      something similar here, start a timer and check for data on every
2152      timeout. */
2153   /*g_log(NULL, G_LOG_LEVEL_DEBUG, "pipe_input_set_handler: new");*/
2154   pipe_input.pipe_input_id = g_timeout_add(200, pipe_timer_cb, &pipe_input);
2155 #endif
2156 }
2157
2158 static const nstime_t *
2159 tshark_get_frame_ts(void *data, guint32 frame_num)
2160 {
2161   capture_file *cf = (capture_file *) data;
2162
2163   if (ref && ref->num == frame_num)
2164     return &ref->abs_ts;
2165
2166   if (prev_dis && prev_dis->num == frame_num)
2167     return &prev_dis->abs_ts;
2168
2169   if (prev_cap && prev_cap->num == frame_num)
2170     return &prev_cap->abs_ts;
2171
2172   if (cf->frames) {
2173      frame_data *fd = frame_data_sequence_find(cf->frames, frame_num);
2174
2175      return (fd) ? &fd->abs_ts : NULL;
2176   }
2177
2178   return NULL;
2179 }
2180
2181 static epan_t *
2182 tshark_epan_new(capture_file *cf)
2183 {
2184   epan_t *epan = epan_new();
2185
2186   epan->data = cf;
2187   epan->get_frame_ts = tshark_get_frame_ts;
2188   epan->get_interface_name = cap_file_get_interface_name;
2189
2190   return epan;
2191 }
2192
2193 #ifdef HAVE_LIBPCAP
2194 static gboolean
2195 capture(void)
2196 {
2197   gboolean          ret;
2198   guint             i;
2199   GString          *str = g_string_new("");
2200 #ifdef USE_TSHARK_SELECT
2201   fd_set            readfds;
2202 #endif
2203 #ifndef _WIN32
2204   struct sigaction  action, oldaction;
2205 #endif
2206
2207   /*
2208    * XXX - dropping privileges is still required, until code cleanup is done
2209    *
2210    * remove all dependencies to pcap specific code and using only dumpcap is almost done.
2211    * when it's done, we don't need special privileges to run tshark at all,
2212    * therefore we don't need to drop these privileges
2213    * The only thing we might want to keep is a warning if tshark is run as root,
2214    * as it's no longer necessary and potentially dangerous.
2215    *
2216    * THE FOLLOWING IS THE FORMER COMMENT WHICH IS NO LONGER REALLY VALID:
2217    * We've opened the capture device, so we shouldn't need any special
2218    * privileges any more; relinquish those privileges.
2219    *
2220    * XXX - if we have saved set-user-ID support, we should give up those
2221    * privileges immediately, and then reclaim them long enough to get
2222    * a list of network interfaces and to open one, and then give them
2223    * up again, so that stuff we do while processing the argument list,
2224    * reading the user's preferences, loading and starting plugins
2225    * (especially *user* plugins), etc. is done with the user's privileges,
2226    * not special privileges.
2227    */
2228   relinquish_special_privs_perm();
2229   print_current_user();
2230
2231   /* Create new dissection section. */
2232   epan_free(cfile.epan);
2233   cfile.epan = tshark_epan_new(&cfile);
2234
2235 #ifdef _WIN32
2236   /* Catch a CTRL+C event and, if we get it, clean up and exit. */
2237   SetConsoleCtrlHandler(capture_cleanup, TRUE);
2238 #else /* _WIN32 */
2239   /* Catch SIGINT and SIGTERM and, if we get either of them,
2240      clean up and exit.  If SIGHUP isn't being ignored, catch
2241      it too and, if we get it, clean up and exit.
2242
2243      We restart any read that was in progress, so that it doesn't
2244      disrupt reading from the sync pipe.  The signal handler tells
2245      the capture child to finish; it will report that it finished,
2246      or will exit abnormally, so  we'll stop reading from the sync
2247      pipe, pick up the exit status, and quit. */
2248   memset(&action, 0, sizeof(action));
2249   action.sa_handler = capture_cleanup;
2250   action.sa_flags = SA_RESTART;
2251   sigemptyset(&action.sa_mask);
2252   sigaction(SIGTERM, &action, NULL);
2253   sigaction(SIGINT, &action, NULL);
2254   sigaction(SIGHUP, NULL, &oldaction);
2255   if (oldaction.sa_handler == SIG_DFL)
2256     sigaction(SIGHUP, &action, NULL);
2257
2258 #ifdef SIGINFO
2259   /* Catch SIGINFO and, if we get it and we're capturing to a file in
2260      quiet mode, report the number of packets we've captured.
2261
2262      Again, restart any read that was in progress, so that it doesn't
2263      disrupt reading from the sync pipe. */
2264   action.sa_handler = report_counts_siginfo;
2265   action.sa_flags = SA_RESTART;
2266   sigemptyset(&action.sa_mask);
2267   sigaction(SIGINFO, &action, NULL);
2268 #endif /* SIGINFO */
2269 #endif /* _WIN32 */
2270
2271   global_capture_session.state = CAPTURE_PREPARING;
2272
2273   /* Let the user know which interfaces were chosen. */
2274   for (i = 0; i < global_capture_opts.ifaces->len; i++) {
2275     interface_options interface_opts;
2276
2277     interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
2278     interface_opts.descr = get_interface_descriptive_name(interface_opts.name);
2279     global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, i);
2280     g_array_insert_val(global_capture_opts.ifaces, i, interface_opts);
2281   }
2282 #ifdef _WIN32
2283   if (global_capture_opts.ifaces->len < 2) {
2284 #else
2285   if (global_capture_opts.ifaces->len < 4) {
2286 #endif
2287     for (i = 0; i < global_capture_opts.ifaces->len; i++) {
2288       interface_options interface_opts;
2289
2290       interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
2291       if (i > 0) {
2292           if (global_capture_opts.ifaces->len > 2) {
2293               g_string_append_printf(str, ",");
2294           }
2295           g_string_append_printf(str, " ");
2296           if (i == global_capture_opts.ifaces->len - 1) {
2297               g_string_append_printf(str, "and ");
2298           }
2299       }
2300       g_string_append_printf(str, "'%s'", interface_opts.descr);
2301     }
2302   } else {
2303     g_string_append_printf(str, "%u interfaces", global_capture_opts.ifaces->len);
2304   }
2305   if (really_quiet == FALSE)
2306     fprintf(stderr, "Capturing on %s\n", str->str);
2307   fflush(stderr);
2308   g_string_free(str, TRUE);
2309
2310   ret = sync_pipe_start(&global_capture_opts, &global_capture_session, NULL);
2311
2312   if (!ret)
2313     return FALSE;
2314
2315   /* the actual capture loop
2316    *
2317    * XXX - glib doesn't seem to provide any event based loop handling.
2318    *
2319    * XXX - for whatever reason,
2320    * calling g_main_loop_new() ends up in 100% cpu load.
2321    *
2322    * But that doesn't matter: in UNIX we can use select() to find an input
2323    * source with something to do.
2324    *
2325    * But that doesn't matter because we're in a CLI (that doesn't need to
2326    * update a GUI or something at the same time) so it's OK if we block
2327    * trying to read from the pipe.
2328    *
2329    * So all the stuff in USE_TSHARK_SELECT could be removed unless I'm
2330    * wrong (but I leave it there in case I am...).
2331    */
2332
2333 #ifdef USE_TSHARK_SELECT
2334   FD_ZERO(&readfds);
2335   FD_SET(pipe_input.source, &readfds);
2336 #endif
2337
2338   loop_running = TRUE;
2339
2340   TRY
2341   {
2342     while (loop_running)
2343     {
2344 #ifdef USE_TSHARK_SELECT
2345       ret = select(pipe_input.source+1, &readfds, NULL, NULL, NULL);
2346
2347       if (ret == -1)
2348       {
2349         perror("select()");
2350         return TRUE;
2351       } else if (ret == 1) {
2352 #endif
2353         /* Call the real handler */
2354         if (!pipe_input.input_cb(pipe_input.source, pipe_input.user_data)) {
2355           g_log(NULL, G_LOG_LEVEL_DEBUG, "input pipe closed");
2356           return FALSE;
2357         }
2358 #ifdef USE_TSHARK_SELECT
2359       }
2360 #endif
2361     }
2362   }
2363   CATCH(OutOfMemoryError) {
2364     fprintf(stderr,
2365             "Out Of Memory!\n"
2366             "\n"
2367             "Sorry, but TShark has to terminate now!\n"
2368             "\n"
2369             "Some infos / workarounds can be found at:\n"
2370             "http://wiki.wireshark.org/KnownBugs/OutOfMemory\n");
2371     exit(1);
2372   }
2373   ENDTRY;
2374   return TRUE;
2375 }
2376
2377 /* capture child detected an error */
2378 void
2379 capture_input_error_message(capture_session *cap_session _U_, char *error_msg, char *secondary_error_msg)
2380 {
2381   cmdarg_err("%s", error_msg);
2382   cmdarg_err_cont("%s", secondary_error_msg);
2383 }
2384
2385
2386 /* capture child detected an capture filter related error */
2387 void
2388 capture_input_cfilter_error_message(capture_session *cap_session, guint i, char *error_message)
2389 {
2390   capture_options *capture_opts = cap_session->capture_opts;
2391   dfilter_t         *rfcode = NULL;
2392   interface_options  interface_opts;
2393
2394   g_assert(i < capture_opts->ifaces->len);
2395   interface_opts = g_array_index(capture_opts->ifaces, interface_options, i);
2396
2397   if (dfilter_compile(interface_opts.cfilter, &rfcode) && rfcode != NULL) {
2398     cmdarg_err(
2399       "Invalid capture filter \"%s\" for interface %s!\n"
2400       "\n"
2401       "That string looks like a valid display filter; however, it isn't a valid\n"
2402       "capture filter (%s).\n"
2403       "\n"
2404       "Note that display filters and capture filters don't have the same syntax,\n"
2405       "so you can't use most display filter expressions as capture filters.\n"
2406       "\n"
2407       "See the User's Guide for a description of the capture filter syntax.",
2408       interface_opts.cfilter, interface_opts.descr, error_message);
2409     dfilter_free(rfcode);
2410   } else {
2411     cmdarg_err(
2412       "Invalid capture filter \"%s\" for interface %s!\n"
2413       "\n"
2414       "That string isn't a valid capture filter (%s).\n"
2415       "See the User's Guide for a description of the capture filter syntax.",
2416       interface_opts.cfilter, interface_opts.descr, error_message);
2417   }
2418 }
2419
2420
2421 /* capture child tells us we have a new (or the first) capture file */
2422 gboolean
2423 capture_input_new_file(capture_session *cap_session, gchar *new_file)
2424 {
2425   capture_options *capture_opts = cap_session->capture_opts;
2426   gboolean is_tempfile;
2427   int      err;
2428
2429   if (cap_session->state == CAPTURE_PREPARING) {
2430     g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "Capture started!");
2431   }
2432   g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "File: \"%s\"", new_file);
2433
2434   g_assert(cap_session->state == CAPTURE_PREPARING || cap_session->state == CAPTURE_RUNNING);
2435
2436   /* free the old filename */
2437   if (capture_opts->save_file != NULL) {
2438
2439     /* we start a new capture file, close the old one (if we had one before) */
2440     if ( ((capture_file *) cap_session->cf)->state != FILE_CLOSED) {
2441       if ( ((capture_file *) cap_session->cf)->wth != NULL) {
2442         wtap_close(((capture_file *) cap_session->cf)->wth);
2443       }
2444       ((capture_file *) cap_session->cf)->state = FILE_CLOSED;
2445     }
2446
2447     g_free(capture_opts->save_file);
2448     is_tempfile = FALSE;
2449   } else {
2450     /* we didn't had a save_file before, must be a tempfile */
2451     is_tempfile = TRUE;
2452   }
2453
2454   /* save the new filename */
2455   capture_opts->save_file = g_strdup(new_file);
2456
2457   /* if we are in real-time mode, open the new file now */
2458   if (do_dissection) {
2459     /* Attempt to open the capture file and set up to read from it. */
2460     switch(cf_open((capture_file *)cap_session->cf, capture_opts->save_file, is_tempfile, &err)) {
2461     case CF_OK:
2462       break;
2463     case CF_ERROR:
2464       /* Don't unlink (delete) the save file - leave it around,
2465          for debugging purposes. */
2466       g_free(capture_opts->save_file);
2467       capture_opts->save_file = NULL;
2468       return FALSE;
2469     }
2470   }
2471
2472   cap_session->state = CAPTURE_RUNNING;
2473
2474   return TRUE;
2475 }
2476
2477
2478 /* capture child tells us we have new packets to read */
2479 void
2480 capture_input_new_packets(capture_session *cap_session, int to_read)
2481 {
2482   gboolean      ret;
2483   int           err;
2484   gchar        *err_info;
2485   gint64        data_offset;
2486   capture_file *cf = (capture_file *)cap_session->cf;
2487   gboolean      filtering_tap_listeners;
2488   guint         tap_flags;
2489
2490 #ifdef SIGINFO
2491   /*
2492    * Prevent a SIGINFO handler from writing to the standard error while
2493    * we're doing so or writing to the standard output; instead, have it
2494    * just set a flag telling us to print that information when we're done.
2495    */
2496   infodelay = TRUE;
2497 #endif /* SIGINFO */
2498
2499   /* Do we have any tap listeners with filters? */
2500   filtering_tap_listeners = have_filtering_tap_listeners();
2501
2502   /* Get the union of the flags for all tap listeners. */
2503   tap_flags = union_of_tap_listener_flags();
2504
2505   if (do_dissection) {
2506     while (to_read-- && cf->wth) {
2507       wtap_cleareof(cf->wth);
2508       ret = wtap_read(cf->wth, &err, &err_info, &data_offset);
2509       if (ret == FALSE) {
2510         /* read from file failed, tell the capture child to stop */
2511         sync_pipe_stop(cap_session);
2512         wtap_close(cf->wth);
2513         cf->wth = NULL;
2514       } else {
2515         ret = process_packet(cf, data_offset, wtap_phdr(cf->wth),
2516                              wtap_buf_ptr(cf->wth),
2517                              filtering_tap_listeners, tap_flags);
2518       }
2519       if (ret != FALSE) {
2520         /* packet successfully read and gone through the "Read Filter" */
2521         packet_count++;
2522       }
2523     }
2524   } else {
2525     /*
2526      * Dumpcap's doing all the work; we're not doing any dissection.
2527      * Count all the packets it wrote.
2528      */
2529     packet_count += to_read;
2530   }
2531
2532   if (print_packet_counts) {
2533       /* We're printing packet counts. */
2534       if (packet_count != 0) {
2535         fprintf(stderr, "\r%u ", packet_count);
2536         /* stderr could be line buffered */
2537         fflush(stderr);
2538       }
2539   }
2540
2541 #ifdef SIGINFO
2542   /*
2543    * Allow SIGINFO handlers to write.
2544    */
2545   infodelay = FALSE;
2546
2547   /*
2548    * If a SIGINFO handler asked us to write out capture counts, do so.
2549    */
2550   if (infoprint)
2551     report_counts();
2552 #endif /* SIGINFO */
2553 }
2554
2555 static void
2556 report_counts(void)
2557 {
2558   if ((print_packet_counts == FALSE) && (really_quiet == FALSE)) {
2559     /* Report the count only if we aren't printing a packet count
2560        as packets arrive. */
2561       fprintf(stderr, "%u packet%s captured\n", packet_count,
2562             plurality(packet_count, "", "s"));
2563   }
2564 #ifdef SIGINFO
2565   infoprint = FALSE; /* we just reported it */
2566 #endif /* SIGINFO */
2567 }
2568
2569 #ifdef SIGINFO
2570 static void
2571 report_counts_siginfo(int signum _U_)
2572 {
2573   int sav_errno = errno;
2574   /* If we've been told to delay printing, just set a flag asking
2575      that we print counts (if we're supposed to), otherwise print
2576      the count of packets captured (if we're supposed to). */
2577   if (infodelay)
2578     infoprint = TRUE;
2579   else
2580     report_counts();
2581   errno = sav_errno;
2582 }
2583 #endif /* SIGINFO */
2584
2585
2586 /* capture child detected any packet drops? */
2587 void
2588 capture_input_drops(capture_session *cap_session _U_, guint32 dropped)
2589 {
2590   if (print_packet_counts) {
2591     /* We're printing packet counts to stderr.
2592        Send a newline so that we move to the line after the packet count. */
2593     fprintf(stderr, "\n");
2594   }
2595
2596   if (dropped != 0) {
2597     /* We're printing packet counts to stderr.
2598        Send a newline so that we move to the line after the packet count. */
2599     fprintf(stderr, "%u packet%s dropped\n", dropped, plurality(dropped, "", "s"));
2600   }
2601 }
2602
2603
2604 /*
2605  * Capture child closed its side of the pipe, report any error and
2606  * do the required cleanup.
2607  */
2608 void
2609 capture_input_closed(capture_session *cap_session, gchar *msg)
2610 {
2611   capture_file *cf = (capture_file *) cap_session->cf;
2612
2613   if (msg != NULL)
2614     fprintf(stderr, "tshark: %s\n", msg);
2615
2616   report_counts();
2617
2618   if (cf != NULL && cf->wth != NULL) {
2619     wtap_close(cf->wth);
2620     if (cf->is_tempfile) {
2621       ws_unlink(cf->filename);
2622     }
2623   }
2624 #ifdef USE_BROKEN_G_MAIN_LOOP
2625   /*g_main_loop_quit(loop);*/
2626   g_main_quit(loop);
2627 #else
2628   loop_running = FALSE;
2629 #endif
2630 }
2631
2632
2633
2634
2635 #ifdef _WIN32
2636 static BOOL WINAPI
2637 capture_cleanup(DWORD ctrltype _U_)
2638 {
2639   /* CTRL_C_EVENT is sort of like SIGINT, CTRL_BREAK_EVENT is unique to
2640      Windows, CTRL_CLOSE_EVENT is sort of like SIGHUP, CTRL_LOGOFF_EVENT
2641      is also sort of like SIGHUP, and CTRL_SHUTDOWN_EVENT is sort of
2642      like SIGTERM at least when the machine's shutting down.
2643
2644      For now, we handle them all as indications that we should clean up
2645      and quit, just as we handle SIGINT, SIGHUP, and SIGTERM in that
2646      way on UNIX.
2647
2648      We must return TRUE so that no other handler - such as one that would
2649      terminate the process - gets called.
2650
2651      XXX - for some reason, typing ^C to TShark, if you run this in
2652      a Cygwin console window in at least some versions of Cygwin,
2653      causes TShark to terminate immediately; this routine gets
2654      called, but the main loop doesn't get a chance to run and
2655      exit cleanly, at least if this is compiled with Microsoft Visual
2656      C++ (i.e., it's a property of the Cygwin console window or Bash;
2657      it happens if TShark is not built with Cygwin - for all I know,
2658      building it with Cygwin may make the problem go away). */
2659
2660   /* tell the capture child to stop */
2661   sync_pipe_stop(&global_capture_session);
2662
2663   /* don't stop our own loop already here, otherwise status messages and
2664    * cleanup wouldn't be done properly. The child will indicate the stop of
2665    * everything by calling capture_input_closed() later */
2666
2667   return TRUE;
2668 }
2669 #else
2670 static void
2671 capture_cleanup(int signum _U_)
2672 {
2673   /* tell the capture child to stop */
2674   sync_pipe_stop(&global_capture_session);
2675
2676   /* don't stop our own loop already here, otherwise status messages and
2677    * cleanup wouldn't be done properly. The child will indicate the stop of
2678    * everything by calling capture_input_closed() later */
2679 }
2680 #endif /* _WIN32 */
2681 #endif /* HAVE_LIBPCAP */
2682
2683 static gboolean
2684 process_packet_first_pass(capture_file *cf,
2685                gint64 offset, struct wtap_pkthdr *whdr,
2686                const guchar *pd)
2687 {
2688   frame_data     fdlocal;
2689   guint32        framenum;
2690   gboolean       create_proto_tree = FALSE;
2691   epan_dissect_t edt;
2692   gboolean       passed;
2693
2694   /* The frame number of this packet is one more than the count of
2695      frames in this packet. */
2696   framenum = cf->count + 1;
2697
2698   /* If we're not running a display filter and we're not printing any
2699      packet information, we don't need to do a dissection. This means
2700      that all packets can be marked as 'passed'. */
2701   passed = TRUE;
2702
2703   frame_data_init(&fdlocal, framenum, whdr, offset, cum_bytes);
2704
2705   /* If we're going to print packet information, or we're going to
2706      run a read filter, or display filter, or we're going to process taps, set up to
2707      do a dissection and do so. */
2708   if (do_dissection) {
2709     if (gbl_resolv_flags.mac_name || gbl_resolv_flags.network_name ||
2710         gbl_resolv_flags.transport_name || gbl_resolv_flags.concurrent_dns)
2711       /* Grab any resolved addresses */
2712       host_name_lookup_process();
2713
2714     /* If we're going to be applying a filter, we'll need to
2715        create a protocol tree against which to apply the filter. */
2716     if (cf->rfcode)
2717       create_proto_tree = TRUE;
2718
2719     /* We're not going to display the protocol tree on this pass,
2720        so it's not going to be "visible". */
2721     epan_dissect_init(&edt, cf->epan, create_proto_tree, FALSE);
2722
2723     /* If we're running a read filter, prime the epan_dissect_t with that
2724        filter. */
2725     if (cf->rfcode)
2726       epan_dissect_prime_dfilter(&edt, cf->rfcode);
2727
2728     frame_data_set_before_dissect(&fdlocal, &cf->elapsed_time,
2729                                   &ref, prev_dis);
2730     if (ref == &fdlocal) {
2731       ref_frame = fdlocal;
2732       ref = &ref_frame;
2733     }
2734
2735     epan_dissect_run(&edt, whdr, frame_tvbuff_new(&fdlocal, pd), &fdlocal, NULL);
2736
2737     /* Run the read filter if we have one. */
2738     if (cf->rfcode)
2739       passed = dfilter_apply_edt(cf->rfcode, &edt);
2740   }
2741
2742   if (passed) {
2743     frame_data_set_after_dissect(&fdlocal, &cum_bytes);
2744     prev_cap = prev_dis = frame_data_sequence_add(cf->frames, &fdlocal);
2745
2746     /* If we're not doing dissection then there won't be any dependent frames.
2747      * More importantly, edt.pi.dependent_frames won't be initialized because
2748      * epan hasn't been initialized.
2749      */
2750     if (do_dissection) {
2751       g_slist_foreach(edt.pi.dependent_frames, find_and_mark_frame_depended_upon, cf->frames);
2752     }
2753
2754     cf->count++;
2755   } else {
2756     /* if we don't add it to the frame_data_sequence, clean it up right now
2757      * to avoid leaks */
2758     frame_data_destroy(&fdlocal);
2759   }
2760
2761   if (do_dissection)
2762     epan_dissect_cleanup(&edt);
2763
2764   return passed;
2765 }
2766
2767 static gboolean
2768 process_packet_second_pass(capture_file *cf, frame_data *fdata,
2769                struct wtap_pkthdr *phdr, Buffer *buf,
2770                gboolean filtering_tap_listeners, guint tap_flags)
2771 {
2772   gboolean        create_proto_tree;
2773   column_info    *cinfo;
2774   epan_dissect_t  edt;
2775   gboolean        passed;
2776
2777   /* If we're not running a display filter and we're not printing any
2778      packet information, we don't need to do a dissection. This means
2779      that all packets can be marked as 'passed'. */
2780   passed = TRUE;
2781
2782   /* If we're going to print packet information, or we're going to
2783      run a read filter, or we're going to process taps, set up to
2784      do a dissection and do so. */
2785   if (do_dissection) {
2786     if (gbl_resolv_flags.mac_name || gbl_resolv_flags.network_name ||
2787         gbl_resolv_flags.transport_name || gbl_resolv_flags.concurrent_dns)
2788       /* Grab any resolved addresses */
2789       host_name_lookup_process();
2790
2791     if (cf->dfcode || print_details || filtering_tap_listeners ||
2792         (tap_flags & TL_REQUIRES_PROTO_TREE) || have_custom_cols(&cf->cinfo))
2793       create_proto_tree = TRUE;
2794     else
2795       create_proto_tree = FALSE;
2796
2797     /* The protocol tree will be "visible", i.e., printed, only if we're
2798        printing packet details, which is true if we're printing stuff
2799        ("print_packet_info" is true) and we're in verbose mode
2800        ("packet_details" is true). */
2801     epan_dissect_init(&edt, cf->epan, create_proto_tree, print_packet_info && print_details);
2802
2803     /* If we're running a display filter, prime the epan_dissect_t with that
2804        filter. */
2805     if (cf->dfcode)
2806       epan_dissect_prime_dfilter(&edt, cf->dfcode);
2807
2808     col_custom_prime_edt(&edt, &cf->cinfo);
2809
2810     /* We only need the columns if either
2811          1) some tap needs the columns
2812        or
2813          2) we're printing packet info but we're *not* verbose; in verbose
2814             mode, we print the protocol tree, not the protocol summary.
2815      */
2816     if ((tap_flags & TL_REQUIRES_COLUMNS) || (print_packet_info && print_summary))
2817       cinfo = &cf->cinfo;
2818     else
2819       cinfo = NULL;
2820
2821     frame_data_set_before_dissect(fdata, &cf->elapsed_time,
2822                                   &ref, prev_dis);
2823     if (ref == fdata) {
2824       ref_frame = *fdata;
2825       ref = &ref_frame;
2826     }
2827
2828     epan_dissect_run_with_taps(&edt, phdr, frame_tvbuff_new_buffer(fdata, buf), fdata, cinfo);
2829
2830     /* Run the read/display filter if we have one. */
2831     if (cf->dfcode)
2832       passed = dfilter_apply_edt(cf->dfcode, &edt);
2833   }
2834
2835   if (passed) {
2836     frame_data_set_after_dissect(fdata, &cum_bytes);
2837     /* Process this packet. */
2838     if (print_packet_info) {
2839       /* We're printing packet information; print the information for
2840          this packet. */
2841       if (do_dissection)
2842         print_packet(cf, &edt);
2843       else
2844         print_packet(cf, NULL);
2845
2846       /* The ANSI C standard does not appear to *require* that a line-buffered
2847          stream be flushed to the host environment whenever a newline is
2848          written, it just says that, on such a stream, characters "are
2849          intended to be transmitted to or from the host environment as a
2850          block when a new-line character is encountered".
2851
2852          The Visual C++ 6.0 C implementation doesn't do what is intended;
2853          even if you set a stream to be line-buffered, it still doesn't
2854          flush the buffer at the end of every line.
2855
2856          So, if the "-l" flag was specified, we flush the standard output
2857          at the end of a packet.  This will do the right thing if we're
2858          printing packet summary lines, and, as we print the entire protocol
2859          tree for a single packet without waiting for anything to happen,
2860          it should be as good as line-buffered mode if we're printing
2861          protocol trees.  (The whole reason for the "-l" flag in either
2862          tcpdump or TShark is to allow the output of a live capture to
2863          be piped to a program or script and to have that script see the
2864          information for the packet as soon as it's printed, rather than
2865          having to wait until a standard I/O buffer fills up. */
2866       if (line_buffered)
2867         fflush(stdout);
2868
2869       if (ferror(stdout)) {
2870         show_print_file_io_error(errno);
2871         exit(2);
2872       }
2873     }
2874     prev_dis = fdata;
2875   }
2876   prev_cap = fdata;
2877
2878   if (do_dissection) {
2879     epan_dissect_cleanup(&edt);
2880   }
2881   return passed || fdata->flags.dependent_of_displayed;
2882 }
2883
2884 static int
2885 load_cap_file(capture_file *cf, char *save_file, int out_file_type,
2886     gboolean out_file_name_res, int max_packet_count, gint64 max_byte_count)
2887 {
2888   gint         linktype;
2889   int          snapshot_length;
2890   wtap_dumper *pdh;
2891   guint32      framenum;
2892   int          err;
2893   gchar       *err_info = NULL;
2894   gint64       data_offset;
2895   char        *save_file_string = NULL;
2896   gboolean     filtering_tap_listeners;
2897   guint        tap_flags;
2898   wtapng_section_t            *shb_hdr;
2899   wtapng_iface_descriptions_t *idb_inf;
2900   char         appname[100];
2901   Buffer       buf;
2902
2903   shb_hdr = wtap_file_get_shb_info(cf->wth);
2904   idb_inf = wtap_file_get_idb_info(cf->wth);
2905 #ifdef PCAP_NG_DEFAULT
2906   if (idb_inf->number_of_interfaces > 1) {
2907     linktype = WTAP_ENCAP_PER_PACKET;
2908   } else {
2909     linktype = wtap_file_encap(cf->wth);
2910   }
2911 #else
2912   linktype = wtap_file_encap(cf->wth);
2913 #endif
2914   if (save_file != NULL) {
2915     /* Get a string that describes what we're writing to */
2916     save_file_string = output_file_description(save_file);
2917
2918     /* Set up to write to the capture file. */
2919     snapshot_length = wtap_snapshot_length(cf->wth);
2920     if (snapshot_length == 0) {
2921       /* Snapshot length of input file not known. */
2922       snapshot_length = WTAP_MAX_PACKET_SIZE;
2923     }
2924     /* If we don't have an application name add Tshark */
2925     if (shb_hdr->shb_user_appl == NULL) {
2926         g_snprintf(appname, sizeof(appname), "TShark " VERSION "%s", wireshark_svnversion);
2927         shb_hdr->shb_user_appl = appname;
2928     }
2929
2930     if (linktype != WTAP_ENCAP_PER_PACKET && out_file_type == WTAP_FILE_PCAP)
2931         pdh = wtap_dump_open(save_file, out_file_type, linktype,
2932             snapshot_length, FALSE /* compressed */, &err);
2933     else
2934         pdh = wtap_dump_open_ng(save_file, out_file_type, linktype,
2935             snapshot_length, FALSE /* compressed */, shb_hdr, idb_inf, &err);
2936
2937     g_free(idb_inf);
2938     idb_inf = NULL;
2939
2940     if (pdh == NULL) {
2941       /* We couldn't set up to write to the capture file. */
2942       switch (err) {
2943
2944       case WTAP_ERR_UNSUPPORTED_FILE_TYPE:
2945         cmdarg_err("Capture files can't be written in that format.");
2946         break;
2947
2948       case WTAP_ERR_UNSUPPORTED_ENCAP:
2949       case WTAP_ERR_ENCAP_PER_PACKET_UNSUPPORTED:
2950         cmdarg_err("The capture file being read can't be written as a "
2951           "\"%s\" file.", wtap_file_type_short_string(out_file_type));
2952         break;
2953
2954       case WTAP_ERR_CANT_OPEN:
2955         cmdarg_err("The %s couldn't be created for some "
2956           "unknown reason.", save_file_string);
2957         break;
2958
2959       case WTAP_ERR_SHORT_WRITE:
2960         cmdarg_err("A full header couldn't be written to the %s.",
2961                    save_file_string);
2962         break;
2963
2964       default:
2965         cmdarg_err("The %s could not be created: %s.", save_file_string,
2966                    wtap_strerror(err));
2967         break;
2968       }
2969       goto out;
2970     }
2971   } else {
2972     if (print_packet_info) {
2973       if (!write_preamble(cf)) {
2974         err = errno;
2975         show_print_file_io_error(err);
2976         goto out;
2977       }
2978     }
2979     pdh = NULL;
2980   }
2981
2982   if (pdh && out_file_name_res) {
2983     if (!wtap_dump_set_addrinfo_list(pdh, get_addrinfo_list())) {
2984       cmdarg_err("The file format \"%s\" doesn't support name resolution information.",
2985                  wtap_file_type_short_string(out_file_type));
2986     }
2987   }
2988
2989   /* Do we have any tap listeners with filters? */
2990   filtering_tap_listeners = have_filtering_tap_listeners();
2991
2992   /* Get the union of the flags for all tap listeners. */
2993   tap_flags = union_of_tap_listener_flags();
2994
2995   if (perform_two_pass_analysis) {
2996     frame_data *fdata;
2997     int old_max_packet_count = max_packet_count;
2998
2999     /* Allocate a frame_data_sequence for all the frames. */
3000     cf->frames = new_frame_data_sequence();
3001
3002     while (wtap_read(cf->wth, &err, &err_info, &data_offset)) {
3003       if (process_packet_first_pass(cf, data_offset, wtap_phdr(cf->wth),
3004                          wtap_buf_ptr(cf->wth))) {
3005         /* Stop reading if we have the maximum number of packets;
3006          * When the -c option has not been used, max_packet_count
3007          * starts at 0, which practically means, never stop reading.
3008          * (unless we roll over max_packet_count ?)
3009          */
3010         if ( (--max_packet_count == 0) || (max_byte_count != 0 && data_offset >= max_byte_count)) {
3011           err = 0; /* This is not an error */
3012           break;
3013         }
3014       }
3015     }
3016
3017     /* Close the sequential I/O side, to free up memory it requires. */
3018     wtap_sequential_close(cf->wth);
3019
3020     /* Allow the protocol dissectors to free up memory that they
3021      * don't need after the sequential run-through of the packets. */
3022     postseq_cleanup_all_protocols();
3023
3024     max_packet_count = old_max_packet_count;
3025
3026     prev_dis = NULL;
3027     prev_cap = NULL;
3028     buffer_init(&buf, 1500);
3029     for (framenum = 1; err == 0 && framenum <= cf->count; framenum++) {
3030       fdata = frame_data_sequence_find(cf->frames, framenum);
3031       if (wtap_seek_read(cf->wth, fdata->file_off, &cf->phdr,
3032           &buf, fdata->cap_len, &err, &err_info)) {
3033         if (process_packet_second_pass(cf, fdata, &cf->phdr, &buf,
3034                                        filtering_tap_listeners, tap_flags)) {
3035           /* Either there's no read filtering or this packet passed the
3036              filter, so, if we're writing to a capture file, write
3037              this packet out. */
3038           if (pdh != NULL) {
3039             if (!wtap_dump(pdh, &cf->phdr, buffer_start_ptr(&cf->buf), &err)) {
3040               /* Error writing to a capture file */
3041               switch (err) {
3042
3043               case WTAP_ERR_UNSUPPORTED_ENCAP:
3044                 /*
3045                  * This is a problem with the particular frame we're writing;
3046                  * note that, and give the frame number.
3047                  *
3048                  * XXX - framenum is not necessarily the frame number in
3049                  * the input file if there was a read filter.
3050                  */
3051                 fprintf(stderr,
3052                         "Frame %u of \"%s\" has a network type that can't be saved in a \"%s\" file.\n",
3053                         framenum, cf->filename,
3054                         wtap_file_type_short_string(out_file_type));
3055                 break;
3056
3057               default:
3058                 show_capture_file_io_error(save_file, err, FALSE);
3059                 break;
3060               }
3061               wtap_dump_close(pdh, &err);
3062               g_free(shb_hdr);
3063               exit(2);
3064             }
3065           }
3066           /* Stop reading if we have the maximum number of packets;
3067            * When the -c option has not been used, max_packet_count
3068            * starts at 0, which practically means, never stop reading.
3069            * (unless we roll over max_packet_count ?)
3070            */
3071           if ( (--max_packet_count == 0) || (max_byte_count != 0 && data_offset >= max_byte_count)) {
3072             err = 0; /* This is not an error */
3073             break;
3074           }
3075         }
3076       }
3077     }
3078     buffer_free(&buf);
3079   }
3080   else {
3081     framenum = 0;
3082     while (wtap_read(cf->wth, &err, &err_info, &data_offset)) {
3083       framenum++;
3084
3085       if (process_packet(cf, data_offset, wtap_phdr(cf->wth),
3086                          wtap_buf_ptr(cf->wth),
3087                          filtering_tap_listeners, tap_flags)) {
3088         /* Either there's no read filtering or this packet passed the
3089            filter, so, if we're writing to a capture file, write
3090            this packet out. */
3091         if (pdh != NULL) {
3092           if (!wtap_dump(pdh, wtap_phdr(cf->wth), wtap_buf_ptr(cf->wth), &err)) {
3093             /* Error writing to a capture file */
3094             switch (err) {
3095
3096             case WTAP_ERR_UNSUPPORTED_ENCAP:
3097               /*
3098                * This is a problem with the particular frame we're writing;
3099                * note that, and give the frame number.
3100                */
3101               fprintf(stderr,
3102                       "Frame %u of \"%s\" has a network type that can't be saved in a \"%s\" file.\n",
3103                       framenum, cf->filename,
3104                       wtap_file_type_short_string(out_file_type));
3105               break;
3106
3107             default:
3108               show_capture_file_io_error(save_file, err, FALSE);
3109               break;
3110             }
3111             wtap_dump_close(pdh, &err);
3112             g_free(shb_hdr);
3113             exit(2);
3114           }
3115         }
3116         /* Stop reading if we have the maximum number of packets;
3117          * When the -c option has not been used, max_packet_count
3118          * starts at 0, which practically means, never stop reading.
3119          * (unless we roll over max_packet_count ?)
3120          */
3121         if ( (--max_packet_count == 0) || (max_byte_count != 0 && data_offset >= max_byte_count)) {
3122           err = 0; /* This is not an error */
3123           break;
3124         }
3125       }
3126     }
3127   }
3128
3129   if (err != 0) {
3130     /*
3131      * Print a message noting that the read failed somewhere along the line.
3132      *
3133      * If we're printing packet data, and the standard output and error are
3134      * going to the same place, flush the standard output, so everything
3135      * buffered up is written, and then print a newline to the standard error
3136      * before printing the error message, to separate it from the packet
3137      * data.  (Alas, that only works on UN*X; st_dev is meaningless, and
3138      * the _fstat() documentation at Microsoft doesn't indicate whether
3139      * st_ino is even supported.)
3140      */
3141 #ifndef _WIN32
3142     if (print_packet_info) {
3143       struct stat stat_stdout, stat_stderr;
3144
3145       if (fstat(1, &stat_stdout) == 0 && fstat(2, &stat_stderr) == 0) {
3146         if (stat_stdout.st_dev == stat_stderr.st_dev &&
3147             stat_stdout.st_ino == stat_stderr.st_ino) {
3148           fflush(stdout);
3149           fprintf(stderr, "\n");
3150         }
3151       }
3152     }
3153 #endif
3154     switch (err) {
3155
3156     case WTAP_ERR_UNSUPPORTED:
3157       cmdarg_err("The file \"%s\" contains record data that TShark doesn't support.\n(%s)",
3158                  cf->filename, err_info);
3159       g_free(err_info);
3160       break;
3161
3162     case WTAP_ERR_UNSUPPORTED_ENCAP:
3163       cmdarg_err("The file \"%s\" has a packet with a network type that TShark doesn't support.\n(%s)",
3164                  cf->filename, err_info);
3165       g_free(err_info);
3166       break;
3167
3168     case WTAP_ERR_CANT_READ:
3169       cmdarg_err("An attempt to read from the file \"%s\" failed for some unknown reason.",
3170                  cf->filename);
3171       break;
3172
3173     case WTAP_ERR_SHORT_READ:
3174       cmdarg_err("The file \"%s\" appears to have been cut short in the middle of a packet.",
3175                  cf->filename);
3176       break;
3177
3178     case WTAP_ERR_BAD_FILE:
3179       cmdarg_err("The file \"%s\" appears to be damaged or corrupt.\n(%s)",
3180                  cf->filename, err_info);
3181       g_free(err_info);
3182       break;
3183
3184     case WTAP_ERR_DECOMPRESS:
3185       cmdarg_err("The compressed file \"%s\" appears to be damaged or corrupt.\n"
3186                  "(%s)", cf->filename, err_info);
3187       break;
3188
3189     default:
3190       cmdarg_err("An error occurred while reading the file \"%s\": %s.",
3191                  cf->filename, wtap_strerror(err));
3192       break;
3193     }
3194     if (save_file != NULL) {
3195       /* Now close the capture file. */
3196       if (!wtap_dump_close(pdh, &err))
3197         show_capture_file_io_error(save_file, err, TRUE);
3198     }
3199   } else {
3200     if (save_file != NULL) {
3201       /* Now close the capture file. */
3202       if (!wtap_dump_close(pdh, &err))
3203         show_capture_file_io_error(save_file, err, TRUE);
3204     } else {
3205       if (print_packet_info) {
3206         if (!write_finale()) {
3207           err = errno;
3208           show_print_file_io_error(err);
3209         }
3210       }
3211     }
3212   }
3213
3214 out:
3215   wtap_close(cf->wth);
3216   cf->wth = NULL;
3217
3218   g_free(save_file_string);
3219   g_free(shb_hdr);
3220
3221   return err;
3222 }
3223
3224 static gboolean
3225 process_packet(capture_file *cf, gint64 offset, struct wtap_pkthdr *whdr,
3226                const guchar *pd,
3227                gboolean filtering_tap_listeners, guint tap_flags)
3228 {
3229   frame_data      fdata;
3230   gboolean        create_proto_tree;
3231   column_info    *cinfo;
3232   epan_dissect_t  edt;
3233   gboolean        passed;
3234
3235   /* Count this packet. */
3236   cf->count++;
3237
3238   /* If we're not running a display filter and we're not printing any
3239      packet information, we don't need to do a dissection. This means
3240      that all packets can be marked as 'passed'. */
3241   passed = TRUE;
3242
3243   frame_data_init(&fdata, cf->count, whdr, offset, cum_bytes);
3244
3245   /* If we're going to print packet information, or we're going to
3246      run a read filter, or we're going to process taps, set up to
3247      do a dissection and do so. */
3248   if (do_dissection) {
3249     if (print_packet_info && (gbl_resolv_flags.mac_name || gbl_resolv_flags.network_name ||
3250         gbl_resolv_flags.transport_name || gbl_resolv_flags.concurrent_dns))
3251       /* Grab any resolved addresses */
3252       host_name_lookup_process();
3253
3254     if (cf->rfcode || cf->dfcode || print_details || filtering_tap_listeners ||
3255         (tap_flags & TL_REQUIRES_PROTO_TREE) || have_custom_cols(&cf->cinfo))
3256       create_proto_tree = TRUE;
3257     else
3258       create_proto_tree = FALSE;
3259
3260     /* The protocol tree will be "visible", i.e., printed, only if we're
3261        printing packet details, which is true if we're printing stuff
3262        ("print_packet_info" is true) and we're in verbose mode
3263        ("packet_details" is true). */
3264     epan_dissect_init(&edt, cf->epan, create_proto_tree, print_packet_info && print_details);
3265
3266     /* If we're running a filter, prime the epan_dissect_t with that
3267        filter. */
3268     if (cf->rfcode)
3269       epan_dissect_prime_dfilter(&edt, cf->rfcode);
3270     if (cf->dfcode)
3271       epan_dissect_prime_dfilter(&edt, cf->dfcode);
3272
3273     col_custom_prime_edt(&edt, &cf->cinfo);
3274
3275     /* We only need the columns if either
3276          1) some tap needs the columns
3277        or
3278          2) we're printing packet info but we're *not* verbose; in verbose
3279             mode, we print the protocol tree, not the protocol summary.
3280        or
3281          3) there is a column mapped as an individual field */
3282     if ((tap_flags & TL_REQUIRES_COLUMNS) || (print_packet_info && print_summary) || output_fields_has_cols(output_fields))
3283       cinfo = &cf->cinfo;
3284     else
3285       cinfo = NULL;
3286
3287     frame_data_set_before_dissect(&fdata, &cf->elapsed_time,
3288                                   &ref, prev_dis);
3289     if (ref == &fdata) {
3290       ref_frame = fdata;
3291       ref = &ref_frame;
3292     }
3293
3294     epan_dissect_run_with_taps(&edt, whdr, frame_tvbuff_new(&fdata, pd), &fdata, cinfo);
3295
3296     /* Run the filters if we have them. */
3297     if (cf->rfcode)
3298       passed = dfilter_apply_edt(cf->rfcode, &edt);
3299     if (passed && cf->dfcode)
3300       passed = dfilter_apply_edt(cf->dfcode, &edt);
3301   }
3302
3303   if (passed) {
3304     frame_data_set_after_dissect(&fdata, &cum_bytes);
3305
3306     /* Process this packet. */
3307     if (print_packet_info) {
3308       /* We're printing packet information; print the information for
3309          this packet. */
3310       if (do_dissection)
3311         print_packet(cf, &edt);
3312       else
3313         print_packet(cf, NULL);
3314
3315       /* The ANSI C standard does not appear to *require* that a line-buffered
3316          stream be flushed to the host environment whenever a newline is
3317          written, it just says that, on such a stream, characters "are
3318          intended to be transmitted to or from the host environment as a
3319          block when a new-line character is encountered".
3320
3321          The Visual C++ 6.0 C implementation doesn't do what is intended;
3322          even if you set a stream to be line-buffered, it still doesn't
3323          flush the buffer at the end of every line.
3324
3325          So, if the "-l" flag was specified, we flush the standard output
3326          at the end of a packet.  This will do the right thing if we're
3327          printing packet summary lines, and, as we print the entire protocol
3328          tree for a single packet without waiting for anything to happen,
3329          it should be as good as line-buffered mode if we're printing
3330          protocol trees.  (The whole reason for the "-l" flag in either
3331          tcpdump or TShark is to allow the output of a live capture to
3332          be piped to a program or script and to have that script see the
3333          information for the packet as soon as it's printed, rather than
3334          having to wait until a standard I/O buffer fills up. */
3335       if (line_buffered)
3336         fflush(stdout);
3337
3338       if (ferror(stdout)) {
3339         show_print_file_io_error(errno);
3340         exit(2);
3341       }
3342     }
3343
3344     /* this must be set after print_packet() [bug #8160] */
3345     prev_dis_frame = fdata;
3346     prev_dis = &prev_dis_frame;
3347   }
3348
3349   prev_cap_frame = fdata;
3350   prev_cap = &prev_cap_frame;
3351
3352   if (do_dissection) {
3353     epan_dissect_cleanup(&edt);
3354     frame_data_destroy(&fdata);
3355   }
3356   return passed;
3357 }
3358
3359 static gboolean
3360 write_preamble(capture_file *cf)
3361 {
3362   switch (output_action) {
3363
3364   case WRITE_TEXT:
3365     return print_preamble(print_stream, cf ? cf->filename : NULL, wireshark_svnversion);
3366
3367   case WRITE_XML:
3368     if (print_details)
3369       write_pdml_preamble(stdout, cf ? cf->filename : NULL);
3370     else
3371       write_psml_preamble(stdout);
3372     return !ferror(stdout);
3373
3374   case WRITE_FIELDS:
3375     write_fields_preamble(output_fields, stdout);
3376     return !ferror(stdout);
3377
3378   default:
3379     g_assert_not_reached();
3380     return FALSE;
3381   }
3382 }
3383
3384 static char *
3385 get_line_buf(size_t len)
3386 {
3387   static char   *line_bufp    = NULL;
3388   static size_t  line_buf_len = 256;
3389   size_t         new_line_buf_len;
3390
3391   for (new_line_buf_len = line_buf_len; len > new_line_buf_len;
3392        new_line_buf_len *= 2)
3393     ;
3394   if (line_bufp == NULL) {
3395     line_buf_len = new_line_buf_len;
3396     line_bufp = (char *)g_malloc(line_buf_len + 1);
3397   } else {
3398     if (new_line_buf_len > line_buf_len) {
3399       line_buf_len = new_line_buf_len;
3400       line_bufp = (char *)g_realloc(line_bufp, line_buf_len + 1);
3401     }
3402   }
3403   return line_bufp;
3404 }
3405
3406 static gboolean
3407 print_columns(capture_file *cf)
3408 {
3409   char   *line_bufp;
3410   int     i;
3411   size_t  buf_offset;
3412   size_t  column_len;
3413
3414   line_bufp = get_line_buf(256);
3415   buf_offset = 0;
3416   *line_bufp = '\0';
3417   for (i = 0; i < cf->cinfo.num_cols; i++) {
3418     /* Skip columns not marked as visible. */
3419     if (!get_column_visible(i))
3420       continue;
3421     switch (cf->cinfo.col_fmt[i]) {
3422     case COL_NUMBER:
3423 #ifdef HAVE_LIBPCAP
3424       /*
3425        * Don't print this if we're doing a live capture from a network
3426        * interface - if we're doing a live capture, you won't be
3427        * able to look at the capture in the future (it's not being
3428        * saved anywhere), so the frame numbers are unlikely to be
3429        * useful.
3430        *
3431        * (XXX - it might be nice to be able to save and print at
3432        * the same time, sort of like an "Update list of packets
3433        * in real time" capture in Wireshark.)
3434        */
3435       if (global_capture_opts.ifaces->len > 0)
3436         continue;
3437 #endif
3438       column_len = strlen(cf->cinfo.col_data[i]);
3439       if (column_len < 3)
3440         column_len = 3;
3441       line_bufp = get_line_buf(buf_offset + column_len);
3442       g_snprintf(line_bufp + buf_offset, (int)column_len + 1, "%3s", cf->cinfo.col_data[i]);
3443       break;
3444
3445     case COL_CLS_TIME:
3446     case COL_REL_TIME:
3447     case COL_ABS_TIME:
3448     case COL_ABS_DATE_TIME:
3449     case COL_UTC_TIME:
3450     case COL_UTC_DATE_TIME: /* XXX - wider */
3451       column_len = strlen(cf->cinfo.col_data[i]);
3452       if (column_len < 10)
3453         column_len = 10;
3454       line_bufp = get_line_buf(buf_offset + column_len);
3455       g_snprintf(line_bufp + buf_offset, (int)column_len + 1, "%10s", cf->cinfo.col_data[i]);
3456       break;
3457
3458     case COL_DEF_SRC:
3459     case COL_RES_SRC:
3460     case COL_UNRES_SRC:
3461     case COL_DEF_DL_SRC:
3462     case COL_RES_DL_SRC:
3463     case COL_UNRES_DL_SRC:
3464     case COL_DEF_NET_SRC:
3465     case COL_RES_NET_SRC:
3466     case COL_UNRES_NET_SRC:
3467       column_len = strlen(cf->cinfo.col_data[i]);
3468       if (column_len < 12)
3469         column_len = 12;
3470       line_bufp = get_line_buf(buf_offset + column_len);
3471       g_snprintf(line_bufp + buf_offset, (int)column_len + 1, "%12s", cf->cinfo.col_data[i]);
3472       break;
3473
3474     case COL_DEF_DST:
3475     case COL_RES_DST:
3476     case COL_UNRES_DST:
3477     case COL_DEF_DL_DST:
3478     case COL_RES_DL_DST:
3479     case COL_UNRES_DL_DST:
3480     case COL_DEF_NET_DST:
3481     case COL_RES_NET_DST:
3482     case COL_UNRES_NET_DST:
3483       column_len = strlen(cf->cinfo.col_data[i]);
3484       if (column_len < 12)
3485         column_len = 12;
3486       line_bufp = get_line_buf(buf_offset + column_len);
3487       g_snprintf(line_bufp + buf_offset, (int)column_len + 1, "%-12s", cf->cinfo.col_data[i]);
3488       break;
3489
3490     default:
3491       column_len = strlen(cf->cinfo.col_data[i]);
3492       line_bufp = get_line_buf(buf_offset + column_len);
3493       g_strlcat(line_bufp + buf_offset, cf->cinfo.col_data[i], column_len + 1);
3494       break;
3495     }
3496     buf_offset += column_len;
3497     if (i != cf->cinfo.num_cols - 1) {
3498       /*
3499        * This isn't the last column, so we need to print a
3500        * separator between this column and the next.
3501        *
3502        * If we printed a network source and are printing a
3503        * network destination of the same type next, separate
3504        * them with " -> "; if we printed a network destination
3505        * and are printing a network source of the same type
3506        * next, separate them with " <- "; otherwise separate them
3507        * with a space.
3508        *
3509        * We add enough space to the buffer for " <- " or " -> ",
3510        * even if we're only adding " ".
3511        */
3512       line_bufp = get_line_buf(buf_offset + 4);
3513       switch (cf->cinfo.col_fmt[i]) {
3514
3515       case COL_DEF_SRC:
3516       case COL_RES_SRC:
3517       case COL_UNRES_SRC:
3518         switch (cf->cinfo.col_fmt[i + 1]) {
3519
3520         case COL_DEF_DST:
3521         case COL_RES_DST:
3522         case COL_UNRES_DST:
3523           g_strlcat(line_bufp + buf_offset, " -> ", 5);
3524           buf_offset += 4;
3525           break;
3526
3527         default:
3528           g_strlcat(line_bufp + buf_offset, " ", 5);
3529           buf_offset += 1;
3530           break;
3531         }
3532         break;
3533
3534       case COL_DEF_DL_SRC:
3535       case COL_RES_DL_SRC:
3536       case COL_UNRES_DL_SRC:
3537         switch (cf->cinfo.col_fmt[i + 1]) {
3538
3539         case COL_DEF_DL_DST:
3540         case COL_RES_DL_DST:
3541         case COL_UNRES_DL_DST:
3542           g_strlcat(line_bufp + buf_offset, " -> ", 5);
3543           buf_offset += 4;
3544           break;
3545
3546         default:
3547           g_strlcat(line_bufp + buf_offset, " ", 5);
3548           buf_offset += 1;
3549           break;
3550         }
3551         break;
3552
3553       case COL_DEF_NET_SRC:
3554       case COL_RES_NET_SRC:
3555       case COL_UNRES_NET_SRC:
3556         switch (cf->cinfo.col_fmt[i + 1]) {
3557
3558         case COL_DEF_NET_DST:
3559         case COL_RES_NET_DST:
3560         case COL_UNRES_NET_DST:
3561           g_strlcat(line_bufp + buf_offset, " -> ", 5);
3562           buf_offset += 4;
3563           break;
3564
3565         default:
3566           g_strlcat(line_bufp + buf_offset, " ", 5);
3567           buf_offset += 1;
3568           break;
3569         }
3570         break;
3571
3572       case COL_DEF_DST:
3573       case COL_RES_DST:
3574       case COL_UNRES_DST:
3575         switch (cf->cinfo.col_fmt[i + 1]) {
3576
3577         case COL_DEF_SRC:
3578         case COL_RES_SRC:
3579         case COL_UNRES_SRC:
3580           g_strlcat(line_bufp + buf_offset, " <- ", 5);
3581           buf_offset += 4;
3582           break;
3583
3584         default:
3585           g_strlcat(line_bufp + buf_offset, " ", 5);
3586           buf_offset += 1;
3587           break;
3588         }
3589         break;
3590
3591       case COL_DEF_DL_DST:
3592       case COL_RES_DL_DST:
3593       case COL_UNRES_DL_DST:
3594         switch (cf->cinfo.col_fmt[i + 1]) {
3595
3596         case COL_DEF_DL_SRC:
3597         case COL_RES_DL_SRC:
3598         case COL_UNRES_DL_SRC:
3599           g_strlcat(line_bufp + buf_offset, " <- ", 5);
3600           buf_offset += 4;
3601           break;
3602
3603         default:
3604           g_strlcat(line_bufp + buf_offset, " ", 5);
3605           buf_offset += 1;
3606           break;
3607         }
3608         break;
3609
3610       case COL_DEF_NET_DST:
3611       case COL_RES_NET_DST:
3612       case COL_UNRES_NET_DST:
3613         switch (cf->cinfo.col_fmt[i + 1]) {
3614
3615         case COL_DEF_NET_SRC:
3616         case COL_RES_NET_SRC:
3617         case COL_UNRES_NET_SRC:
3618           g_strlcat(line_bufp + buf_offset, " <- ", 5);
3619           buf_offset += 4;
3620           break;
3621
3622         default:
3623           g_strlcat(line_bufp + buf_offset, " ", 5);
3624           buf_offset += 1;
3625           break;
3626         }
3627         break;
3628
3629       default:
3630         g_strlcat(line_bufp + buf_offset, " ", 5);
3631         buf_offset += 1;
3632         break;
3633       }
3634     }
3635   }
3636   return print_line(print_stream, 0, line_bufp);
3637 }
3638
3639 static gboolean
3640 print_packet(capture_file *cf, epan_dissect_t *edt)
3641 {
3642   print_args_t print_args;
3643
3644   if (print_summary || output_fields_has_cols(output_fields)) {
3645     /* Just fill in the columns. */
3646     epan_dissect_fill_in_columns(edt, FALSE, TRUE);
3647
3648     if (print_summary) {
3649       /* Now print them. */
3650       switch (output_action) {
3651
3652       case WRITE_TEXT:
3653         if (!print_columns(cf))
3654           return FALSE;
3655         break;
3656
3657       case WRITE_XML:
3658         proto_tree_write_psml(edt, stdout);
3659         return !ferror(stdout);
3660       case WRITE_FIELDS: /*No non-verbose "fields" format */
3661         g_assert_not_reached();
3662         break;
3663       }
3664     }
3665   }
3666   if (print_details) {
3667     /* Print the information in the protocol tree. */
3668     switch (output_action) {
3669
3670     case WRITE_TEXT:
3671       /* Only initialize the fields that are actually used in proto_tree_print.
3672        * This is particularly important for .range, as that's heap memory which
3673        * we would otherwise have to g_free().
3674       print_args.to_file = TRUE;
3675       print_args.format = print_format;
3676       print_args.print_summary = print_summary;
3677       print_args.print_formfeed = FALSE;
3678       packet_range_init(&print_args.range, &cfile);
3679       */
3680       print_args.print_hex = print_hex;
3681       print_args.print_dissections = print_details ? print_dissections_expanded : print_dissections_none;
3682
3683       if (!proto_tree_print(&print_args, edt, print_stream))
3684         return FALSE;
3685       if (!print_hex) {
3686         if (!print_line(print_stream, 0, separator))
3687           return FALSE;
3688       }
3689       break;
3690
3691     case WRITE_XML:
3692       proto_tree_write_pdml(edt, stdout);
3693       printf("\n");
3694       return !ferror(stdout);
3695     case WRITE_FIELDS:
3696       proto_tree_write_fields(output_fields, edt, &cf->cinfo, stdout);
3697       printf("\n");
3698       return !ferror(stdout);
3699     }
3700   }
3701   if (print_hex) {
3702     if (print_summary || print_details) {
3703       if (!print_line(print_stream, 0, ""))
3704         return FALSE;
3705     }
3706     if (!print_hex_data(print_stream, edt))
3707       return FALSE;
3708     if (!print_line(print_stream, 0, separator))
3709       return FALSE;
3710   }
3711   return TRUE;
3712 }
3713
3714 static gboolean
3715 write_finale(void)
3716 {
3717   switch (output_action) {
3718
3719   case WRITE_TEXT:
3720     return print_finale(print_stream);
3721
3722   case WRITE_XML:
3723     if (print_details)
3724       write_pdml_finale(stdout);
3725     else
3726       write_psml_finale(stdout);
3727     return !ferror(stdout);
3728
3729   case WRITE_FIELDS:
3730     write_fields_finale(output_fields, stdout);
3731     return !ferror(stdout);
3732
3733   default:
3734     g_assert_not_reached();
3735     return FALSE;
3736   }
3737 }
3738
3739 cf_status_t
3740 cf_open(capture_file *cf, const char *fname, gboolean is_tempfile, int *err)
3741 {
3742   wtap  *wth;
3743   gchar *err_info;
3744   char   err_msg[2048+1];
3745
3746   wth = wtap_open_offline(fname, err, &err_info, perform_two_pass_analysis);
3747   if (wth == NULL)
3748     goto fail;
3749
3750   /* The open succeeded.  Fill in the information for this file. */
3751
3752   /* Create new epan session for dissection. */
3753   epan_free(cf->epan);
3754   cf->epan = tshark_epan_new(cf);
3755
3756   cf->wth = wth;
3757   cf->f_datalen = 0; /* not used, but set it anyway */
3758
3759   /* Set the file name because we need it to set the follow stream filter.
3760      XXX - is that still true?  We need it for other reasons, though,
3761      in any case. */
3762   cf->filename = g_strdup(fname);
3763
3764   /* Indicate whether it's a permanent or temporary file. */
3765   cf->is_tempfile = is_tempfile;
3766
3767   /* No user changes yet. */
3768   cf->unsaved_changes = FALSE;
3769
3770   cf->cd_t      = wtap_file_type(cf->wth);
3771   cf->count     = 0;
3772   cf->drops_known = FALSE;
3773   cf->drops     = 0;
3774   cf->snap      = wtap_snapshot_length(cf->wth);
3775   if (cf->snap == 0) {
3776     /* Snapshot length not known. */
3777     cf->has_snap = FALSE;
3778     cf->snap = WTAP_MAX_PACKET_SIZE;
3779   } else
3780     cf->has_snap = TRUE;
3781   nstime_set_zero(&cf->elapsed_time);
3782   ref = NULL;
3783   prev_dis = NULL;
3784   prev_cap = NULL;
3785
3786   cf->state = FILE_READ_IN_PROGRESS;
3787
3788   wtap_set_cb_new_ipv4(cf->wth, add_ipv4_name);
3789   wtap_set_cb_new_ipv6(cf->wth, (wtap_new_ipv6_callback_t) add_ipv6_name);
3790
3791   return CF_OK;
3792
3793 fail:
3794   g_snprintf(err_msg, sizeof err_msg,
3795              cf_open_error_message(*err, err_info, FALSE, cf->cd_t), fname);
3796   cmdarg_err("%s", err_msg);
3797   return CF_ERROR;
3798 }
3799
3800 static void
3801 show_capture_file_io_error(const char *fname, int err, gboolean is_close)
3802 {
3803   char *save_file_string;
3804
3805   save_file_string = output_file_description(fname);
3806
3807   switch (err) {
3808
3809   case ENOSPC:
3810     cmdarg_err("Not all the packets could be written to the %s because there is "
3811                "no space left on the file system.",
3812                save_file_string);
3813     break;
3814
3815 #ifdef EDQUOT
3816   case EDQUOT:
3817     cmdarg_err("Not all the packets could be written to the %s because you are "
3818                "too close to, or over your disk quota.",
3819                save_file_string);
3820   break;
3821 #endif
3822
3823   case WTAP_ERR_CANT_CLOSE:
3824     cmdarg_err("The %s couldn't be closed for some unknown reason.",
3825                save_file_string);
3826     break;
3827
3828   case WTAP_ERR_SHORT_WRITE:
3829     cmdarg_err("Not all the packets could be written to the %s.",
3830                save_file_string);
3831     break;
3832
3833   default:
3834     if (is_close) {
3835       cmdarg_err("The %s could not be closed: %s.", save_file_string,
3836                  wtap_strerror(err));
3837     } else {
3838       cmdarg_err("An error occurred while writing to the %s: %s.",
3839                  save_file_string, wtap_strerror(err));
3840     }
3841     break;
3842   }
3843   g_free(save_file_string);
3844 }
3845
3846 static void
3847 show_print_file_io_error(int err)
3848 {
3849   switch (err) {
3850
3851   case ENOSPC:
3852     cmdarg_err("Not all the packets could be printed because there is "
3853 "no space left on the file system.");
3854     break;
3855
3856 #ifdef EDQUOT
3857   case EDQUOT:
3858     cmdarg_err("Not all the packets could be printed because you are "
3859 "too close to, or over your disk quota.");
3860   break;
3861 #endif
3862
3863   default:
3864     cmdarg_err("An error occurred while printing packets: %s.",
3865       g_strerror(err));
3866     break;
3867   }
3868 }
3869
3870 static const char *
3871 cf_open_error_message(int err, gchar *err_info, gboolean for_writing,
3872                       int file_type)
3873 {
3874   const char *errmsg;
3875   static char errmsg_errno[1024+1];
3876
3877   if (err < 0) {
3878     /* Wiretap error. */
3879     switch (err) {
3880
3881     case WTAP_ERR_NOT_REGULAR_FILE:
3882       errmsg = "The file \"%s\" is a \"special file\" or socket or other non-regular file.";
3883       break;
3884
3885     case WTAP_ERR_RANDOM_OPEN_PIPE:
3886       /* Seen only when opening a capture file for reading. */
3887       errmsg = "The file \"%s\" is a pipe or FIFO; TShark can't read pipe or FIFO files in two-pass mode.";
3888       break;
3889
3890     case WTAP_ERR_FILE_UNKNOWN_FORMAT:
3891       /* Seen only when opening a capture file for reading. */
3892       errmsg = "The file \"%s\" isn't a capture file in a format TShark understands.";
3893       break;
3894
3895     case WTAP_ERR_UNSUPPORTED:
3896       /* Seen only when opening a capture file for reading. */
3897       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3898                "The file \"%%s\" isn't a capture file in a format TShark understands.\n"
3899                "(%s)", err_info);
3900       g_free(err_info);
3901       errmsg = errmsg_errno;
3902       break;
3903
3904     case WTAP_ERR_CANT_WRITE_TO_PIPE:
3905       /* Seen only when opening a capture file for writing. */
3906       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3907                  "The file \"%%s\" is a pipe, and \"%s\" capture files can't be "
3908                  "written to a pipe.", wtap_file_type_short_string(file_type));
3909       errmsg = errmsg_errno;
3910       break;
3911
3912     case WTAP_ERR_UNSUPPORTED_FILE_TYPE:
3913       /* Seen only when opening a capture file for writing. */
3914       errmsg = "TShark doesn't support writing capture files in that format.";
3915       break;
3916
3917     case WTAP_ERR_UNSUPPORTED_ENCAP:
3918       if (for_writing) {
3919         g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3920                    "TShark can't save this capture as a \"%s\" file.",
3921                    wtap_file_type_short_string(file_type));
3922       } else {
3923         g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3924                  "The file \"%%s\" is a capture for a network type that TShark doesn't support.\n"
3925                  "(%s)", err_info);
3926         g_free(err_info);
3927       }
3928       errmsg = errmsg_errno;
3929       break;
3930
3931     case WTAP_ERR_ENCAP_PER_PACKET_UNSUPPORTED:
3932       if (for_writing) {
3933         g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3934                    "TShark can't save this capture as a \"%s\" file.",
3935                    wtap_file_type_short_string(file_type));
3936         errmsg = errmsg_errno;
3937       } else
3938         errmsg = "The file \"%s\" is a capture for a network type that TShark doesn't support.";
3939       break;
3940
3941     case WTAP_ERR_BAD_FILE:
3942       /* Seen only when opening a capture file for reading. */
3943       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3944                "The file \"%%s\" appears to be damaged or corrupt.\n"
3945                "(%s)", err_info);
3946       g_free(err_info);
3947       errmsg = errmsg_errno;
3948       break;
3949
3950     case WTAP_ERR_CANT_OPEN:
3951       if (for_writing)
3952         errmsg = "The file \"%s\" could not be created for some unknown reason.";
3953       else
3954         errmsg = "The file \"%s\" could not be opened for some unknown reason.";
3955       break;
3956
3957     case WTAP_ERR_SHORT_READ:
3958       errmsg = "The file \"%s\" appears to have been cut short"
3959                " in the middle of a packet or other data.";
3960       break;
3961
3962     case WTAP_ERR_SHORT_WRITE:
3963       errmsg = "A full header couldn't be written to the file \"%s\".";
3964       break;
3965
3966     case WTAP_ERR_COMPRESSION_NOT_SUPPORTED:
3967       errmsg = "This file type cannot be written as a compressed file.";
3968       break;
3969
3970     case WTAP_ERR_DECOMPRESS:
3971       /* Seen only when opening a capture file for reading. */
3972       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3973                  "The compressed file \"%%s\" appears to be damaged or corrupt.\n"
3974                  "(%s)", err_info);
3975       g_free(err_info);
3976       errmsg = errmsg_errno;
3977       break;
3978
3979     default:
3980       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3981                  "The file \"%%s\" could not be %s: %s.",
3982                  for_writing ? "created" : "opened",
3983                  wtap_strerror(err));
3984       errmsg = errmsg_errno;
3985       break;
3986     }
3987   } else
3988     errmsg = file_open_error_message(err, for_writing);
3989   return errmsg;
3990 }
3991
3992 /*
3993  * Open/create errors are reported with an console message in TShark.
3994  */
3995 static void
3996 open_failure_message(const char *filename, int err, gboolean for_writing)
3997 {
3998   fprintf(stderr, "tshark: ");
3999   fprintf(stderr, file_open_error_message(err, for_writing), filename);
4000   fprintf(stderr, "\n");
4001 }
4002
4003
4004 /*
4005  * General errors are reported with an console message in TShark.
4006  */
4007 static void
4008 failure_message(const char *msg_format, va_list ap)
4009 {
4010   fprintf(stderr, "tshark: ");
4011   vfprintf(stderr, msg_format, ap);
4012   fprintf(stderr, "\n");
4013 }
4014
4015 /*
4016  * Read errors are reported with an console message in TShark.
4017  */
4018 static void
4019 read_failure_message(const char *filename, int err)
4020 {
4021   cmdarg_err("An error occurred while reading from the file \"%s\": %s.",
4022           filename, g_strerror(err));
4023 }
4024
4025 /*
4026  * Write errors are reported with an console message in TShark.
4027  */
4028 static void
4029 write_failure_message(const char *filename, int err)
4030 {
4031   cmdarg_err("An error occurred while writing to the file \"%s\": %s.",
4032           filename, g_strerror(err));
4033 }
4034
4035 /*
4036  * Report an error in command-line arguments.
4037  */
4038 void
4039 cmdarg_err(const char *fmt, ...)
4040 {
4041   va_list ap;
4042
4043   va_start(ap, fmt);
4044   failure_message(fmt, ap);
4045   va_end(ap);
4046 }
4047
4048 /*
4049  * Report additional information for an error in command-line arguments.
4050  */
4051 void
4052 cmdarg_err_cont(const char *fmt, ...)
4053 {
4054   va_list ap;
4055
4056   va_start(ap, fmt);
4057   vfprintf(stderr, fmt, ap);
4058   fprintf(stderr, "\n");
4059   va_end(ap);
4060 }
4061
4062
4063 /*
4064  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
4065  *
4066  * Local variables:
4067  * c-basic-offset: 2
4068  * tab-width: 8
4069  * indent-tabs-mode: nil
4070  * End:
4071  *
4072  * vi: set shiftwidth=2 tabstop=8 expandtab:
4073  * :indentSize=2:tabSize=8:noTabs=true:
4074  */