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