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