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