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