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