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