Remove fdata->opt_comment, add pkt_comment to pinfo
[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   epan->get_user_comment = NULL;
2202
2203   return epan;
2204 }
2205
2206 #ifdef HAVE_LIBPCAP
2207 static gboolean
2208 capture(void)
2209 {
2210   gboolean          ret;
2211   guint             i;
2212   GString          *str = g_string_new("");
2213 #ifdef USE_TSHARK_SELECT
2214   fd_set            readfds;
2215 #endif
2216 #ifndef _WIN32
2217   struct sigaction  action, oldaction;
2218 #endif
2219
2220   /*
2221    * XXX - dropping privileges is still required, until code cleanup is done
2222    *
2223    * remove all dependencies to pcap specific code and using only dumpcap is almost done.
2224    * when it's done, we don't need special privileges to run tshark at all,
2225    * therefore we don't need to drop these privileges
2226    * The only thing we might want to keep is a warning if tshark is run as root,
2227    * as it's no longer necessary and potentially dangerous.
2228    *
2229    * THE FOLLOWING IS THE FORMER COMMENT WHICH IS NO LONGER REALLY VALID:
2230    * We've opened the capture device, so we shouldn't need any special
2231    * privileges any more; relinquish those privileges.
2232    *
2233    * XXX - if we have saved set-user-ID support, we should give up those
2234    * privileges immediately, and then reclaim them long enough to get
2235    * a list of network interfaces and to open one, and then give them
2236    * up again, so that stuff we do while processing the argument list,
2237    * reading the user's preferences, loading and starting plugins
2238    * (especially *user* plugins), etc. is done with the user's privileges,
2239    * not special privileges.
2240    */
2241   relinquish_special_privs_perm();
2242   print_current_user();
2243
2244   /* Create new dissection section. */
2245   epan_free(cfile.epan);
2246   cfile.epan = tshark_epan_new(&cfile);
2247
2248 #ifdef _WIN32
2249   /* Catch a CTRL+C event and, if we get it, clean up and exit. */
2250   SetConsoleCtrlHandler(capture_cleanup, TRUE);
2251 #else /* _WIN32 */
2252   /* Catch SIGINT and SIGTERM and, if we get either of them,
2253      clean up and exit.  If SIGHUP isn't being ignored, catch
2254      it too and, if we get it, clean up and exit.
2255
2256      We restart any read that was in progress, so that it doesn't
2257      disrupt reading from the sync pipe.  The signal handler tells
2258      the capture child to finish; it will report that it finished,
2259      or will exit abnormally, so  we'll stop reading from the sync
2260      pipe, pick up the exit status, and quit. */
2261   memset(&action, 0, sizeof(action));
2262   action.sa_handler = capture_cleanup;
2263   action.sa_flags = SA_RESTART;
2264   sigemptyset(&action.sa_mask);
2265   sigaction(SIGTERM, &action, NULL);
2266   sigaction(SIGINT, &action, NULL);
2267   sigaction(SIGHUP, NULL, &oldaction);
2268   if (oldaction.sa_handler == SIG_DFL)
2269     sigaction(SIGHUP, &action, NULL);
2270
2271 #ifdef SIGINFO
2272   /* Catch SIGINFO and, if we get it and we're capturing to a file in
2273      quiet mode, report the number of packets we've captured.
2274
2275      Again, restart any read that was in progress, so that it doesn't
2276      disrupt reading from the sync pipe. */
2277   action.sa_handler = report_counts_siginfo;
2278   action.sa_flags = SA_RESTART;
2279   sigemptyset(&action.sa_mask);
2280   sigaction(SIGINFO, &action, NULL);
2281 #endif /* SIGINFO */
2282 #endif /* _WIN32 */
2283
2284   global_capture_session.state = CAPTURE_PREPARING;
2285
2286   /* Let the user know which interfaces were chosen. */
2287   for (i = 0; i < global_capture_opts.ifaces->len; i++) {
2288     interface_options interface_opts;
2289
2290     interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
2291     interface_opts.descr = get_interface_descriptive_name(interface_opts.name);
2292     global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, i);
2293     g_array_insert_val(global_capture_opts.ifaces, i, interface_opts);
2294   }
2295 #ifdef _WIN32
2296   if (global_capture_opts.ifaces->len < 2) {
2297 #else
2298   if (global_capture_opts.ifaces->len < 4) {
2299 #endif
2300     for (i = 0; i < global_capture_opts.ifaces->len; i++) {
2301       interface_options interface_opts;
2302
2303       interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
2304       if (i > 0) {
2305           if (global_capture_opts.ifaces->len > 2) {
2306               g_string_append_printf(str, ",");
2307           }
2308           g_string_append_printf(str, " ");
2309           if (i == global_capture_opts.ifaces->len - 1) {
2310               g_string_append_printf(str, "and ");
2311           }
2312       }
2313       g_string_append_printf(str, "'%s'", interface_opts.descr);
2314     }
2315   } else {
2316     g_string_append_printf(str, "%u interfaces", global_capture_opts.ifaces->len);
2317   }
2318   if (really_quiet == FALSE)
2319     fprintf(stderr, "Capturing on %s\n", str->str);
2320   fflush(stderr);
2321   g_string_free(str, TRUE);
2322
2323   ret = sync_pipe_start(&global_capture_opts, &global_capture_session, NULL);
2324
2325   if (!ret)
2326     return FALSE;
2327
2328   /* the actual capture loop
2329    *
2330    * XXX - glib doesn't seem to provide any event based loop handling.
2331    *
2332    * XXX - for whatever reason,
2333    * calling g_main_loop_new() ends up in 100% cpu load.
2334    *
2335    * But that doesn't matter: in UNIX we can use select() to find an input
2336    * source with something to do.
2337    *
2338    * But that doesn't matter because we're in a CLI (that doesn't need to
2339    * update a GUI or something at the same time) so it's OK if we block
2340    * trying to read from the pipe.
2341    *
2342    * So all the stuff in USE_TSHARK_SELECT could be removed unless I'm
2343    * wrong (but I leave it there in case I am...).
2344    */
2345
2346 #ifdef USE_TSHARK_SELECT
2347   FD_ZERO(&readfds);
2348   FD_SET(pipe_input.source, &readfds);
2349 #endif
2350
2351   loop_running = TRUE;
2352
2353   TRY
2354   {
2355     while (loop_running)
2356     {
2357 #ifdef USE_TSHARK_SELECT
2358       ret = select(pipe_input.source+1, &readfds, NULL, NULL, NULL);
2359
2360       if (ret == -1)
2361       {
2362         perror("select()");
2363         return TRUE;
2364       } else if (ret == 1) {
2365 #endif
2366         /* Call the real handler */
2367         if (!pipe_input.input_cb(pipe_input.source, pipe_input.user_data)) {
2368           g_log(NULL, G_LOG_LEVEL_DEBUG, "input pipe closed");
2369           return FALSE;
2370         }
2371 #ifdef USE_TSHARK_SELECT
2372       }
2373 #endif
2374     }
2375   }
2376   CATCH(OutOfMemoryError) {
2377     fprintf(stderr,
2378             "Out Of Memory!\n"
2379             "\n"
2380             "Sorry, but TShark has to terminate now!\n"
2381             "\n"
2382             "Some infos / workarounds can be found at:\n"
2383             "http://wiki.wireshark.org/KnownBugs/OutOfMemory\n");
2384     exit(1);
2385   }
2386   ENDTRY;
2387   return TRUE;
2388 }
2389
2390 /* capture child detected an error */
2391 void
2392 capture_input_error_message(capture_session *cap_session _U_, char *error_msg, char *secondary_error_msg)
2393 {
2394   cmdarg_err("%s", error_msg);
2395   cmdarg_err_cont("%s", secondary_error_msg);
2396 }
2397
2398
2399 /* capture child detected an capture filter related error */
2400 void
2401 capture_input_cfilter_error_message(capture_session *cap_session, guint i, char *error_message)
2402 {
2403   capture_options *capture_opts = cap_session->capture_opts;
2404   dfilter_t         *rfcode = NULL;
2405   interface_options  interface_opts;
2406
2407   g_assert(i < capture_opts->ifaces->len);
2408   interface_opts = g_array_index(capture_opts->ifaces, interface_options, i);
2409
2410   if (dfilter_compile(interface_opts.cfilter, &rfcode) && rfcode != NULL) {
2411     cmdarg_err(
2412       "Invalid capture filter \"%s\" for interface %s!\n"
2413       "\n"
2414       "That string looks like a valid display filter; however, it isn't a valid\n"
2415       "capture filter (%s).\n"
2416       "\n"
2417       "Note that display filters and capture filters don't have the same syntax,\n"
2418       "so you can't use most display filter expressions as capture filters.\n"
2419       "\n"
2420       "See the User's Guide for a description of the capture filter syntax.",
2421       interface_opts.cfilter, interface_opts.descr, error_message);
2422     dfilter_free(rfcode);
2423   } else {
2424     cmdarg_err(
2425       "Invalid capture filter \"%s\" for interface %s!\n"
2426       "\n"
2427       "That string isn't a valid capture filter (%s).\n"
2428       "See the User's Guide for a description of the capture filter syntax.",
2429       interface_opts.cfilter, interface_opts.descr, error_message);
2430   }
2431 }
2432
2433
2434 /* capture child tells us we have a new (or the first) capture file */
2435 gboolean
2436 capture_input_new_file(capture_session *cap_session, gchar *new_file)
2437 {
2438   capture_options *capture_opts = cap_session->capture_opts;
2439   gboolean is_tempfile;
2440   int      err;
2441
2442   if (cap_session->state == CAPTURE_PREPARING) {
2443     g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "Capture started!");
2444   }
2445   g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "File: \"%s\"", new_file);
2446
2447   g_assert(cap_session->state == CAPTURE_PREPARING || cap_session->state == CAPTURE_RUNNING);
2448
2449   /* free the old filename */
2450   if (capture_opts->save_file != NULL) {
2451
2452     /* we start a new capture file, close the old one (if we had one before) */
2453     if ( ((capture_file *) cap_session->cf)->state != FILE_CLOSED) {
2454       if ( ((capture_file *) cap_session->cf)->wth != NULL) {
2455         wtap_close(((capture_file *) cap_session->cf)->wth);
2456       }
2457       ((capture_file *) cap_session->cf)->state = FILE_CLOSED;
2458     }
2459
2460     g_free(capture_opts->save_file);
2461     is_tempfile = FALSE;
2462   } else {
2463     /* we didn't had a save_file before, must be a tempfile */
2464     is_tempfile = TRUE;
2465   }
2466
2467   /* save the new filename */
2468   capture_opts->save_file = g_strdup(new_file);
2469
2470   /* if we are in real-time mode, open the new file now */
2471   if (do_dissection) {
2472     /* Attempt to open the capture file and set up to read from it. */
2473     switch(cf_open((capture_file *)cap_session->cf, capture_opts->save_file, is_tempfile, &err)) {
2474     case CF_OK:
2475       break;
2476     case CF_ERROR:
2477       /* Don't unlink (delete) the save file - leave it around,
2478          for debugging purposes. */
2479       g_free(capture_opts->save_file);
2480       capture_opts->save_file = NULL;
2481       return FALSE;
2482     }
2483   }
2484
2485   cap_session->state = CAPTURE_RUNNING;
2486
2487   return TRUE;
2488 }
2489
2490
2491 /* capture child tells us we have new packets to read */
2492 void
2493 capture_input_new_packets(capture_session *cap_session, int to_read)
2494 {
2495   gboolean      ret;
2496   int           err;
2497   gchar        *err_info;
2498   gint64        data_offset;
2499   capture_file *cf = (capture_file *)cap_session->cf;
2500   gboolean      filtering_tap_listeners;
2501   guint         tap_flags;
2502
2503 #ifdef SIGINFO
2504   /*
2505    * Prevent a SIGINFO handler from writing to the standard error while
2506    * we're doing so or writing to the standard output; instead, have it
2507    * just set a flag telling us to print that information when we're done.
2508    */
2509   infodelay = TRUE;
2510 #endif /* SIGINFO */
2511
2512   /* Do we have any tap listeners with filters? */
2513   filtering_tap_listeners = have_filtering_tap_listeners();
2514
2515   /* Get the union of the flags for all tap listeners. */
2516   tap_flags = union_of_tap_listener_flags();
2517
2518   if (do_dissection) {
2519     while (to_read-- && cf->wth) {
2520       wtap_cleareof(cf->wth);
2521       ret = wtap_read(cf->wth, &err, &err_info, &data_offset);
2522       if (ret == FALSE) {
2523         /* read from file failed, tell the capture child to stop */
2524         sync_pipe_stop(cap_session);
2525         wtap_close(cf->wth);
2526         cf->wth = NULL;
2527       } else {
2528         ret = process_packet(cf, data_offset, wtap_phdr(cf->wth),
2529                              wtap_buf_ptr(cf->wth),
2530                              filtering_tap_listeners, tap_flags);
2531       }
2532       if (ret != FALSE) {
2533         /* packet successfully read and gone through the "Read Filter" */
2534         packet_count++;
2535       }
2536     }
2537   } else {
2538     /*
2539      * Dumpcap's doing all the work; we're not doing any dissection.
2540      * Count all the packets it wrote.
2541      */
2542     packet_count += to_read;
2543   }
2544
2545   if (print_packet_counts) {
2546       /* We're printing packet counts. */
2547       if (packet_count != 0) {
2548         fprintf(stderr, "\r%u ", packet_count);
2549         /* stderr could be line buffered */
2550         fflush(stderr);
2551       }
2552   }
2553
2554 #ifdef SIGINFO
2555   /*
2556    * Allow SIGINFO handlers to write.
2557    */
2558   infodelay = FALSE;
2559
2560   /*
2561    * If a SIGINFO handler asked us to write out capture counts, do so.
2562    */
2563   if (infoprint)
2564     report_counts();
2565 #endif /* SIGINFO */
2566 }
2567
2568 static void
2569 report_counts(void)
2570 {
2571   if ((print_packet_counts == FALSE) && (really_quiet == FALSE)) {
2572     /* Report the count only if we aren't printing a packet count
2573        as packets arrive. */
2574       fprintf(stderr, "%u packet%s captured\n", packet_count,
2575             plurality(packet_count, "", "s"));
2576   }
2577 #ifdef SIGINFO
2578   infoprint = FALSE; /* we just reported it */
2579 #endif /* SIGINFO */
2580 }
2581
2582 #ifdef SIGINFO
2583 static void
2584 report_counts_siginfo(int signum _U_)
2585 {
2586   int sav_errno = errno;
2587   /* If we've been told to delay printing, just set a flag asking
2588      that we print counts (if we're supposed to), otherwise print
2589      the count of packets captured (if we're supposed to). */
2590   if (infodelay)
2591     infoprint = TRUE;
2592   else
2593     report_counts();
2594   errno = sav_errno;
2595 }
2596 #endif /* SIGINFO */
2597
2598
2599 /* capture child detected any packet drops? */
2600 void
2601 capture_input_drops(capture_session *cap_session _U_, guint32 dropped)
2602 {
2603   if (print_packet_counts) {
2604     /* We're printing packet counts to stderr.
2605        Send a newline so that we move to the line after the packet count. */
2606     fprintf(stderr, "\n");
2607   }
2608
2609   if (dropped != 0) {
2610     /* We're printing packet counts to stderr.
2611        Send a newline so that we move to the line after the packet count. */
2612     fprintf(stderr, "%u packet%s dropped\n", dropped, plurality(dropped, "", "s"));
2613   }
2614 }
2615
2616
2617 /*
2618  * Capture child closed its side of the pipe, report any error and
2619  * do the required cleanup.
2620  */
2621 void
2622 capture_input_closed(capture_session *cap_session, gchar *msg)
2623 {
2624   capture_file *cf = (capture_file *) cap_session->cf;
2625
2626   if (msg != NULL)
2627     fprintf(stderr, "tshark: %s\n", msg);
2628
2629   report_counts();
2630
2631   if (cf != NULL && cf->wth != NULL) {
2632     wtap_close(cf->wth);
2633     if (cf->is_tempfile) {
2634       ws_unlink(cf->filename);
2635     }
2636   }
2637 #ifdef USE_BROKEN_G_MAIN_LOOP
2638   /*g_main_loop_quit(loop);*/
2639   g_main_quit(loop);
2640 #else
2641   loop_running = FALSE;
2642 #endif
2643 }
2644
2645
2646
2647
2648 #ifdef _WIN32
2649 static BOOL WINAPI
2650 capture_cleanup(DWORD ctrltype _U_)
2651 {
2652   /* CTRL_C_EVENT is sort of like SIGINT, CTRL_BREAK_EVENT is unique to
2653      Windows, CTRL_CLOSE_EVENT is sort of like SIGHUP, CTRL_LOGOFF_EVENT
2654      is also sort of like SIGHUP, and CTRL_SHUTDOWN_EVENT is sort of
2655      like SIGTERM at least when the machine's shutting down.
2656
2657      For now, we handle them all as indications that we should clean up
2658      and quit, just as we handle SIGINT, SIGHUP, and SIGTERM in that
2659      way on UNIX.
2660
2661      We must return TRUE so that no other handler - such as one that would
2662      terminate the process - gets called.
2663
2664      XXX - for some reason, typing ^C to TShark, if you run this in
2665      a Cygwin console window in at least some versions of Cygwin,
2666      causes TShark to terminate immediately; this routine gets
2667      called, but the main loop doesn't get a chance to run and
2668      exit cleanly, at least if this is compiled with Microsoft Visual
2669      C++ (i.e., it's a property of the Cygwin console window or Bash;
2670      it happens if TShark is not built with Cygwin - for all I know,
2671      building it with Cygwin may make the problem go away). */
2672
2673   /* tell the capture child to stop */
2674   sync_pipe_stop(&global_capture_session);
2675
2676   /* don't stop our own loop already here, otherwise status messages and
2677    * cleanup wouldn't be done properly. The child will indicate the stop of
2678    * everything by calling capture_input_closed() later */
2679
2680   return TRUE;
2681 }
2682 #else
2683 static void
2684 capture_cleanup(int signum _U_)
2685 {
2686   /* tell the capture child to stop */
2687   sync_pipe_stop(&global_capture_session);
2688
2689   /* don't stop our own loop already here, otherwise status messages and
2690    * cleanup wouldn't be done properly. The child will indicate the stop of
2691    * everything by calling capture_input_closed() later */
2692 }
2693 #endif /* _WIN32 */
2694 #endif /* HAVE_LIBPCAP */
2695
2696 static gboolean
2697 process_packet_first_pass(capture_file *cf,
2698                gint64 offset, struct wtap_pkthdr *whdr,
2699                const guchar *pd)
2700 {
2701   frame_data     fdlocal;
2702   guint32        framenum;
2703   gboolean       create_proto_tree = FALSE;
2704   epan_dissect_t edt;
2705   gboolean       passed;
2706
2707   /* The frame number of this packet is one more than the count of
2708      frames in this packet. */
2709   framenum = cf->count + 1;
2710
2711   /* If we're not running a display filter and we're not printing any
2712      packet information, we don't need to do a dissection. This means
2713      that all packets can be marked as 'passed'. */
2714   passed = TRUE;
2715
2716   frame_data_init(&fdlocal, framenum, whdr, offset, cum_bytes);
2717
2718   /* If we're going to print packet information, or we're going to
2719      run a read filter, or display filter, or we're going to process taps, set up to
2720      do a dissection and do so. */
2721   if (do_dissection) {
2722     if (gbl_resolv_flags.mac_name || gbl_resolv_flags.network_name ||
2723         gbl_resolv_flags.transport_name || gbl_resolv_flags.concurrent_dns)
2724       /* Grab any resolved addresses */
2725       host_name_lookup_process();
2726
2727     /* If we're going to be applying a filter, we'll need to
2728        create a protocol tree against which to apply the filter. */
2729     if (cf->rfcode)
2730       create_proto_tree = TRUE;
2731
2732     /* We're not going to display the protocol tree on this pass,
2733        so it's not going to be "visible". */
2734     epan_dissect_init(&edt, cf->epan, create_proto_tree, FALSE);
2735
2736     /* If we're running a read filter, prime the epan_dissect_t with that
2737        filter. */
2738     if (cf->rfcode)
2739       epan_dissect_prime_dfilter(&edt, cf->rfcode);
2740
2741     frame_data_set_before_dissect(&fdlocal, &cf->elapsed_time,
2742                                   &ref, prev_dis);
2743     if (ref == &fdlocal) {
2744       ref_frame = fdlocal;
2745       ref = &ref_frame;
2746     }
2747
2748     epan_dissect_run(&edt, whdr, frame_tvbuff_new(&fdlocal, pd), &fdlocal, NULL);
2749
2750     /* Run the read filter if we have one. */
2751     if (cf->rfcode)
2752       passed = dfilter_apply_edt(cf->rfcode, &edt);
2753   }
2754
2755   if (passed) {
2756     frame_data_set_after_dissect(&fdlocal, &cum_bytes);
2757     prev_cap = prev_dis = frame_data_sequence_add(cf->frames, &fdlocal);
2758
2759     /* If we're not doing dissection then there won't be any dependent frames.
2760      * More importantly, edt.pi.dependent_frames won't be initialized because
2761      * epan hasn't been initialized.
2762      */
2763     if (do_dissection) {
2764       g_slist_foreach(edt.pi.dependent_frames, find_and_mark_frame_depended_upon, cf->frames);
2765     }
2766
2767     cf->count++;
2768   } else {
2769     /* if we don't add it to the frame_data_sequence, clean it up right now
2770      * to avoid leaks */
2771     frame_data_destroy(&fdlocal);
2772   }
2773
2774   if (do_dissection)
2775     epan_dissect_cleanup(&edt);
2776
2777   return passed;
2778 }
2779
2780 static gboolean
2781 process_packet_second_pass(capture_file *cf, frame_data *fdata,
2782                struct wtap_pkthdr *phdr, Buffer *buf,
2783                gboolean filtering_tap_listeners, guint tap_flags)
2784 {
2785   gboolean        create_proto_tree;
2786   column_info    *cinfo;
2787   epan_dissect_t  edt;
2788   gboolean        passed;
2789
2790   /* If we're not running a display filter and we're not printing any
2791      packet information, we don't need to do a dissection. This means
2792      that all packets can be marked as 'passed'. */
2793   passed = TRUE;
2794
2795   /* If we're going to print packet information, or we're going to
2796      run a read filter, or we're going to process taps, set up to
2797      do a dissection and do so. */
2798   if (do_dissection) {
2799     if (gbl_resolv_flags.mac_name || gbl_resolv_flags.network_name ||
2800         gbl_resolv_flags.transport_name || gbl_resolv_flags.concurrent_dns)
2801       /* Grab any resolved addresses */
2802       host_name_lookup_process();
2803
2804     if (cf->dfcode || print_details || filtering_tap_listeners ||
2805         (tap_flags & TL_REQUIRES_PROTO_TREE) || have_custom_cols(&cf->cinfo))
2806       create_proto_tree = TRUE;
2807     else
2808       create_proto_tree = FALSE;
2809
2810     /* The protocol tree will be "visible", i.e., printed, only if we're
2811        printing packet details, which is true if we're printing stuff
2812        ("print_packet_info" is true) and we're in verbose mode
2813        ("packet_details" is true). */
2814     epan_dissect_init(&edt, cf->epan, create_proto_tree, print_packet_info && print_details);
2815
2816     /* If we're running a display filter, prime the epan_dissect_t with that
2817        filter. */
2818     if (cf->dfcode)
2819       epan_dissect_prime_dfilter(&edt, cf->dfcode);
2820
2821     col_custom_prime_edt(&edt, &cf->cinfo);
2822
2823     /* We only need the columns if either
2824          1) some tap needs the columns
2825        or
2826          2) we're printing packet info but we're *not* verbose; in verbose
2827             mode, we print the protocol tree, not the protocol summary.
2828      */
2829     if ((tap_flags & TL_REQUIRES_COLUMNS) || (print_packet_info && print_summary))
2830       cinfo = &cf->cinfo;
2831     else
2832       cinfo = NULL;
2833
2834     frame_data_set_before_dissect(fdata, &cf->elapsed_time,
2835                                   &ref, prev_dis);
2836     if (ref == fdata) {
2837       ref_frame = *fdata;
2838       ref = &ref_frame;
2839     }
2840
2841     epan_dissect_run_with_taps(&edt, phdr, frame_tvbuff_new_buffer(fdata, buf), fdata, cinfo);
2842
2843     /* Run the read/display filter if we have one. */
2844     if (cf->dfcode)
2845       passed = dfilter_apply_edt(cf->dfcode, &edt);
2846   }
2847
2848   if (passed) {
2849     frame_data_set_after_dissect(fdata, &cum_bytes);
2850     /* Process this packet. */
2851     if (print_packet_info) {
2852       /* We're printing packet information; print the information for
2853          this packet. */
2854       if (do_dissection)
2855         print_packet(cf, &edt);
2856       else
2857         print_packet(cf, NULL);
2858
2859       /* The ANSI C standard does not appear to *require* that a line-buffered
2860          stream be flushed to the host environment whenever a newline is
2861          written, it just says that, on such a stream, characters "are
2862          intended to be transmitted to or from the host environment as a
2863          block when a new-line character is encountered".
2864
2865          The Visual C++ 6.0 C implementation doesn't do what is intended;
2866          even if you set a stream to be line-buffered, it still doesn't
2867          flush the buffer at the end of every line.
2868
2869          So, if the "-l" flag was specified, we flush the standard output
2870          at the end of a packet.  This will do the right thing if we're
2871          printing packet summary lines, and, as we print the entire protocol
2872          tree for a single packet without waiting for anything to happen,
2873          it should be as good as line-buffered mode if we're printing
2874          protocol trees.  (The whole reason for the "-l" flag in either
2875          tcpdump or TShark is to allow the output of a live capture to
2876          be piped to a program or script and to have that script see the
2877          information for the packet as soon as it's printed, rather than
2878          having to wait until a standard I/O buffer fills up. */
2879       if (line_buffered)
2880         fflush(stdout);
2881
2882       if (ferror(stdout)) {
2883         show_print_file_io_error(errno);
2884         exit(2);
2885       }
2886     }
2887     prev_dis = fdata;
2888   }
2889   prev_cap = fdata;
2890
2891   if (do_dissection) {
2892     epan_dissect_cleanup(&edt);
2893   }
2894   return passed || fdata->flags.dependent_of_displayed;
2895 }
2896
2897 static int
2898 load_cap_file(capture_file *cf, char *save_file, int out_file_type,
2899     gboolean out_file_name_res, int max_packet_count, gint64 max_byte_count)
2900 {
2901   gint         linktype;
2902   int          snapshot_length;
2903   wtap_dumper *pdh;
2904   guint32      framenum;
2905   int          err;
2906   gchar       *err_info = NULL;
2907   gint64       data_offset;
2908   char        *save_file_string = NULL;
2909   gboolean     filtering_tap_listeners;
2910   guint        tap_flags;
2911   wtapng_section_t            *shb_hdr;
2912   wtapng_iface_descriptions_t *idb_inf;
2913   char         appname[100];
2914   Buffer       buf;
2915
2916   shb_hdr = wtap_file_get_shb_info(cf->wth);
2917   idb_inf = wtap_file_get_idb_info(cf->wth);
2918 #ifdef PCAP_NG_DEFAULT
2919   if (idb_inf->number_of_interfaces > 1) {
2920     linktype = WTAP_ENCAP_PER_PACKET;
2921   } else {
2922     linktype = wtap_file_encap(cf->wth);
2923   }
2924 #else
2925   linktype = wtap_file_encap(cf->wth);
2926 #endif
2927   if (save_file != NULL) {
2928     /* Get a string that describes what we're writing to */
2929     save_file_string = output_file_description(save_file);
2930
2931     /* Set up to write to the capture file. */
2932     snapshot_length = wtap_snapshot_length(cf->wth);
2933     if (snapshot_length == 0) {
2934       /* Snapshot length of input file not known. */
2935       snapshot_length = WTAP_MAX_PACKET_SIZE;
2936     }
2937     /* If we don't have an application name add Tshark */
2938     if (shb_hdr->shb_user_appl == NULL) {
2939         g_snprintf(appname, sizeof(appname), "TShark " VERSION "%s", wireshark_svnversion);
2940         shb_hdr->shb_user_appl = appname;
2941     }
2942
2943     if (linktype != WTAP_ENCAP_PER_PACKET && out_file_type == WTAP_FILE_PCAP)
2944         pdh = wtap_dump_open(save_file, out_file_type, linktype,
2945             snapshot_length, FALSE /* compressed */, &err);
2946     else
2947         pdh = wtap_dump_open_ng(save_file, out_file_type, linktype,
2948             snapshot_length, FALSE /* compressed */, shb_hdr, idb_inf, &err);
2949
2950     g_free(idb_inf);
2951     idb_inf = NULL;
2952
2953     if (pdh == NULL) {
2954       /* We couldn't set up to write to the capture file. */
2955       switch (err) {
2956
2957       case WTAP_ERR_UNSUPPORTED_FILE_TYPE:
2958         cmdarg_err("Capture files can't be written in that format.");
2959         break;
2960
2961       case WTAP_ERR_UNSUPPORTED_ENCAP:
2962       case WTAP_ERR_ENCAP_PER_PACKET_UNSUPPORTED:
2963         cmdarg_err("The capture file being read can't be written as a "
2964           "\"%s\" file.", wtap_file_type_short_string(out_file_type));
2965         break;
2966
2967       case WTAP_ERR_CANT_OPEN:
2968         cmdarg_err("The %s couldn't be created for some "
2969           "unknown reason.", save_file_string);
2970         break;
2971
2972       case WTAP_ERR_SHORT_WRITE:
2973         cmdarg_err("A full header couldn't be written to the %s.",
2974                    save_file_string);
2975         break;
2976
2977       default:
2978         cmdarg_err("The %s could not be created: %s.", save_file_string,
2979                    wtap_strerror(err));
2980         break;
2981       }
2982       goto out;
2983     }
2984   } else {
2985     if (print_packet_info) {
2986       if (!write_preamble(cf)) {
2987         err = errno;
2988         show_print_file_io_error(err);
2989         goto out;
2990       }
2991     }
2992     pdh = NULL;
2993   }
2994
2995   if (pdh && out_file_name_res) {
2996     if (!wtap_dump_set_addrinfo_list(pdh, get_addrinfo_list())) {
2997       cmdarg_err("The file format \"%s\" doesn't support name resolution information.",
2998                  wtap_file_type_short_string(out_file_type));
2999     }
3000   }
3001
3002   /* Do we have any tap listeners with filters? */
3003   filtering_tap_listeners = have_filtering_tap_listeners();
3004
3005   /* Get the union of the flags for all tap listeners. */
3006   tap_flags = union_of_tap_listener_flags();
3007
3008   if (perform_two_pass_analysis) {
3009     frame_data *fdata;
3010     int old_max_packet_count = max_packet_count;
3011
3012     /* Allocate a frame_data_sequence for all the frames. */
3013     cf->frames = new_frame_data_sequence();
3014
3015     while (wtap_read(cf->wth, &err, &err_info, &data_offset)) {
3016       if (process_packet_first_pass(cf, data_offset, wtap_phdr(cf->wth),
3017                          wtap_buf_ptr(cf->wth))) {
3018         /* Stop reading if we have the maximum number of packets;
3019          * When the -c option has not been used, max_packet_count
3020          * starts at 0, which practically means, never stop reading.
3021          * (unless we roll over max_packet_count ?)
3022          */
3023         if ( (--max_packet_count == 0) || (max_byte_count != 0 && data_offset >= max_byte_count)) {
3024           err = 0; /* This is not an error */
3025           break;
3026         }
3027       }
3028     }
3029
3030     /* Close the sequential I/O side, to free up memory it requires. */
3031     wtap_sequential_close(cf->wth);
3032
3033     /* Allow the protocol dissectors to free up memory that they
3034      * don't need after the sequential run-through of the packets. */
3035     postseq_cleanup_all_protocols();
3036
3037     max_packet_count = old_max_packet_count;
3038
3039     prev_dis = NULL;
3040     prev_cap = NULL;
3041     buffer_init(&buf, 1500);
3042     for (framenum = 1; err == 0 && framenum <= cf->count; framenum++) {
3043       fdata = frame_data_sequence_find(cf->frames, framenum);
3044       if (wtap_seek_read(cf->wth, fdata->file_off, &cf->phdr,
3045           &buf, fdata->cap_len, &err, &err_info)) {
3046         if (process_packet_second_pass(cf, fdata, &cf->phdr, &buf,
3047                                        filtering_tap_listeners, tap_flags)) {
3048           /* Either there's no read filtering or this packet passed the
3049              filter, so, if we're writing to a capture file, write
3050              this packet out. */
3051           if (pdh != NULL) {
3052             if (!wtap_dump(pdh, &cf->phdr, buffer_start_ptr(&cf->buf), &err)) {
3053               /* Error writing to a capture file */
3054               switch (err) {
3055
3056               case WTAP_ERR_UNSUPPORTED_ENCAP:
3057                 /*
3058                  * This is a problem with the particular frame we're writing;
3059                  * note that, and give the frame number.
3060                  *
3061                  * XXX - framenum is not necessarily the frame number in
3062                  * the input file if there was a read filter.
3063                  */
3064                 fprintf(stderr,
3065                         "Frame %u of \"%s\" has a network type that can't be saved in a \"%s\" file.\n",
3066                         framenum, cf->filename,
3067                         wtap_file_type_short_string(out_file_type));
3068                 break;
3069
3070               default:
3071                 show_capture_file_io_error(save_file, err, FALSE);
3072                 break;
3073               }
3074               wtap_dump_close(pdh, &err);
3075               g_free(shb_hdr);
3076               exit(2);
3077             }
3078           }
3079           /* Stop reading if we have the maximum number of packets;
3080            * When the -c option has not been used, max_packet_count
3081            * starts at 0, which practically means, never stop reading.
3082            * (unless we roll over max_packet_count ?)
3083            */
3084           if ( (--max_packet_count == 0) || (max_byte_count != 0 && data_offset >= max_byte_count)) {
3085             err = 0; /* This is not an error */
3086             break;
3087           }
3088         }
3089       }
3090     }
3091     buffer_free(&buf);
3092   }
3093   else {
3094     framenum = 0;
3095     while (wtap_read(cf->wth, &err, &err_info, &data_offset)) {
3096       framenum++;
3097
3098       if (process_packet(cf, data_offset, wtap_phdr(cf->wth),
3099                          wtap_buf_ptr(cf->wth),
3100                          filtering_tap_listeners, tap_flags)) {
3101         /* Either there's no read filtering or this packet passed the
3102            filter, so, if we're writing to a capture file, write
3103            this packet out. */
3104         if (pdh != NULL) {
3105           if (!wtap_dump(pdh, wtap_phdr(cf->wth), wtap_buf_ptr(cf->wth), &err)) {
3106             /* Error writing to a capture file */
3107             switch (err) {
3108
3109             case WTAP_ERR_UNSUPPORTED_ENCAP:
3110               /*
3111                * This is a problem with the particular frame we're writing;
3112                * note that, and give the frame number.
3113                */
3114               fprintf(stderr,
3115                       "Frame %u of \"%s\" has a network type that can't be saved in a \"%s\" file.\n",
3116                       framenum, cf->filename,
3117                       wtap_file_type_short_string(out_file_type));
3118               break;
3119
3120             default:
3121               show_capture_file_io_error(save_file, err, FALSE);
3122               break;
3123             }
3124             wtap_dump_close(pdh, &err);
3125             g_free(shb_hdr);
3126             exit(2);
3127           }
3128         }
3129         /* Stop reading if we have the maximum number of packets;
3130          * When the -c option has not been used, max_packet_count
3131          * starts at 0, which practically means, never stop reading.
3132          * (unless we roll over max_packet_count ?)
3133          */
3134         if ( (--max_packet_count == 0) || (max_byte_count != 0 && data_offset >= max_byte_count)) {
3135           err = 0; /* This is not an error */
3136           break;
3137         }
3138       }
3139     }
3140   }
3141
3142   if (err != 0) {
3143     /*
3144      * Print a message noting that the read failed somewhere along the line.
3145      *
3146      * If we're printing packet data, and the standard output and error are
3147      * going to the same place, flush the standard output, so everything
3148      * buffered up is written, and then print a newline to the standard error
3149      * before printing the error message, to separate it from the packet
3150      * data.  (Alas, that only works on UN*X; st_dev is meaningless, and
3151      * the _fstat() documentation at Microsoft doesn't indicate whether
3152      * st_ino is even supported.)
3153      */
3154 #ifndef _WIN32
3155     if (print_packet_info) {
3156       struct stat stat_stdout, stat_stderr;
3157
3158       if (fstat(1, &stat_stdout) == 0 && fstat(2, &stat_stderr) == 0) {
3159         if (stat_stdout.st_dev == stat_stderr.st_dev &&
3160             stat_stdout.st_ino == stat_stderr.st_ino) {
3161           fflush(stdout);
3162           fprintf(stderr, "\n");
3163         }
3164       }
3165     }
3166 #endif
3167     switch (err) {
3168
3169     case WTAP_ERR_UNSUPPORTED:
3170       cmdarg_err("The file \"%s\" contains record data that TShark doesn't support.\n(%s)",
3171                  cf->filename, err_info);
3172       g_free(err_info);
3173       break;
3174
3175     case WTAP_ERR_UNSUPPORTED_ENCAP:
3176       cmdarg_err("The file \"%s\" has a packet with a network type that TShark doesn't support.\n(%s)",
3177                  cf->filename, err_info);
3178       g_free(err_info);
3179       break;
3180
3181     case WTAP_ERR_CANT_READ:
3182       cmdarg_err("An attempt to read from the file \"%s\" failed for some unknown reason.",
3183                  cf->filename);
3184       break;
3185
3186     case WTAP_ERR_SHORT_READ:
3187       cmdarg_err("The file \"%s\" appears to have been cut short in the middle of a packet.",
3188                  cf->filename);
3189       break;
3190
3191     case WTAP_ERR_BAD_FILE:
3192       cmdarg_err("The file \"%s\" appears to be damaged or corrupt.\n(%s)",
3193                  cf->filename, err_info);
3194       g_free(err_info);
3195       break;
3196
3197     case WTAP_ERR_DECOMPRESS:
3198       cmdarg_err("The compressed file \"%s\" appears to be damaged or corrupt.\n"
3199                  "(%s)", cf->filename, err_info);
3200       break;
3201
3202     default:
3203       cmdarg_err("An error occurred while reading the file \"%s\": %s.",
3204                  cf->filename, wtap_strerror(err));
3205       break;
3206     }
3207     if (save_file != NULL) {
3208       /* Now close the capture file. */
3209       if (!wtap_dump_close(pdh, &err))
3210         show_capture_file_io_error(save_file, err, TRUE);
3211     }
3212   } else {
3213     if (save_file != NULL) {
3214       /* Now close the capture file. */
3215       if (!wtap_dump_close(pdh, &err))
3216         show_capture_file_io_error(save_file, err, TRUE);
3217     } else {
3218       if (print_packet_info) {
3219         if (!write_finale()) {
3220           err = errno;
3221           show_print_file_io_error(err);
3222         }
3223       }
3224     }
3225   }
3226
3227 out:
3228   wtap_close(cf->wth);
3229   cf->wth = NULL;
3230
3231   g_free(save_file_string);
3232   g_free(shb_hdr);
3233
3234   return err;
3235 }
3236
3237 static gboolean
3238 process_packet(capture_file *cf, gint64 offset, struct wtap_pkthdr *whdr,
3239                const guchar *pd,
3240                gboolean filtering_tap_listeners, guint tap_flags)
3241 {
3242   frame_data      fdata;
3243   gboolean        create_proto_tree;
3244   column_info    *cinfo;
3245   epan_dissect_t  edt;
3246   gboolean        passed;
3247
3248   /* Count this packet. */
3249   cf->count++;
3250
3251   /* If we're not running a display filter and we're not printing any
3252      packet information, we don't need to do a dissection. This means
3253      that all packets can be marked as 'passed'. */
3254   passed = TRUE;
3255
3256   frame_data_init(&fdata, cf->count, whdr, offset, cum_bytes);
3257
3258   /* If we're going to print packet information, or we're going to
3259      run a read filter, or we're going to process taps, set up to
3260      do a dissection and do so. */
3261   if (do_dissection) {
3262     if (print_packet_info && (gbl_resolv_flags.mac_name || gbl_resolv_flags.network_name ||
3263         gbl_resolv_flags.transport_name || gbl_resolv_flags.concurrent_dns))
3264       /* Grab any resolved addresses */
3265       host_name_lookup_process();
3266
3267     if (cf->rfcode || cf->dfcode || print_details || filtering_tap_listeners ||
3268         (tap_flags & TL_REQUIRES_PROTO_TREE) || have_custom_cols(&cf->cinfo))
3269       create_proto_tree = TRUE;
3270     else
3271       create_proto_tree = FALSE;
3272
3273     /* The protocol tree will be "visible", i.e., printed, only if we're
3274        printing packet details, which is true if we're printing stuff
3275        ("print_packet_info" is true) and we're in verbose mode
3276        ("packet_details" is true). */
3277     epan_dissect_init(&edt, cf->epan, create_proto_tree, print_packet_info && print_details);
3278
3279     /* If we're running a filter, prime the epan_dissect_t with that
3280        filter. */
3281     if (cf->rfcode)
3282       epan_dissect_prime_dfilter(&edt, cf->rfcode);
3283     if (cf->dfcode)
3284       epan_dissect_prime_dfilter(&edt, cf->dfcode);
3285
3286     col_custom_prime_edt(&edt, &cf->cinfo);
3287
3288     /* We only need the columns if either
3289          1) some tap needs the columns
3290        or
3291          2) we're printing packet info but we're *not* verbose; in verbose
3292             mode, we print the protocol tree, not the protocol summary.
3293        or
3294          3) there is a column mapped as an individual field */
3295     if ((tap_flags & TL_REQUIRES_COLUMNS) || (print_packet_info && print_summary) || output_fields_has_cols(output_fields))
3296       cinfo = &cf->cinfo;
3297     else
3298       cinfo = NULL;
3299
3300     frame_data_set_before_dissect(&fdata, &cf->elapsed_time,
3301                                   &ref, prev_dis);
3302     if (ref == &fdata) {
3303       ref_frame = fdata;
3304       ref = &ref_frame;
3305     }
3306
3307     epan_dissect_run_with_taps(&edt, whdr, frame_tvbuff_new(&fdata, pd), &fdata, cinfo);
3308
3309     /* Run the filters if we have them. */
3310     if (cf->rfcode)
3311       passed = dfilter_apply_edt(cf->rfcode, &edt);
3312     if (passed && cf->dfcode)
3313       passed = dfilter_apply_edt(cf->dfcode, &edt);
3314   }
3315
3316   if (passed) {
3317     frame_data_set_after_dissect(&fdata, &cum_bytes);
3318
3319     /* Process this packet. */
3320     if (print_packet_info) {
3321       /* We're printing packet information; print the information for
3322          this packet. */
3323       if (do_dissection)
3324         print_packet(cf, &edt);
3325       else
3326         print_packet(cf, NULL);
3327
3328       /* The ANSI C standard does not appear to *require* that a line-buffered
3329          stream be flushed to the host environment whenever a newline is
3330          written, it just says that, on such a stream, characters "are
3331          intended to be transmitted to or from the host environment as a
3332          block when a new-line character is encountered".
3333
3334          The Visual C++ 6.0 C implementation doesn't do what is intended;
3335          even if you set a stream to be line-buffered, it still doesn't
3336          flush the buffer at the end of every line.
3337
3338          So, if the "-l" flag was specified, we flush the standard output
3339          at the end of a packet.  This will do the right thing if we're
3340          printing packet summary lines, and, as we print the entire protocol
3341          tree for a single packet without waiting for anything to happen,
3342          it should be as good as line-buffered mode if we're printing
3343          protocol trees.  (The whole reason for the "-l" flag in either
3344          tcpdump or TShark is to allow the output of a live capture to
3345          be piped to a program or script and to have that script see the
3346          information for the packet as soon as it's printed, rather than
3347          having to wait until a standard I/O buffer fills up. */
3348       if (line_buffered)
3349         fflush(stdout);
3350
3351       if (ferror(stdout)) {
3352         show_print_file_io_error(errno);
3353         exit(2);
3354       }
3355     }
3356
3357     /* this must be set after print_packet() [bug #8160] */
3358     prev_dis_frame = fdata;
3359     prev_dis = &prev_dis_frame;
3360   }
3361
3362   prev_cap_frame = fdata;
3363   prev_cap = &prev_cap_frame;
3364
3365   if (do_dissection) {
3366     epan_dissect_cleanup(&edt);
3367     frame_data_destroy(&fdata);
3368   }
3369   return passed;
3370 }
3371
3372 static gboolean
3373 write_preamble(capture_file *cf)
3374 {
3375   switch (output_action) {
3376
3377   case WRITE_TEXT:
3378     return print_preamble(print_stream, cf ? cf->filename : NULL, wireshark_svnversion);
3379
3380   case WRITE_XML:
3381     if (print_details)
3382       write_pdml_preamble(stdout, cf ? cf->filename : NULL);
3383     else
3384       write_psml_preamble(stdout);
3385     return !ferror(stdout);
3386
3387   case WRITE_FIELDS:
3388     write_fields_preamble(output_fields, stdout);
3389     return !ferror(stdout);
3390
3391   default:
3392     g_assert_not_reached();
3393     return FALSE;
3394   }
3395 }
3396
3397 static char *
3398 get_line_buf(size_t len)
3399 {
3400   static char   *line_bufp    = NULL;
3401   static size_t  line_buf_len = 256;
3402   size_t         new_line_buf_len;
3403
3404   for (new_line_buf_len = line_buf_len; len > new_line_buf_len;
3405        new_line_buf_len *= 2)
3406     ;
3407   if (line_bufp == NULL) {
3408     line_buf_len = new_line_buf_len;
3409     line_bufp = (char *)g_malloc(line_buf_len + 1);
3410   } else {
3411     if (new_line_buf_len > line_buf_len) {
3412       line_buf_len = new_line_buf_len;
3413       line_bufp = (char *)g_realloc(line_bufp, line_buf_len + 1);
3414     }
3415   }
3416   return line_bufp;
3417 }
3418
3419 static gboolean
3420 print_columns(capture_file *cf)
3421 {
3422   char   *line_bufp;
3423   int     i;
3424   size_t  buf_offset;
3425   size_t  column_len;
3426
3427   line_bufp = get_line_buf(256);
3428   buf_offset = 0;
3429   *line_bufp = '\0';
3430   for (i = 0; i < cf->cinfo.num_cols; i++) {
3431     /* Skip columns not marked as visible. */
3432     if (!get_column_visible(i))
3433       continue;
3434     switch (cf->cinfo.col_fmt[i]) {
3435     case COL_NUMBER:
3436 #ifdef HAVE_LIBPCAP
3437       /*
3438        * Don't print this if we're doing a live capture from a network
3439        * interface - if we're doing a live capture, you won't be
3440        * able to look at the capture in the future (it's not being
3441        * saved anywhere), so the frame numbers are unlikely to be
3442        * useful.
3443        *
3444        * (XXX - it might be nice to be able to save and print at
3445        * the same time, sort of like an "Update list of packets
3446        * in real time" capture in Wireshark.)
3447        */
3448       if (global_capture_opts.ifaces->len > 0)
3449         continue;
3450 #endif
3451       column_len = strlen(cf->cinfo.col_data[i]);
3452       if (column_len < 3)
3453         column_len = 3;
3454       line_bufp = get_line_buf(buf_offset + column_len);
3455       g_snprintf(line_bufp + buf_offset, (int)column_len + 1, "%3s", cf->cinfo.col_data[i]);
3456       break;
3457
3458     case COL_CLS_TIME:
3459     case COL_REL_TIME:
3460     case COL_ABS_TIME:
3461     case COL_ABS_DATE_TIME:
3462     case COL_UTC_TIME:
3463     case COL_UTC_DATE_TIME: /* XXX - wider */
3464       column_len = strlen(cf->cinfo.col_data[i]);
3465       if (column_len < 10)
3466         column_len = 10;
3467       line_bufp = get_line_buf(buf_offset + column_len);
3468       g_snprintf(line_bufp + buf_offset, (int)column_len + 1, "%10s", cf->cinfo.col_data[i]);
3469       break;
3470
3471     case COL_DEF_SRC:
3472     case COL_RES_SRC:
3473     case COL_UNRES_SRC:
3474     case COL_DEF_DL_SRC:
3475     case COL_RES_DL_SRC:
3476     case COL_UNRES_DL_SRC:
3477     case COL_DEF_NET_SRC:
3478     case COL_RES_NET_SRC:
3479     case COL_UNRES_NET_SRC:
3480       column_len = strlen(cf->cinfo.col_data[i]);
3481       if (column_len < 12)
3482         column_len = 12;
3483       line_bufp = get_line_buf(buf_offset + column_len);
3484       g_snprintf(line_bufp + buf_offset, (int)column_len + 1, "%12s", cf->cinfo.col_data[i]);
3485       break;
3486
3487     case COL_DEF_DST:
3488     case COL_RES_DST:
3489     case COL_UNRES_DST:
3490     case COL_DEF_DL_DST:
3491     case COL_RES_DL_DST:
3492     case COL_UNRES_DL_DST:
3493     case COL_DEF_NET_DST:
3494     case COL_RES_NET_DST:
3495     case COL_UNRES_NET_DST:
3496       column_len = strlen(cf->cinfo.col_data[i]);
3497       if (column_len < 12)
3498         column_len = 12;
3499       line_bufp = get_line_buf(buf_offset + column_len);
3500       g_snprintf(line_bufp + buf_offset, (int)column_len + 1, "%-12s", cf->cinfo.col_data[i]);
3501       break;
3502
3503     default:
3504       column_len = strlen(cf->cinfo.col_data[i]);
3505       line_bufp = get_line_buf(buf_offset + column_len);
3506       g_strlcat(line_bufp + buf_offset, cf->cinfo.col_data[i], column_len + 1);
3507       break;
3508     }
3509     buf_offset += column_len;
3510     if (i != cf->cinfo.num_cols - 1) {
3511       /*
3512        * This isn't the last column, so we need to print a
3513        * separator between this column and the next.
3514        *
3515        * If we printed a network source and are printing a
3516        * network destination of the same type next, separate
3517        * them with " -> "; if we printed a network destination
3518        * and are printing a network source of the same type
3519        * next, separate them with " <- "; otherwise separate them
3520        * with a space.
3521        *
3522        * We add enough space to the buffer for " <- " or " -> ",
3523        * even if we're only adding " ".
3524        */
3525       line_bufp = get_line_buf(buf_offset + 4);
3526       switch (cf->cinfo.col_fmt[i]) {
3527
3528       case COL_DEF_SRC:
3529       case COL_RES_SRC:
3530       case COL_UNRES_SRC:
3531         switch (cf->cinfo.col_fmt[i + 1]) {
3532
3533         case COL_DEF_DST:
3534         case COL_RES_DST:
3535         case COL_UNRES_DST:
3536           g_strlcat(line_bufp + buf_offset, " -> ", 5);
3537           buf_offset += 4;
3538           break;
3539
3540         default:
3541           g_strlcat(line_bufp + buf_offset, " ", 5);
3542           buf_offset += 1;
3543           break;
3544         }
3545         break;
3546
3547       case COL_DEF_DL_SRC:
3548       case COL_RES_DL_SRC:
3549       case COL_UNRES_DL_SRC:
3550         switch (cf->cinfo.col_fmt[i + 1]) {
3551
3552         case COL_DEF_DL_DST:
3553         case COL_RES_DL_DST:
3554         case COL_UNRES_DL_DST:
3555           g_strlcat(line_bufp + buf_offset, " -> ", 5);
3556           buf_offset += 4;
3557           break;
3558
3559         default:
3560           g_strlcat(line_bufp + buf_offset, " ", 5);
3561           buf_offset += 1;
3562           break;
3563         }
3564         break;
3565
3566       case COL_DEF_NET_SRC:
3567       case COL_RES_NET_SRC:
3568       case COL_UNRES_NET_SRC:
3569         switch (cf->cinfo.col_fmt[i + 1]) {
3570
3571         case COL_DEF_NET_DST:
3572         case COL_RES_NET_DST:
3573         case COL_UNRES_NET_DST:
3574           g_strlcat(line_bufp + buf_offset, " -> ", 5);
3575           buf_offset += 4;
3576           break;
3577
3578         default:
3579           g_strlcat(line_bufp + buf_offset, " ", 5);
3580           buf_offset += 1;
3581           break;
3582         }
3583         break;
3584
3585       case COL_DEF_DST:
3586       case COL_RES_DST:
3587       case COL_UNRES_DST:
3588         switch (cf->cinfo.col_fmt[i + 1]) {
3589
3590         case COL_DEF_SRC:
3591         case COL_RES_SRC:
3592         case COL_UNRES_SRC:
3593           g_strlcat(line_bufp + buf_offset, " <- ", 5);
3594           buf_offset += 4;
3595           break;
3596
3597         default:
3598           g_strlcat(line_bufp + buf_offset, " ", 5);
3599           buf_offset += 1;
3600           break;
3601         }
3602         break;
3603
3604       case COL_DEF_DL_DST:
3605       case COL_RES_DL_DST:
3606       case COL_UNRES_DL_DST:
3607         switch (cf->cinfo.col_fmt[i + 1]) {
3608
3609         case COL_DEF_DL_SRC:
3610         case COL_RES_DL_SRC:
3611         case COL_UNRES_DL_SRC:
3612           g_strlcat(line_bufp + buf_offset, " <- ", 5);
3613           buf_offset += 4;
3614           break;
3615
3616         default:
3617           g_strlcat(line_bufp + buf_offset, " ", 5);
3618           buf_offset += 1;
3619           break;
3620         }
3621         break;
3622
3623       case COL_DEF_NET_DST:
3624       case COL_RES_NET_DST:
3625       case COL_UNRES_NET_DST:
3626         switch (cf->cinfo.col_fmt[i + 1]) {
3627
3628         case COL_DEF_NET_SRC:
3629         case COL_RES_NET_SRC:
3630         case COL_UNRES_NET_SRC:
3631           g_strlcat(line_bufp + buf_offset, " <- ", 5);
3632           buf_offset += 4;
3633           break;
3634
3635         default:
3636           g_strlcat(line_bufp + buf_offset, " ", 5);
3637           buf_offset += 1;
3638           break;
3639         }
3640         break;
3641
3642       default:
3643         g_strlcat(line_bufp + buf_offset, " ", 5);
3644         buf_offset += 1;
3645         break;
3646       }
3647     }
3648   }
3649   return print_line(print_stream, 0, line_bufp);
3650 }
3651
3652 static gboolean
3653 print_packet(capture_file *cf, epan_dissect_t *edt)
3654 {
3655   print_args_t print_args;
3656
3657   if (print_summary || output_fields_has_cols(output_fields)) {
3658     /* Just fill in the columns. */
3659     epan_dissect_fill_in_columns(edt, FALSE, TRUE);
3660
3661     if (print_summary) {
3662       /* Now print them. */
3663       switch (output_action) {
3664
3665       case WRITE_TEXT:
3666         if (!print_columns(cf))
3667           return FALSE;
3668         break;
3669
3670       case WRITE_XML:
3671         proto_tree_write_psml(edt, stdout);
3672         return !ferror(stdout);
3673       case WRITE_FIELDS: /*No non-verbose "fields" format */
3674         g_assert_not_reached();
3675         break;
3676       }
3677     }
3678   }
3679   if (print_details) {
3680     /* Print the information in the protocol tree. */
3681     switch (output_action) {
3682
3683     case WRITE_TEXT:
3684       /* Only initialize the fields that are actually used in proto_tree_print.
3685        * This is particularly important for .range, as that's heap memory which
3686        * we would otherwise have to g_free().
3687       print_args.to_file = TRUE;
3688       print_args.format = print_format;
3689       print_args.print_summary = print_summary;
3690       print_args.print_formfeed = FALSE;
3691       packet_range_init(&print_args.range, &cfile);
3692       */
3693       print_args.print_hex = print_hex;
3694       print_args.print_dissections = print_details ? print_dissections_expanded : print_dissections_none;
3695
3696       if (!proto_tree_print(&print_args, edt, print_stream))
3697         return FALSE;
3698       if (!print_hex) {
3699         if (!print_line(print_stream, 0, separator))
3700           return FALSE;
3701       }
3702       break;
3703
3704     case WRITE_XML:
3705       proto_tree_write_pdml(edt, stdout);
3706       printf("\n");
3707       return !ferror(stdout);
3708     case WRITE_FIELDS:
3709       proto_tree_write_fields(output_fields, edt, &cf->cinfo, stdout);
3710       printf("\n");
3711       return !ferror(stdout);
3712     }
3713   }
3714   if (print_hex) {
3715     if (print_summary || print_details) {
3716       if (!print_line(print_stream, 0, ""))
3717         return FALSE;
3718     }
3719     if (!print_hex_data(print_stream, edt))
3720       return FALSE;
3721     if (!print_line(print_stream, 0, separator))
3722       return FALSE;
3723   }
3724   return TRUE;
3725 }
3726
3727 static gboolean
3728 write_finale(void)
3729 {
3730   switch (output_action) {
3731
3732   case WRITE_TEXT:
3733     return print_finale(print_stream);
3734
3735   case WRITE_XML:
3736     if (print_details)
3737       write_pdml_finale(stdout);
3738     else
3739       write_psml_finale(stdout);
3740     return !ferror(stdout);
3741
3742   case WRITE_FIELDS:
3743     write_fields_finale(output_fields, stdout);
3744     return !ferror(stdout);
3745
3746   default:
3747     g_assert_not_reached();
3748     return FALSE;
3749   }
3750 }
3751
3752 cf_status_t
3753 cf_open(capture_file *cf, const char *fname, gboolean is_tempfile, int *err)
3754 {
3755   wtap  *wth;
3756   gchar *err_info;
3757   char   err_msg[2048+1];
3758
3759   wth = wtap_open_offline(fname, err, &err_info, perform_two_pass_analysis);
3760   if (wth == NULL)
3761     goto fail;
3762
3763   /* The open succeeded.  Fill in the information for this file. */
3764
3765   /* Create new epan session for dissection. */
3766   epan_free(cf->epan);
3767   cf->epan = tshark_epan_new(cf);
3768
3769   cf->wth = wth;
3770   cf->f_datalen = 0; /* not used, but set it anyway */
3771
3772   /* Set the file name because we need it to set the follow stream filter.
3773      XXX - is that still true?  We need it for other reasons, though,
3774      in any case. */
3775   cf->filename = g_strdup(fname);
3776
3777   /* Indicate whether it's a permanent or temporary file. */
3778   cf->is_tempfile = is_tempfile;
3779
3780   /* No user changes yet. */
3781   cf->unsaved_changes = FALSE;
3782
3783   cf->cd_t      = wtap_file_type(cf->wth);
3784   cf->count     = 0;
3785   cf->drops_known = FALSE;
3786   cf->drops     = 0;
3787   cf->snap      = wtap_snapshot_length(cf->wth);
3788   if (cf->snap == 0) {
3789     /* Snapshot length not known. */
3790     cf->has_snap = FALSE;
3791     cf->snap = WTAP_MAX_PACKET_SIZE;
3792   } else
3793     cf->has_snap = TRUE;
3794   nstime_set_zero(&cf->elapsed_time);
3795   ref = NULL;
3796   prev_dis = NULL;
3797   prev_cap = NULL;
3798
3799   cf->state = FILE_READ_IN_PROGRESS;
3800
3801   wtap_set_cb_new_ipv4(cf->wth, add_ipv4_name);
3802   wtap_set_cb_new_ipv6(cf->wth, (wtap_new_ipv6_callback_t) add_ipv6_name);
3803
3804   return CF_OK;
3805
3806 fail:
3807   g_snprintf(err_msg, sizeof err_msg,
3808              cf_open_error_message(*err, err_info, FALSE, cf->cd_t), fname);
3809   cmdarg_err("%s", err_msg);
3810   return CF_ERROR;
3811 }
3812
3813 static void
3814 show_capture_file_io_error(const char *fname, int err, gboolean is_close)
3815 {
3816   char *save_file_string;
3817
3818   save_file_string = output_file_description(fname);
3819
3820   switch (err) {
3821
3822   case ENOSPC:
3823     cmdarg_err("Not all the packets could be written to the %s because there is "
3824                "no space left on the file system.",
3825                save_file_string);
3826     break;
3827
3828 #ifdef EDQUOT
3829   case EDQUOT:
3830     cmdarg_err("Not all the packets could be written to the %s because you are "
3831                "too close to, or over your disk quota.",
3832                save_file_string);
3833   break;
3834 #endif
3835
3836   case WTAP_ERR_CANT_CLOSE:
3837     cmdarg_err("The %s couldn't be closed for some unknown reason.",
3838                save_file_string);
3839     break;
3840
3841   case WTAP_ERR_SHORT_WRITE:
3842     cmdarg_err("Not all the packets could be written to the %s.",
3843                save_file_string);
3844     break;
3845
3846   default:
3847     if (is_close) {
3848       cmdarg_err("The %s could not be closed: %s.", save_file_string,
3849                  wtap_strerror(err));
3850     } else {
3851       cmdarg_err("An error occurred while writing to the %s: %s.",
3852                  save_file_string, wtap_strerror(err));
3853     }
3854     break;
3855   }
3856   g_free(save_file_string);
3857 }
3858
3859 static void
3860 show_print_file_io_error(int err)
3861 {
3862   switch (err) {
3863
3864   case ENOSPC:
3865     cmdarg_err("Not all the packets could be printed because there is "
3866 "no space left on the file system.");
3867     break;
3868
3869 #ifdef EDQUOT
3870   case EDQUOT:
3871     cmdarg_err("Not all the packets could be printed because you are "
3872 "too close to, or over your disk quota.");
3873   break;
3874 #endif
3875
3876   default:
3877     cmdarg_err("An error occurred while printing packets: %s.",
3878       g_strerror(err));
3879     break;
3880   }
3881 }
3882
3883 static const char *
3884 cf_open_error_message(int err, gchar *err_info, gboolean for_writing,
3885                       int file_type)
3886 {
3887   const char *errmsg;
3888   static char errmsg_errno[1024+1];
3889
3890   if (err < 0) {
3891     /* Wiretap error. */
3892     switch (err) {
3893
3894     case WTAP_ERR_NOT_REGULAR_FILE:
3895       errmsg = "The file \"%s\" is a \"special file\" or socket or other non-regular file.";
3896       break;
3897
3898     case WTAP_ERR_RANDOM_OPEN_PIPE:
3899       /* Seen only when opening a capture file for reading. */
3900       errmsg = "The file \"%s\" is a pipe or FIFO; TShark can't read pipe or FIFO files in two-pass mode.";
3901       break;
3902
3903     case WTAP_ERR_FILE_UNKNOWN_FORMAT:
3904       /* Seen only when opening a capture file for reading. */
3905       errmsg = "The file \"%s\" isn't a capture file in a format TShark understands.";
3906       break;
3907
3908     case WTAP_ERR_UNSUPPORTED:
3909       /* Seen only when opening a capture file for reading. */
3910       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3911                "The file \"%%s\" isn't a capture file in a format TShark understands.\n"
3912                "(%s)", err_info);
3913       g_free(err_info);
3914       errmsg = errmsg_errno;
3915       break;
3916
3917     case WTAP_ERR_CANT_WRITE_TO_PIPE:
3918       /* Seen only when opening a capture file for writing. */
3919       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3920                  "The file \"%%s\" is a pipe, and \"%s\" capture files can't be "
3921                  "written to a pipe.", wtap_file_type_short_string(file_type));
3922       errmsg = errmsg_errno;
3923       break;
3924
3925     case WTAP_ERR_UNSUPPORTED_FILE_TYPE:
3926       /* Seen only when opening a capture file for writing. */
3927       errmsg = "TShark doesn't support writing capture files in that format.";
3928       break;
3929
3930     case WTAP_ERR_UNSUPPORTED_ENCAP:
3931       if (for_writing) {
3932         g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3933                    "TShark can't save this capture as a \"%s\" file.",
3934                    wtap_file_type_short_string(file_type));
3935       } else {
3936         g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3937                  "The file \"%%s\" is a capture for a network type that TShark doesn't support.\n"
3938                  "(%s)", err_info);
3939         g_free(err_info);
3940       }
3941       errmsg = errmsg_errno;
3942       break;
3943
3944     case WTAP_ERR_ENCAP_PER_PACKET_UNSUPPORTED:
3945       if (for_writing) {
3946         g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3947                    "TShark can't save this capture as a \"%s\" file.",
3948                    wtap_file_type_short_string(file_type));
3949         errmsg = errmsg_errno;
3950       } else
3951         errmsg = "The file \"%s\" is a capture for a network type that TShark doesn't support.";
3952       break;
3953
3954     case WTAP_ERR_BAD_FILE:
3955       /* Seen only when opening a capture file for reading. */
3956       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3957                "The file \"%%s\" appears to be damaged or corrupt.\n"
3958                "(%s)", err_info);
3959       g_free(err_info);
3960       errmsg = errmsg_errno;
3961       break;
3962
3963     case WTAP_ERR_CANT_OPEN:
3964       if (for_writing)
3965         errmsg = "The file \"%s\" could not be created for some unknown reason.";
3966       else
3967         errmsg = "The file \"%s\" could not be opened for some unknown reason.";
3968       break;
3969
3970     case WTAP_ERR_SHORT_READ:
3971       errmsg = "The file \"%s\" appears to have been cut short"
3972                " in the middle of a packet or other data.";
3973       break;
3974
3975     case WTAP_ERR_SHORT_WRITE:
3976       errmsg = "A full header couldn't be written to the file \"%s\".";
3977       break;
3978
3979     case WTAP_ERR_COMPRESSION_NOT_SUPPORTED:
3980       errmsg = "This file type cannot be written as a compressed file.";
3981       break;
3982
3983     case WTAP_ERR_DECOMPRESS:
3984       /* Seen only when opening a capture file for reading. */
3985       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3986                  "The compressed file \"%%s\" appears to be damaged or corrupt.\n"
3987                  "(%s)", err_info);
3988       g_free(err_info);
3989       errmsg = errmsg_errno;
3990       break;
3991
3992     default:
3993       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3994                  "The file \"%%s\" could not be %s: %s.",
3995                  for_writing ? "created" : "opened",
3996                  wtap_strerror(err));
3997       errmsg = errmsg_errno;
3998       break;
3999     }
4000   } else
4001     errmsg = file_open_error_message(err, for_writing);
4002   return errmsg;
4003 }
4004
4005 /*
4006  * Open/create errors are reported with an console message in TShark.
4007  */
4008 static void
4009 open_failure_message(const char *filename, int err, gboolean for_writing)
4010 {
4011   fprintf(stderr, "tshark: ");
4012   fprintf(stderr, file_open_error_message(err, for_writing), filename);
4013   fprintf(stderr, "\n");
4014 }
4015
4016
4017 /*
4018  * General errors are reported with an console message in TShark.
4019  */
4020 static void
4021 failure_message(const char *msg_format, va_list ap)
4022 {
4023   fprintf(stderr, "tshark: ");
4024   vfprintf(stderr, msg_format, ap);
4025   fprintf(stderr, "\n");
4026 }
4027
4028 /*
4029  * Read errors are reported with an console message in TShark.
4030  */
4031 static void
4032 read_failure_message(const char *filename, int err)
4033 {
4034   cmdarg_err("An error occurred while reading from the file \"%s\": %s.",
4035           filename, g_strerror(err));
4036 }
4037
4038 /*
4039  * Write errors are reported with an console message in TShark.
4040  */
4041 static void
4042 write_failure_message(const char *filename, int err)
4043 {
4044   cmdarg_err("An error occurred while writing to the file \"%s\": %s.",
4045           filename, g_strerror(err));
4046 }
4047
4048 /*
4049  * Report an error in command-line arguments.
4050  */
4051 void
4052 cmdarg_err(const char *fmt, ...)
4053 {
4054   va_list ap;
4055
4056   va_start(ap, fmt);
4057   failure_message(fmt, ap);
4058   va_end(ap);
4059 }
4060
4061 /*
4062  * Report additional information for an error in command-line arguments.
4063  */
4064 void
4065 cmdarg_err_cont(const char *fmt, ...)
4066 {
4067   va_list ap;
4068
4069   va_start(ap, fmt);
4070   vfprintf(stderr, fmt, ap);
4071   fprintf(stderr, "\n");
4072   va_end(ap);
4073 }
4074
4075
4076 /*
4077  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
4078  *
4079  * Local variables:
4080  * c-basic-offset: 2
4081  * tab-width: 8
4082  * indent-tabs-mode: nil
4083  * End:
4084  *
4085  * vi: set shiftwidth=2 tabstop=8 expandtab:
4086  * :indentSize=2:tabSize=8:noTabs=true:
4087  */