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