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