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