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