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