Regenerate the ANSI MAP, LDAP, and TETRA dissectors so that Coverity can
[obnox/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("\"%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 \"%s\" failed for some unknown reason.",
2776                  cf->filename);
2777       break;
2778
2779     case WTAP_ERR_SHORT_READ:
2780       cmdarg_err("\"%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("\"%s\" appears to be damaged or corrupt.\n(%s)",
2786                  cf->filename, err_info);
2787       g_free(err_info);
2788       break;
2789
2790     default:
2791       cmdarg_err("An error occurred while reading \"%s\": %s.",
2792                  cf->filename, wtap_strerror(err));
2793       break;
2794     }
2795     if (save_file != NULL) {
2796       /* Now close the capture file. */
2797       if (!wtap_dump_close(pdh, &err))
2798         show_capture_file_io_error(save_file, err, TRUE);
2799     }
2800   } else {
2801     if (save_file != NULL) {
2802       /* Now close the capture file. */
2803       if (!wtap_dump_close(pdh, &err))
2804         show_capture_file_io_error(save_file, err, TRUE);
2805     } else {
2806       if (print_packet_info) {
2807         if (!write_finale()) {
2808           err = errno;
2809           show_print_file_io_error(err);
2810         }
2811       }
2812     }
2813   }
2814
2815 out:
2816   wtap_close(cf->wth);
2817   cf->wth = NULL;
2818
2819   g_free(save_file_string);
2820
2821   return err;
2822 }
2823
2824 static gboolean
2825 process_packet(capture_file *cf, gint64 offset, const struct wtap_pkthdr *whdr,
2826                union wtap_pseudo_header *pseudo_header, const guchar *pd,
2827                gboolean filtering_tap_listeners, guint tap_flags)
2828 {
2829   frame_data fdata;
2830   gboolean create_proto_tree;
2831   column_info *cinfo;
2832   epan_dissect_t edt;
2833   gboolean passed;
2834
2835   /* Count this packet. */
2836   cf->count++;
2837
2838   /* If we're not running a display filter and we're not printing any
2839      packet information, we don't need to do a dissection. This means
2840      that all packets can be marked as 'passed'. */
2841   passed = TRUE;
2842
2843   frame_data_init(&fdata, cf->count, whdr, offset, cum_bytes);
2844
2845   /* If we're going to print packet information, or we're going to
2846      run a read filter, or we're going to process taps, set up to
2847      do a dissection and do so. */
2848   if (do_dissection) {
2849     if (print_packet_info && gbl_resolv_flags)
2850       /* Grab any resolved addresses */
2851       host_name_lookup_process(NULL);
2852
2853     if (cf->rfcode || verbose || filtering_tap_listeners ||
2854         (tap_flags & TL_REQUIRES_PROTO_TREE) || have_custom_cols(&cf->cinfo))
2855       create_proto_tree = TRUE;
2856     else
2857       create_proto_tree = FALSE;
2858
2859     /* The protocol tree will be "visible", i.e., printed, only if we're
2860        printing packet details, which is true if we're printing stuff
2861        ("print_packet_info" is true) and we're in verbose mode ("verbose"
2862        is true). */
2863     epan_dissect_init(&edt, create_proto_tree, print_packet_info && verbose);
2864
2865     /* If we're running a read filter, prime the epan_dissect_t with that
2866        filter. */
2867     if (cf->rfcode)
2868       epan_dissect_prime_dfilter(&edt, cf->rfcode);
2869
2870     col_custom_prime_edt(&edt, &cf->cinfo);
2871
2872     tap_queue_init(&edt);
2873
2874     /* We only need the columns if either
2875
2876          1) some tap needs the columns
2877
2878        or
2879
2880          2) we're printing packet info but we're *not* verbose; in verbose
2881             mode, we print the protocol tree, not the protocol summary. */
2882     if ((tap_flags & TL_REQUIRES_COLUMNS) || (print_packet_info && !verbose))
2883       cinfo = &cf->cinfo;
2884     else
2885       cinfo = NULL;
2886
2887     frame_data_set_before_dissect(&fdata, &cf->elapsed_time,
2888                                   &first_ts, &prev_dis_ts, &prev_cap_ts);
2889
2890     epan_dissect_run(&edt, pseudo_header, pd, &fdata, cinfo);
2891
2892     tap_push_tapped_queue(&edt);
2893
2894     /* Run the read filter if we have one. */
2895     if (cf->rfcode)
2896       passed = dfilter_apply_edt(cf->rfcode, &edt);
2897   }
2898
2899   if (passed) {
2900     frame_data_set_after_dissect(&fdata, &cum_bytes, &prev_dis_ts);
2901
2902     /* Process this packet. */
2903     if (print_packet_info) {
2904       /* We're printing packet information; print the information for
2905          this packet. */
2906       if (do_dissection)
2907         print_packet(cf, &edt);
2908       else
2909         print_packet(cf, NULL);
2910
2911       /* The ANSI C standard does not appear to *require* that a line-buffered
2912          stream be flushed to the host environment whenever a newline is
2913          written, it just says that, on such a stream, characters "are
2914          intended to be transmitted to or from the host environment as a
2915          block when a new-line character is encountered".
2916
2917          The Visual C++ 6.0 C implementation doesn't do what is intended;
2918          even if you set a stream to be line-buffered, it still doesn't
2919          flush the buffer at the end of every line.
2920
2921          So, if the "-l" flag was specified, we flush the standard output
2922          at the end of a packet.  This will do the right thing if we're
2923          printing packet summary lines, and, as we print the entire protocol
2924          tree for a single packet without waiting for anything to happen,
2925          it should be as good as line-buffered mode if we're printing
2926          protocol trees.  (The whole reason for the "-l" flag in either
2927          tcpdump or TShark is to allow the output of a live capture to
2928          be piped to a program or script and to have that script see the
2929          information for the packet as soon as it's printed, rather than
2930          having to wait until a standard I/O buffer fills up. */
2931       if (line_buffered)
2932         fflush(stdout);
2933
2934       if (ferror(stdout)) {
2935         show_print_file_io_error(errno);
2936         exit(2);
2937       }
2938     }
2939   }
2940
2941   if (do_dissection) {
2942     epan_dissect_cleanup(&edt);
2943     frame_data_cleanup(&fdata);
2944   }
2945   return passed;
2946 }
2947
2948 static gboolean
2949 write_preamble(capture_file *cf)
2950 {
2951   switch (output_action) {
2952
2953   case WRITE_TEXT:
2954     return print_preamble(print_stream, cf ? cf->filename : NULL);
2955
2956   case WRITE_XML:
2957     if (verbose)
2958       write_pdml_preamble(stdout);
2959     else
2960       write_psml_preamble(stdout);
2961     return !ferror(stdout);
2962
2963   case WRITE_FIELDS:
2964     write_fields_preamble(output_fields, stdout);
2965     return !ferror(stdout);
2966
2967   default:
2968     g_assert_not_reached();
2969     return FALSE;
2970   }
2971 }
2972
2973 static char *
2974 get_line_buf(size_t len)
2975 {
2976   static char *line_bufp = NULL;
2977   static size_t line_buf_len = 256;
2978   size_t new_line_buf_len;
2979
2980   for (new_line_buf_len = line_buf_len; len > new_line_buf_len;
2981        new_line_buf_len *= 2)
2982     ;
2983   if (line_bufp == NULL) {
2984     line_buf_len = new_line_buf_len;
2985     line_bufp = g_malloc(line_buf_len + 1);
2986   } else {
2987     if (new_line_buf_len > line_buf_len) {
2988       line_buf_len = new_line_buf_len;
2989       line_bufp = g_realloc(line_bufp, line_buf_len + 1);
2990     }
2991   }
2992   return line_bufp;
2993 }
2994
2995 static gboolean
2996 print_columns(capture_file *cf)
2997 {
2998   char *line_bufp;
2999   int i;
3000   size_t buf_offset;
3001   size_t column_len;
3002
3003   line_bufp = get_line_buf(256);
3004   buf_offset = 0;
3005   *line_bufp = '\0';
3006   for (i = 0; i < cf->cinfo.num_cols; i++) {
3007     switch (cf->cinfo.col_fmt[i]) {
3008     case COL_NUMBER:
3009 #ifdef HAVE_LIBPCAP
3010       /*
3011        * Don't print this if we're doing a live capture from a network
3012        * interface - if we're doing a live capture, you won't be
3013        * able to look at the capture in the future (it's not being
3014        * saved anywhere), so the frame numbers are unlikely to be
3015        * useful.
3016        *
3017        * (XXX - it might be nice to be able to save and print at
3018        * the same time, sort of like an "Update list of packets
3019        * in real time" capture in Wireshark.)
3020        */
3021       if (global_capture_opts.iface != NULL)
3022         continue;
3023 #endif
3024       column_len = strlen(cf->cinfo.col_data[i]);
3025       if (column_len < 3)
3026         column_len = 3;
3027       line_bufp = get_line_buf(buf_offset + column_len);
3028       sprintf(line_bufp + buf_offset, "%3s", cf->cinfo.col_data[i]);
3029       break;
3030
3031     case COL_CLS_TIME:
3032     case COL_REL_TIME:
3033     case COL_ABS_TIME:
3034     case COL_ABS_DATE_TIME: /* XXX - wider */
3035       column_len = strlen(cf->cinfo.col_data[i]);
3036       if (column_len < 10)
3037         column_len = 10;
3038       line_bufp = get_line_buf(buf_offset + column_len);
3039       sprintf(line_bufp + buf_offset, "%10s", cf->cinfo.col_data[i]);
3040       break;
3041
3042     case COL_DEF_SRC:
3043     case COL_RES_SRC:
3044     case COL_UNRES_SRC:
3045     case COL_DEF_DL_SRC:
3046     case COL_RES_DL_SRC:
3047     case COL_UNRES_DL_SRC:
3048     case COL_DEF_NET_SRC:
3049     case COL_RES_NET_SRC:
3050     case COL_UNRES_NET_SRC:
3051       column_len = strlen(cf->cinfo.col_data[i]);
3052       if (column_len < 12)
3053         column_len = 12;
3054       line_bufp = get_line_buf(buf_offset + column_len);
3055       sprintf(line_bufp + buf_offset, "%12s", cf->cinfo.col_data[i]);
3056       break;
3057
3058     case COL_DEF_DST:
3059     case COL_RES_DST:
3060     case COL_UNRES_DST:
3061     case COL_DEF_DL_DST:
3062     case COL_RES_DL_DST:
3063     case COL_UNRES_DL_DST:
3064     case COL_DEF_NET_DST:
3065     case COL_RES_NET_DST:
3066     case COL_UNRES_NET_DST:
3067       column_len = strlen(cf->cinfo.col_data[i]);
3068       if (column_len < 12)
3069         column_len = 12;
3070       line_bufp = get_line_buf(buf_offset + column_len);
3071       sprintf(line_bufp + buf_offset, "%-12s", cf->cinfo.col_data[i]);
3072       break;
3073
3074     default:
3075       column_len = strlen(cf->cinfo.col_data[i]);
3076       line_bufp = get_line_buf(buf_offset + column_len);
3077       strcat(line_bufp + buf_offset, cf->cinfo.col_data[i]);
3078       break;
3079     }
3080     buf_offset += column_len;
3081     if (i != cf->cinfo.num_cols - 1) {
3082       /*
3083        * This isn't the last column, so we need to print a
3084        * separator between this column and the next.
3085        *
3086        * If we printed a network source and are printing a
3087        * network destination of the same type next, separate
3088        * them with "->"; if we printed a network destination
3089        * and are printing a network source of the same type
3090        * next, separate them with "<-"; otherwise separate them
3091        * with a space.
3092        *
3093        * We add enough space to the buffer for " <- " or " -> ",
3094        * even if we're only adding " ".
3095        */
3096       line_bufp = get_line_buf(buf_offset + 4);
3097       switch (cf->cinfo.col_fmt[i]) {
3098
3099       case COL_DEF_SRC:
3100       case COL_RES_SRC:
3101       case COL_UNRES_SRC:
3102         switch (cf->cinfo.col_fmt[i + 1]) {
3103
3104         case COL_DEF_DST:
3105         case COL_RES_DST:
3106         case COL_UNRES_DST:
3107           strcat(line_bufp + buf_offset, " -> ");
3108           buf_offset += 4;
3109           break;
3110
3111         default:
3112           strcat(line_bufp + buf_offset, " ");
3113           buf_offset += 1;
3114           break;
3115         }
3116         break;
3117
3118       case COL_DEF_DL_SRC:
3119       case COL_RES_DL_SRC:
3120       case COL_UNRES_DL_SRC:
3121         switch (cf->cinfo.col_fmt[i + 1]) {
3122
3123         case COL_DEF_DL_DST:
3124         case COL_RES_DL_DST:
3125         case COL_UNRES_DL_DST:
3126           strcat(line_bufp + buf_offset, " -> ");
3127           buf_offset += 4;
3128           break;
3129
3130         default:
3131           strcat(line_bufp + buf_offset, " ");
3132           buf_offset += 1;
3133           break;
3134         }
3135         break;
3136
3137       case COL_DEF_NET_SRC:
3138       case COL_RES_NET_SRC:
3139       case COL_UNRES_NET_SRC:
3140         switch (cf->cinfo.col_fmt[i + 1]) {
3141
3142         case COL_DEF_NET_DST:
3143         case COL_RES_NET_DST:
3144         case COL_UNRES_NET_DST:
3145           strcat(line_bufp + buf_offset, " -> ");
3146           buf_offset += 4;
3147           break;
3148
3149         default:
3150           strcat(line_bufp + buf_offset, " ");
3151           buf_offset += 1;
3152           break;
3153         }
3154         break;
3155
3156       case COL_DEF_DST:
3157       case COL_RES_DST:
3158       case COL_UNRES_DST:
3159         switch (cf->cinfo.col_fmt[i + 1]) {
3160
3161         case COL_DEF_SRC:
3162         case COL_RES_SRC:
3163         case COL_UNRES_SRC:
3164           strcat(line_bufp + buf_offset, " <- ");
3165           buf_offset += 4;
3166           break;
3167
3168         default:
3169           strcat(line_bufp + buf_offset, " ");
3170           buf_offset += 1;
3171           break;
3172         }
3173         break;
3174
3175       case COL_DEF_DL_DST:
3176       case COL_RES_DL_DST:
3177       case COL_UNRES_DL_DST:
3178         switch (cf->cinfo.col_fmt[i + 1]) {
3179
3180         case COL_DEF_DL_SRC:
3181         case COL_RES_DL_SRC:
3182         case COL_UNRES_DL_SRC:
3183           strcat(line_bufp + buf_offset, " <- ");
3184           buf_offset += 4;
3185           break;
3186
3187         default:
3188           strcat(line_bufp + buf_offset, " ");
3189           buf_offset += 1;
3190           break;
3191         }
3192         break;
3193
3194       case COL_DEF_NET_DST:
3195       case COL_RES_NET_DST:
3196       case COL_UNRES_NET_DST:
3197         switch (cf->cinfo.col_fmt[i + 1]) {
3198
3199         case COL_DEF_NET_SRC:
3200         case COL_RES_NET_SRC:
3201         case COL_UNRES_NET_SRC:
3202           strcat(line_bufp + buf_offset, " <- ");
3203           buf_offset += 4;
3204           break;
3205
3206         default:
3207           strcat(line_bufp + buf_offset, " ");
3208           buf_offset += 1;
3209           break;
3210         }
3211         break;
3212
3213       default:
3214         strcat(line_bufp + buf_offset, " ");
3215         buf_offset += 1;
3216         break;
3217       }
3218     }
3219   }
3220   return print_line(print_stream, 0, line_bufp);
3221 }
3222
3223 static gboolean
3224 print_packet(capture_file *cf, epan_dissect_t *edt)
3225 {
3226   print_args_t  print_args;
3227
3228   if (verbose) {
3229     /* Print the information in the protocol tree. */
3230     switch (output_action) {
3231
3232     case WRITE_TEXT:
3233       print_args.to_file = TRUE;
3234       print_args.format = print_format;
3235       print_args.print_summary = !verbose;
3236       print_args.print_hex = verbose && print_hex;
3237       print_args.print_formfeed = FALSE;
3238       print_args.print_dissections = verbose ? print_dissections_expanded : print_dissections_none;
3239
3240       /* init the packet range */
3241       packet_range_init(&print_args.range);
3242
3243       if (!proto_tree_print(&print_args, edt, print_stream))
3244         return FALSE;
3245       if (!print_hex) {
3246         /* "print_hex_data()" will put out a leading blank line, as well
3247          as a trailing one; print one here, to separate the packets,
3248          only if "print_hex_data()" won't be called. */
3249         if (!print_line(print_stream, 0, ""))
3250           return FALSE;
3251       }
3252       break;
3253
3254     case WRITE_XML:
3255       proto_tree_write_pdml(edt, stdout);
3256       printf("\n");
3257       return !ferror(stdout);
3258     case WRITE_FIELDS:
3259       proto_tree_write_fields(output_fields, edt, stdout);
3260       printf("\n");
3261       return !ferror(stdout);
3262     }
3263   } else {
3264     /* Just fill in the columns. */
3265     epan_dissect_fill_in_columns(edt, FALSE, TRUE);
3266
3267     /* Now print them. */
3268     switch (output_action) {
3269
3270     case WRITE_TEXT:
3271         if (!print_columns(cf))
3272           return FALSE;
3273         break;
3274
3275     case WRITE_XML:
3276         proto_tree_write_psml(edt, stdout);
3277         return !ferror(stdout);
3278     case WRITE_FIELDS: /*No non-verbose "fields" format */
3279         g_assert_not_reached();
3280         break;
3281     }
3282   }
3283   if (print_hex) {
3284     if (!print_hex_data(print_stream, edt))
3285       return FALSE;
3286     if (!print_line(print_stream, 0, ""))
3287       return FALSE;
3288   }
3289   return TRUE;
3290 }
3291
3292 static gboolean
3293 write_finale(void)
3294 {
3295   switch (output_action) {
3296
3297   case WRITE_TEXT:
3298     return print_finale(print_stream);
3299
3300   case WRITE_XML:
3301     if (verbose)
3302       write_pdml_finale(stdout);
3303     else
3304       write_psml_finale(stdout);
3305     return !ferror(stdout);
3306
3307   case WRITE_FIELDS:
3308     write_fields_finale(output_fields, stdout);
3309     return !ferror(stdout);
3310
3311   default:
3312     g_assert_not_reached();
3313     return FALSE;
3314   }
3315 }
3316
3317 cf_status_t
3318 cf_open(capture_file *cf, const char *fname, gboolean is_tempfile, int *err)
3319 {
3320   wtap       *wth;
3321   gchar       *err_info;
3322   char        err_msg[2048+1];
3323
3324   wth = wtap_open_offline(fname, err, &err_info, perform_two_pass_analysis);
3325   if (wth == NULL)
3326     goto fail;
3327
3328   /* The open succeeded.  Fill in the information for this file. */
3329
3330   /* Cleanup all data structures used for dissection. */
3331   cleanup_dissection();
3332   /* Initialize all data structures used for dissection. */
3333   init_dissection();
3334
3335   cf->wth = wth;
3336   cf->f_datalen = 0; /* not used, but set it anyway */
3337
3338   /* Set the file name because we need it to set the follow stream filter.
3339      XXX - is that still true?  We need it for other reasons, though,
3340      in any case. */
3341   cf->filename = g_strdup(fname);
3342
3343   /* Indicate whether it's a permanent or temporary file. */
3344   cf->is_tempfile = is_tempfile;
3345
3346   /* If it's a temporary capture buffer file, mark it as not saved. */
3347   cf->user_saved = !is_tempfile;
3348
3349   cf->cd_t      = wtap_file_type(cf->wth);
3350   cf->count     = 0;
3351   cf->drops_known = FALSE;
3352   cf->drops     = 0;
3353   cf->snap      = wtap_snapshot_length(cf->wth);
3354   if (cf->snap == 0) {
3355     /* Snapshot length not known. */
3356     cf->has_snap = FALSE;
3357     cf->snap = WTAP_MAX_PACKET_SIZE;
3358   } else
3359     cf->has_snap = TRUE;
3360   nstime_set_zero(&cf->elapsed_time);
3361   nstime_set_unset(&first_ts);
3362   nstime_set_unset(&prev_dis_ts);
3363   nstime_set_unset(&prev_cap_ts);
3364
3365   cf->state = FILE_READ_IN_PROGRESS;
3366
3367   wtap_set_cb_new_ipv4(cf->wth, add_ipv4_name);
3368   wtap_set_cb_new_ipv6(cf->wth, (wtap_new_ipv6_callback_t) add_ipv6_name);
3369
3370   return CF_OK;
3371
3372 fail:
3373   g_snprintf(err_msg, sizeof err_msg,
3374              cf_open_error_message(*err, err_info, FALSE, cf->cd_t), fname);
3375   cmdarg_err("%s", err_msg);
3376   return CF_ERROR;
3377 }
3378
3379 static void
3380 show_capture_file_io_error(const char *fname, int err, gboolean is_close)
3381 {
3382   char *save_file_string;
3383
3384   save_file_string = output_file_description(fname);
3385
3386   switch (err) {
3387
3388   case ENOSPC:
3389     cmdarg_err("Not all the packets could be written to the %s because there is "
3390                "no space left on the file system.",
3391                save_file_string);
3392     break;
3393
3394 #ifdef EDQUOT
3395   case EDQUOT:
3396     cmdarg_err("Not all the packets could be written to the %s because you are "
3397                "too close to, or over your disk quota.",
3398                save_file_string);
3399   break;
3400 #endif
3401
3402   case WTAP_ERR_CANT_CLOSE:
3403     cmdarg_err("The %s couldn't be closed for some unknown reason.",
3404                save_file_string);
3405     break;
3406
3407   case WTAP_ERR_SHORT_WRITE:
3408     cmdarg_err("Not all the packets could be written to the %s.",
3409                save_file_string);
3410     break;
3411
3412   default:
3413     if (is_close) {
3414       cmdarg_err("The %s could not be closed: %s.", save_file_string,
3415                  wtap_strerror(err));
3416     } else {
3417       cmdarg_err("An error occurred while writing to the %s: %s.",
3418                  save_file_string, wtap_strerror(err));
3419     }
3420     break;
3421   }
3422   g_free(save_file_string);
3423 }
3424
3425 static void
3426 show_print_file_io_error(int err)
3427 {
3428   switch (err) {
3429
3430   case ENOSPC:
3431     cmdarg_err("Not all the packets could be printed because there is "
3432 "no space left on the file system.");
3433     break;
3434
3435 #ifdef EDQUOT
3436   case EDQUOT:
3437     cmdarg_err("Not all the packets could be printed because you are "
3438 "too close to, or over your disk quota.");
3439   break;
3440 #endif
3441
3442   default:
3443     cmdarg_err("An error occurred while printing packets: %s.",
3444       strerror(err));
3445     break;
3446   }
3447 }
3448
3449 static const char *
3450 cf_open_error_message(int err, gchar *err_info, gboolean for_writing,
3451                       int file_type)
3452 {
3453   const char *errmsg;
3454   static char errmsg_errno[1024+1];
3455
3456   if (err < 0) {
3457     /* Wiretap error. */
3458     switch (err) {
3459
3460     case WTAP_ERR_NOT_REGULAR_FILE:
3461       errmsg = "The file \"%s\" is a \"special file\" or socket or other non-regular file.";
3462       break;
3463
3464     case WTAP_ERR_FILE_UNKNOWN_FORMAT:
3465       /* Seen only when opening a capture file for reading. */
3466       errmsg = "The file \"%s\" isn't a capture file in a format TShark understands.";
3467       break;
3468
3469     case WTAP_ERR_UNSUPPORTED:
3470       /* Seen only when opening a capture file for reading. */
3471       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3472                "The file \"%%s\" isn't a capture file in a format TShark understands.\n"
3473                "(%s)", err_info);
3474       g_free(err_info);
3475       errmsg = errmsg_errno;
3476       break;
3477
3478     case WTAP_ERR_CANT_WRITE_TO_PIPE:
3479       /* Seen only when opening a capture file for writing. */
3480       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3481                  "The file \"%%s\" is a pipe, and %s capture files can't be "
3482                  "written to a pipe.", wtap_file_type_string(file_type));
3483       errmsg = errmsg_errno;
3484       break;
3485
3486     case WTAP_ERR_UNSUPPORTED_FILE_TYPE:
3487       /* Seen only when opening a capture file for writing. */
3488       errmsg = "TShark doesn't support writing capture files in that format.";
3489       break;
3490
3491     case WTAP_ERR_UNSUPPORTED_ENCAP:
3492       if (for_writing)
3493         errmsg = "TShark can't save this capture in that format.";
3494       else {
3495         g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3496                  "The file \"%%s\" is a capture for a network type that TShark doesn't support.\n"
3497                  "(%s)", err_info);
3498         g_free(err_info);
3499         errmsg = errmsg_errno;
3500       }
3501       break;
3502
3503     case WTAP_ERR_ENCAP_PER_PACKET_UNSUPPORTED:
3504       if (for_writing)
3505         errmsg = "TShark can't save this capture in that format.";
3506       else
3507         errmsg = "The file \"%s\" is a capture for a network type that TShark doesn't support.";
3508       break;
3509
3510     case WTAP_ERR_BAD_RECORD:
3511       /* Seen only when opening a capture file for reading. */
3512       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3513                "The file \"%%s\" appears to be damaged or corrupt.\n"
3514                "(%s)", err_info);
3515       g_free(err_info);
3516       errmsg = errmsg_errno;
3517       break;
3518
3519     case WTAP_ERR_CANT_OPEN:
3520       if (for_writing)
3521         errmsg = "The file \"%s\" could not be created for some unknown reason.";
3522       else
3523         errmsg = "The file \"%s\" could not be opened for some unknown reason.";
3524       break;
3525
3526     case WTAP_ERR_SHORT_READ:
3527       errmsg = "The file \"%s\" appears to have been cut short"
3528                " in the middle of a packet or other data.";
3529       break;
3530
3531     case WTAP_ERR_SHORT_WRITE:
3532       errmsg = "A full header couldn't be written to the file \"%s\".";
3533       break;
3534
3535     default:
3536       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
3537                  "The file \"%%s\" could not be %s: %s.",
3538                  for_writing ? "created" : "opened",
3539                  wtap_strerror(err));
3540       errmsg = errmsg_errno;
3541       break;
3542     }
3543   } else
3544     errmsg = file_open_error_message(err, for_writing);
3545   return errmsg;
3546 }
3547
3548 /*
3549  * Open/create errors are reported with an console message in TShark.
3550  */
3551 static void
3552 open_failure_message(const char *filename, int err, gboolean for_writing)
3553 {
3554   fprintf(stderr, "tshark: ");
3555   fprintf(stderr, file_open_error_message(err, for_writing), filename);
3556   fprintf(stderr, "\n");
3557 }
3558
3559
3560 /*
3561  * General errors are reported with an console message in TShark.
3562  */
3563 static void
3564 failure_message(const char *msg_format, va_list ap)
3565 {
3566   fprintf(stderr, "tshark: ");
3567   vfprintf(stderr, msg_format, ap);
3568   fprintf(stderr, "\n");
3569 }
3570
3571 /*
3572  * Read errors are reported with an console message in TShark.
3573  */
3574 static void
3575 read_failure_message(const char *filename, int err)
3576 {
3577   cmdarg_err("An error occurred while reading from the file \"%s\": %s.",
3578           filename, strerror(err));
3579 }
3580
3581 /*
3582  * Write errors are reported with an console message in TShark.
3583  */
3584 static void
3585 write_failure_message(const char *filename, int err)
3586 {
3587   cmdarg_err("An error occurred while writing to the file \"%s\": %s.",
3588           filename, strerror(err));
3589 }
3590
3591 /*
3592  * Print to the standard error.  This is a command-line tool, so there's
3593  * no need to pop up a console.
3594  */
3595 void
3596 vfprintf_stderr(const char *fmt, va_list ap)
3597 {
3598   vfprintf(stderr, fmt, ap);
3599 }
3600
3601 void
3602 fprintf_stderr(const char *fmt, ...)
3603 {
3604   va_list ap;
3605
3606   va_start(ap, fmt);
3607   vfprintf_stderr(fmt, ap);
3608   va_end(ap);
3609 }
3610
3611 /*
3612  * Report an error in command-line arguments.
3613  */
3614 void
3615 cmdarg_err(const char *fmt, ...)
3616 {
3617   va_list ap;
3618
3619   va_start(ap, fmt);
3620   failure_message(fmt, ap);
3621   va_end(ap);
3622 }
3623
3624 /*
3625  * Report additional information for an error in command-line arguments.
3626  */
3627 void
3628 cmdarg_err_cont(const char *fmt, ...)
3629 {
3630   va_list ap;
3631
3632   va_start(ap, fmt);
3633   vfprintf(stderr, fmt, ap);
3634   fprintf(stderr, "\n");
3635   va_end(ap);
3636 }