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