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