Fix for bug #1211. Patch from Joshua Wright to add -S option to tshark's
[obnox/wireshark/wip.git] / tshark.c
1 /* tshark.c
2  *
3  * $Id$
4  *
5  * Wireshark - Network traffic analyzer
6  * By Gerald Combs <gerald@wireshark.org>
7  * Copyright 1998 Gerald Combs
8  *
9  * Text-mode variant, by Gilbert Ramirez <gram@alumni.rice.edu>
10  * and Guy Harris <guy@alum.mit.edu>.
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 "strerror.h"
56 #endif
57
58 #ifdef NEED_GETOPT_H
59 #include "getopt.h"
60 #endif
61
62 #include <glib.h>
63 #include <epan/epan.h>
64 #include <epan/filesystem.h>
65 #include <epan/privileges.h>
66 #include <wiretap/file_util.h>
67
68 #include "globals.h"
69 #include <epan/timestamp.h>
70 #include <epan/packet.h>
71 #include "file.h"
72 #include "disabled_protos.h"
73 #include <epan/prefs.h>
74 #include <epan/column.h>
75 #include "print.h"
76 #include <epan/addr_resolv.h>
77 #include "util.h"
78 #include "clopts_common.h"
79 #include "cmdarg_err.h"
80 #include "version_info.h"
81 #include <epan/conversation.h>
82 #include <epan/plugins.h>
83 #include "register.h"
84 #include "conditions.h"
85 #include "capture_stop_conditions.h"
86 #include "ringbuffer.h"
87 #include "capture_ui_utils.h"
88 #include <epan/epan_dissect.h>
89 #include <epan/tap.h>
90 #include <epan/stat_cmd_args.h>
91 #include <epan/timestamp.h>
92 #include <epan/ex-opt.h>
93
94 #ifdef HAVE_LIBPCAP
95 #include <pcap.h>
96 #include <setjmp.h>
97 #include "capture-pcap-util.h"
98 #include "pcapio.h"
99 #include <wiretap/wtap-capture.h>
100 #ifdef _WIN32
101 #include "capture-wpcap.h"
102 #include "capture_errs.h"
103 #endif /* _WIN32 */
104 #include "capture.h"
105 #include "capture_loop.h"
106 #include "capture_sync.h"
107 #endif /* HAVE_LIBPCAP */
108 #include "epan/emem.h"
109 #include "log.h"
110 #include <epan/funnel.h>
111
112 /*
113  * This is the template for the decode as option; it is shared between the
114  * various functions that output the usage for this parameter.
115  */
116 static const gchar decode_as_arg_template[] = "<layer_type>==<selector>,<decode_as_protocol>";
117
118 static nstime_t first_ts;
119 static nstime_t prev_ts;
120 static GString *comp_info_str, *runtime_info_str;
121
122 static gboolean print_packet_info;      /* TRUE if we're to print packet information */
123 /*
124  * The way the packet decode is to be written.
125  */
126 typedef enum {
127         WRITE_TEXT,     /* summary or detail text */
128         WRITE_XML       /* PDML or PSML */
129         /* Add CSV and the like here */
130 } output_action_e;
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 static guint32 cum_bytes = 0;
137 static print_format_e print_format = PR_FMT_TEXT;
138 static print_stream_t *print_stream;
139
140 /*
141  * Standard secondary message for unexpected errors.
142  */
143 static const char please_report[] =
144     "Please report this to the Wireshark developers";
145
146 #ifdef HAVE_LIBPCAP
147 /*
148  * TRUE if we're to print packet counts to keep track of captured packets.
149  */
150 static gboolean print_packet_counts;
151
152
153 static loop_data ld;
154
155 #ifdef HAVE_LIBPCAP
156 static capture_options capture_opts;
157
158
159 #ifdef SIGINFO
160 static gboolean infodelay;      /* if TRUE, don't print capture info in SIGINFO handler */
161 static gboolean infoprint;      /* if TRUE, print capture info after clearing infodelay */
162 #endif /* SIGINFO */
163 #endif /* HAVE_LIBPCAP */
164
165
166 static int capture(void);
167 static void capture_pcap_cb(u_char *, const struct pcap_pkthdr *,
168   const u_char *);
169 static void report_counts(void);
170 #ifdef _WIN32
171 static BOOL WINAPI capture_cleanup(DWORD);
172 #else /* _WIN32 */
173 static void capture_cleanup(int);
174 #ifdef SIGINFO
175 static void report_counts_siginfo(int);
176 #endif /* SIGINFO */
177 #endif /* _WIN32 */
178 #endif /* HAVE_LIBPCAP */
179
180 static int load_cap_file(capture_file *, char *, int);
181 static gboolean process_packet(capture_file *cf, gint64 offset,
182     const struct wtap_pkthdr *whdr, union wtap_pseudo_header *pseudo_header,
183     const guchar *pd);
184 static void show_capture_file_io_error(const char *, int, gboolean);
185 static void show_print_file_io_error(int err);
186 static gboolean write_preamble(capture_file *cf);
187 static gboolean print_packet(capture_file *cf, epan_dissect_t *edt);
188 static gboolean write_finale(void);
189 static const char *cf_open_error_message(int err, gchar *err_info,
190     gboolean for_writing, int file_type);
191
192 static void open_failure_message(const char *filename, int err,
193     gboolean for_writing);
194 static void failure_message(const char *msg_format, va_list ap);
195 static void read_failure_message(const char *filename, int err);
196
197 capture_file cfile;
198
199
200 static void list_capture_types(void) {
201     int i;
202
203     fprintf(stderr, "editcap: The available capture file types for \"F\":\n");
204     for (i = 0; i < WTAP_NUM_FILE_TYPES; i++) {
205       if (wtap_dump_can_open(i))
206         fprintf(stderr, "    %s - %s\n",
207           wtap_file_type_short_string(i), wtap_file_type_string(i));
208     }
209 }
210
211 static void
212 print_usage(gboolean print_ver)
213 {
214   FILE *output;
215
216   if (print_ver) {
217     output = stdout;
218     fprintf(output,
219         "TShark " VERSION "%s\n"
220         "Dump and analyze network traffic.\n"
221         "See http://www.wireshark.org for more information.\n"
222         "\n"
223         "%s",
224         svnversion, get_copyright_info());
225   } else {
226     output = stderr;
227   }
228   fprintf(output, "\n");
229   fprintf(output, "Usage: tshark [options] ...\n");
230   fprintf(output, "\n");
231
232 #ifdef HAVE_LIBPCAP
233   fprintf(output, "Capture interface:\n");
234   fprintf(output, "  -i <interface>           name or idx of interface (def: first non-loopback)\n");
235   fprintf(output, "  -f <capture filter>      packet filter in libpcap filter syntax\n");
236   fprintf(output, "  -s <snaplen>             packet snapshot length (def: 65535)\n");
237   fprintf(output, "  -p                       don't capture in promiscuous mode\n");
238 #ifdef _WIN32
239   fprintf(output, "  -B <buffer size>         size of kernel buffer (def: 1MB)\n");
240 #endif
241   fprintf(output, "  -y <link type>           link layer type (def: first appropriate)\n");
242   fprintf(output, "  -D                       print list of interfaces and exit\n");
243   fprintf(output, "  -L                       print list of link-layer types of iface and exit\n");
244   fprintf(output, "\n");
245   fprintf(output, "Capture stop conditions:\n");
246   fprintf(output, "  -c <packet count>        stop after n packets (def: infinite)\n");
247   fprintf(output, "  -a <autostop cond.> ...  duration:NUM - stop after NUM seconds\n");
248   fprintf(output, "                           filesize:NUM - stop this file after NUM KB\n");
249   fprintf(output, "                              files:NUM - stop after NUM files\n");
250   /*fprintf(output, "\n");*/
251   fprintf(output, "Capture output:\n");
252   fprintf(output, "  -b <ringbuffer opt.> ... duration:NUM - switch to next file after NUM secs\n");
253   fprintf(output, "                           filesize:NUM - switch to next file after NUM KB\n");
254   fprintf(output, "                              files:NUM - ringbuffer: replace after NUM files\n");
255 #endif  /* HAVE_LIBPCAP */
256
257   /*fprintf(output, "\n");*/
258   fprintf(output, "Input file:\n");
259   fprintf(output, "  -r <infile>              set the filename to read from (no pipes or stdin!)\n");
260
261   fprintf(output, "\n");
262   fprintf(output, "Processing:\n");
263   fprintf(output, "  -R <read filter>         packet filter in Wireshark display filter syntax\n");
264   fprintf(output, "  -n                       disable all name resolutions (def: all enabled)\n");
265   fprintf(output, "  -N <name resolve flags>  enable specific name resolution(s): \"mntC\"\n");
266   fprintf(output, "  -d %s ...\n", decode_as_arg_template);
267   fprintf(output, "                           \"Decode As\", see the man page for details\n");
268   fprintf(output, "                           Example: tcp.port==8888,http\n");
269
270   /*fprintf(output, "\n");*/
271   fprintf(output, "Output:\n");
272   fprintf(output, "  -w <outfile|->           set the output filename (or '-' for stdout)\n");
273   fprintf(output, "  -F <output file type>    set the output file type, default is libpcap\n");
274   fprintf(output, "                           an empty \"-F\" option will list the file types\n");
275   fprintf(output, "  -V                       add output of packet tree        (Packet Details)\n");
276   fprintf(output, "  -S                       display packets even when writing to a file\n");
277   fprintf(output, "  -x                       add output of hex and ASCII dump (Packet Bytes)\n");
278   fprintf(output, "  -T pdml|ps|psml|text     output format of text output (def: text)\n");
279   fprintf(output, "  -t ad|a|r|d              output format of time stamps (def: r: rel. to first)\n");
280   fprintf(output, "  -l                       flush output after each packet\n");
281   fprintf(output, "  -q                       be more quiet on stdout (e.g. when using statistics)\n");
282   fprintf(output, "  -X <key>:<value>         eXtension options, see the man page for details\n");
283   fprintf(output, "  -z <statistics>          various statistics, see the man page for details\n");
284
285   fprintf(output, "\n");
286   fprintf(output, "Miscellaneous:\n");
287   fprintf(output, "  -h                       display this help and exit\n");
288   fprintf(output, "  -v                       display version info and exit\n");
289   fprintf(output, "  -o <name>:<value> ...    override preference setting\n");
290 }
291
292 /*
293  * For a dissector table, print on the stream described by output,
294  * its short name (which is what's used in the "-d" option) and its
295  * descriptive name.
296  */
297 static void
298 display_dissector_table_names(char *table_name, const char *ui_name,
299                               gpointer output)
300 {
301   fprintf((FILE *)output, "\t%s (%s)\n", table_name, ui_name);
302 }
303
304 /*
305  * For a dissector handle, print on the stream described by output,
306  * the filter name (which is what's used in the "-d" option) and the full
307  * name for the protocol that corresponds to this handle.
308  */
309 static void
310 display_dissector_names(const gchar *table _U_, gpointer handle, gpointer output)
311 {
312   int                proto_id;
313   const gchar*       proto_filter_name;
314   const gchar*       proto_ui_name;
315
316   proto_id = dissector_handle_get_protocol_index((dissector_handle_t)handle);
317
318   if (proto_id != -1) {
319     proto_filter_name = proto_get_protocol_filter_name(proto_id);
320     proto_ui_name =  proto_get_protocol_name(proto_id);
321     g_assert(proto_filter_name != NULL);
322     g_assert(proto_ui_name != NULL);
323
324     fprintf((FILE *)output, "\t%s (%s)\n",
325             proto_filter_name,
326             proto_ui_name);
327   }
328 }
329
330 /*
331  * The protocol_name_search structure is used by find_protocol_name_func()
332  * to pass parameters and store results
333  */
334 struct protocol_name_search{
335   gchar              *searched_name;  /* Protocol filter name we are looking for */
336   dissector_handle_t  matched_handle; /* Handle for a dissector whose protocol has the specified filter name */
337   guint               nb_match;       /* How many dissectors matched searched_name */
338 };
339 typedef struct protocol_name_search *protocol_name_search_t;
340
341 /*
342  * This function parses all dissectors associated with a table to find the
343  * one whose protocol has the specified filter name.  It is called
344  * as a reference function in a call to dissector_table_foreach_handle.
345  * The name we are looking for, as well as the results, are stored in the
346  * protocol_name_search struct pointed to by user_data.
347  * If called using dissector_table_foreach_handle, we actually parse the
348  * whole list of dissectors.
349  */
350 static void
351 find_protocol_name_func(const gchar *table _U_, gpointer handle, gpointer user_data)
352
353 {
354   int                         proto_id;
355   const gchar                *protocol_filter_name;
356   protocol_name_search_t      search_info;
357
358   g_assert(handle);
359
360   search_info = (protocol_name_search_t)user_data;
361
362   proto_id = dissector_handle_get_protocol_index((dissector_handle_t)handle);
363   if (proto_id != -1) {
364     protocol_filter_name = proto_get_protocol_filter_name(proto_id);
365     g_assert(protocol_filter_name != NULL);
366     if (strcmp(protocol_filter_name, search_info->searched_name) == 0) {
367       /* Found a match */
368       if (search_info->nb_match == 0) {
369         /* Record this handle only if this is the first match */
370         search_info->matched_handle = (dissector_handle_t)handle; /* Record the handle for this matching dissector */
371       }
372       search_info->nb_match++;
373     }
374   }
375 }
376
377 /*
378  * Print all layer type names supported.
379  * We send the output to the stream described by the handle output.
380  */
381
382 static void
383 fprint_all_layer_types(FILE *output)
384
385 {
386   dissector_all_tables_foreach_table(display_dissector_table_names, (gpointer)output);
387 }
388
389 /*
390  * Print all protocol names supported for a specific layer type.
391  * table_name contains the layer type name in which the search is performed.
392  * We send the output to the stream described by the handle output.
393  */
394
395 static void
396 fprint_all_protocols_for_layer_types(FILE *output, gchar *table_name)
397
398 {
399   dissector_table_foreach_handle(table_name,
400                                  display_dissector_names,
401                                  (gpointer)output);
402 }
403
404 /*
405  * The function below parses the command-line parameters for the decode as
406  * feature (a string pointer by cl_param).
407  * It checks the format of the command-line, searches for a matching table
408  * and dissector.  If a table/dissector match is not found, we display a
409  * summary of the available tables/dissectors (on stderr) and return FALSE.
410  * If everything is fine, we get the "Decode as" preference activated,
411  * then we return TRUE.
412  */
413 static gboolean
414 add_decode_as(const gchar *cl_param)
415 {
416   gchar                        *table_name;
417   guint32                       selector;
418   gchar                        *decoded_param;
419   gchar                        *remaining_param;
420   gchar                        *selector_str;
421   gchar                        *dissector_str;
422   dissector_handle_t            dissector_matching;
423   dissector_table_t             table_matching;
424   ftenum_t                      dissector_table_selector_type;
425   struct protocol_name_search   user_protocol_name;
426
427 /* The following code will allocate and copy the command-line options in a string pointed by decoded_param */
428
429   g_assert(cl_param);
430   decoded_param = g_malloc( sizeof(gchar) * (strlen(cl_param) + 1) ); /* Allocate enough space to have a working copy of the command-line parameter */
431   g_assert(decoded_param);
432   strcpy(decoded_param, cl_param);
433
434
435   /* The lines below will parse this string (modifying it) to extract all
436     necessary information.  Note that decoded_param is still needed since
437     strings are not copied - we just save pointers. */
438
439   /* This section extracts a layer type (table_name) from decoded_param */
440   table_name = decoded_param; /* Layer type string starts from beginning */
441
442   remaining_param = strchr(table_name, '=');
443   if (remaining_param == NULL) {
444     cmdarg_err("Parameter \"%s\" doesn't follow the template \"%s\"", cl_param, decode_as_arg_template);
445     /* If the argument does not follow the template, carry on anyway to check
446        if the table name is at least correct.  If remaining_param is NULL,
447        we'll exit anyway further down */
448   }
449   else {
450     *remaining_param = '\0'; /* Terminate the layer type string (table_name) where '=' was detected */
451   }
452
453   /* Remove leading and trailing spaces from the table name */
454   while ( table_name[0] == ' ' )
455     table_name++;
456   while ( table_name[strlen(table_name) - 1] == ' ' )
457     table_name[strlen(table_name) - 1] = '\0'; /* Note: if empty string, while loop will eventually exit */
458
459 /* The following part searches a table matching with the layer type specified */
460   table_matching = NULL;
461
462 /* Look for the requested table */
463   if ( !(*(table_name)) ) { /* Is the table name empty, if so, don't even search for anything, display a message */
464     cmdarg_err("No layer type specified"); /* Note, we don't exit here, but table_matching will remain NULL, so we exit below */
465   }
466   else {
467     table_matching = find_dissector_table(table_name);
468     if (!table_matching) {
469       cmdarg_err("Unknown layer type -- %s", table_name); /* Note, we don't exit here, but table_matching will remain NULL, so we exit below */
470     }
471   }
472
473   if (!table_matching) {
474     /* Display a list of supported layer types to help the user, if the
475        specified layer type was not found */
476     cmdarg_err("Valid layer types are:");
477     fprint_all_layer_types(stderr);
478   }
479   if (remaining_param == NULL || !table_matching) {
480     /* Exit if the layer type was not found, or if no '=' separator was found
481        (see above) */
482     g_free(decoded_param);
483     return FALSE;
484   }
485
486   if (*(remaining_param + 1) != '=') { /* Check for "==" and not only '=' */
487     cmdarg_err("WARNING: -d requires \"==\" instead of \"=\". Option will be treated as \"%s==%s\"", table_name, remaining_param + 1);
488   }
489   else {
490     remaining_param++; /* Move to the second '=' */
491     *remaining_param = '\0'; /* Remove the second '=' */
492   }
493   remaining_param++; /* Position after the layer type string */
494
495   /* This section extracts a selector value (selector_str) from decoded_param */
496
497   selector_str = remaining_param; /* Next part starts with the selector number */
498
499   remaining_param = strchr(selector_str, ',');
500   if (remaining_param == NULL) {
501     cmdarg_err("Parameter \"%s\" doesn't follow the template \"%s\"", cl_param, decode_as_arg_template);
502     /* If the argument does not follow the template, carry on anyway to check
503        if the selector value is at least correct.  If remaining_param is NULL,
504        we'll exit anyway further down */
505   }
506   else {
507     *remaining_param = '\0'; /* Terminate the selector number string (selector_str) where ',' was detected */
508   }
509
510   dissector_table_selector_type = get_dissector_table_selector_type(table_name);
511
512   switch (dissector_table_selector_type) {
513
514   case FT_UINT8:
515   case FT_UINT16:
516   case FT_UINT24:
517   case FT_UINT32:
518     /* The selector for this table is an unsigned number.  Parse it as such.
519        There's no need to remove leading and trailing spaces from the
520        selector number string, because sscanf will do that for us. */
521     if ( sscanf(selector_str, "%u", &selector) != 1 ) {
522       cmdarg_err("Invalid selector number \"%s\"", selector_str);
523       g_free(decoded_param);
524       return FALSE;
525     }
526     break;
527
528   case FT_STRING:
529   case FT_STRINGZ:
530     /* The selector for this table is a string. */
531     break;
532
533   default:
534     /* There are currently no dissector tables with any types other
535        than the ones listed above. */
536     g_assert_not_reached();
537   }
538
539   if (remaining_param == NULL) {
540     /* Exit if no ',' separator was found (see above) */
541     cmdarg_err("Valid protocols for layer type \"%s\" are:", table_name);
542     fprint_all_protocols_for_layer_types(stderr, table_name);
543     g_free(decoded_param);
544     return FALSE;
545   }
546
547   remaining_param++; /* Position after the selector number string */
548
549   /* This section extracts a protocol filter name (dissector_str) from decoded_param */
550
551   dissector_str = remaining_param; /* All the rest of the string is the dissector (decode as protocol) name */
552
553   /* Remove leading and trailing spaces from the dissector name */
554   while ( dissector_str[0] == ' ' )
555     dissector_str++;
556   while ( dissector_str[strlen(dissector_str) - 1] == ' ' )
557     dissector_str[strlen(dissector_str) - 1] = '\0'; /* Note: if empty string, while loop will eventually exit */
558
559   dissector_matching = NULL;
560
561   /* We now have a pointer to the handle for the requested table inside the variable table_matching */
562   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 */
563     cmdarg_err("No protocol name specified"); /* Note, we don't exit here, but dissector_matching will remain NULL, so we exit below */
564   }
565   else {
566     user_protocol_name.nb_match = 0;
567     user_protocol_name.searched_name = dissector_str;
568     user_protocol_name.matched_handle = NULL;
569
570     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 */
571
572     if (user_protocol_name.nb_match != 0) {
573       dissector_matching = user_protocol_name.matched_handle;
574       if (user_protocol_name.nb_match > 1) {
575         cmdarg_err("WARNING: Protocol \"%s\" matched %u dissectors, first one will be used", dissector_str, user_protocol_name.nb_match);
576       }
577     }
578     else {
579       /* OK, check whether the problem is that there isn't any such
580          protocol, or that there is but it's not specified as a protocol
581          that's valid for that dissector table.
582          Note, we don't exit here, but dissector_matching will remain NULL,
583          so we exit below */
584       if (proto_get_id_by_filter_name(dissector_str) == -1) {
585         /* No such protocol */
586         cmdarg_err("Unknown protocol -- \"%s\"", dissector_str);
587       } else {
588         cmdarg_err("Protocol \"%s\" isn't valid for layer type \"%s\"",
589                 dissector_str, table_name);
590       }
591     }
592   }
593
594   if (!dissector_matching) {
595     cmdarg_err("Valid protocols for layer type \"%s\" are:", table_name);
596     fprint_all_protocols_for_layer_types(stderr, table_name);
597     g_free(decoded_param);
598     return FALSE;
599   }
600
601 /* This is the end of the code that parses the command-line options.
602    All information is now stored in the variables:
603    table_name
604    selector
605    dissector_matching
606    The above variables that are strings are still pointing to areas within
607    decoded_parm.  decoded_parm thus still needs to be kept allocated in
608    until we stop needing these variables
609    decoded_param will be deallocated at each exit point of this function */
610
611
612   /* We now have a pointer to the handle for the requested dissector
613      (requested protocol) inside the variable dissector_matching */
614   switch (dissector_table_selector_type) {
615
616   case FT_UINT8:
617   case FT_UINT16:
618   case FT_UINT24:
619   case FT_UINT32:
620     /* The selector for this table is an unsigned number. */
621     dissector_change(table_name, selector, dissector_matching);
622     break;
623
624   case FT_STRING:
625   case FT_STRINGZ:
626     /* The selector for this table is a string. */
627     dissector_change_string(table_name, selector_str, dissector_matching);
628     break;
629
630   default:
631     /* There are currently no dissector tables with any types other
632        than the ones listed above. */
633     g_assert_not_reached();
634   }
635   g_free(decoded_param); /* "Decode As" rule has been succesfully added */
636   return TRUE;
637 }
638
639 static void
640 log_func_ignore (const gchar *log_domain _U_, GLogLevelFlags log_level _U_,
641     const gchar *message _U_, gpointer user_data _U_)
642 {
643 }
644
645 static char *
646 output_file_description(const char *fname)
647 {
648   char *save_file_string;
649
650   /* Get a string that describes what we're writing to */
651   if (strcmp(fname, "-") == 0) {
652     /* We're writing to the standard output */
653     save_file_string = g_strdup("standard output");
654   } else {
655     /* We're writing to a file with the name in save_file */
656     save_file_string = g_strdup_printf("file \"%s\"", fname);
657   }
658   return save_file_string;
659 }
660
661 int
662 main(int argc, char *argv[])
663 {
664   char                *init_progfile_dir_error;
665   int                  opt, i;
666   extern char         *optarg;
667   gboolean             arg_error = FALSE;
668
669 #ifdef _WIN32
670   WSADATA               wsaData;
671 #endif  /* _WIN32 */
672
673   char                *gpf_path, *pf_path;
674   char                *gdp_path, *dp_path;
675   int                  gpf_open_errno, gpf_read_errno;
676   int                  pf_open_errno, pf_read_errno;
677   int                  gdp_open_errno, gdp_read_errno;
678   int                  dp_open_errno, dp_read_errno;
679   int                  err;
680 #ifdef HAVE_LIBPCAP
681   gboolean             list_link_layer_types = FALSE;
682   gboolean             start_capture = FALSE;
683 #else
684   gboolean             capture_option_specified = FALSE;
685 #endif
686   gboolean             quiet = FALSE;
687   int                  out_file_type = WTAP_FILE_PCAP;
688   gchar               *cf_name = NULL, *rfilter = NULL;
689 #ifdef HAVE_PCAP_OPEN_DEAD
690   struct bpf_program   fcode;
691 #endif
692   dfilter_t           *rfcode = NULL;
693   e_prefs             *prefs;
694   char                 badopt;
695   GLogLevelFlags       log_flags;
696   int                  status;
697
698 #define OPTSTRING_INIT "a:b:c:d:Df:F:hi:lLnN:o:pqr:R:s:St:T:vVw:xX:y:z:"
699 #ifdef HAVE_LIBPCAP
700 #ifdef _WIN32
701 #define OPTSTRING_WIN32 "B:"
702 #else
703 #define OPTSTRING_WIN32 ""
704 #endif  /* _WIN32 */
705 #else
706 #define OPTSTRING_WIN32 ""
707 #endif  /* HAVE_LIBPCAP */
708
709   static const char    optstring[] = OPTSTRING_INIT OPTSTRING_WIN32;
710
711   /*
712    * Attempt to get the pathname of the executable file.
713    */
714   init_progfile_dir_error = init_progfile_dir(argv[0]);
715   if (init_progfile_dir_error != NULL) {
716     fprintf(stderr, "tshark: Can't get pathname of tshark program: %s.\n",
717             init_progfile_dir_error);
718   }
719
720   /*
721    * Get credential information for later use.
722    */
723   get_credential_info();
724
725   /* nothing more than the standard GLib handler, but without a warning */
726   log_flags =
727                     G_LOG_LEVEL_ERROR|
728                     G_LOG_LEVEL_CRITICAL|
729                     G_LOG_LEVEL_WARNING|
730                     G_LOG_LEVEL_MESSAGE|
731                     G_LOG_LEVEL_INFO|
732                     G_LOG_LEVEL_DEBUG|
733                     G_LOG_FLAG_FATAL|G_LOG_FLAG_RECURSION;
734
735   g_log_set_handler(NULL,
736                     log_flags,
737                     log_func_ignore, NULL /* user_data */);
738   g_log_set_handler(LOG_DOMAIN_CAPTURE_CHILD,
739                     log_flags,
740                     log_func_ignore, NULL /* user_data */);
741
742   initialize_funnel_ops();
743
744 #ifdef HAVE_LIBPCAP
745   capture_opts_init(&capture_opts, NULL /* cfile */);
746 #endif
747
748   timestamp_set_type(TS_RELATIVE);
749   timestamp_set_precision(TS_PREC_AUTO);
750
751   /* Register all dissectors; we must do this before checking for the
752      "-G" flag, as the "-G" flag dumps information registered by the
753      dissectors, and we must do it before we read the preferences, in
754      case any dissectors register preferences. */
755   epan_init(PLUGIN_DIR,register_all_protocols,register_all_protocol_handoffs,
756             failure_message,open_failure_message,read_failure_message);
757
758   /* Register all tap listeners; we do this before we parse the arguments,
759      as the "-z" argument can specify a registered tap. */
760
761   /* we register the plugin taps before the other taps because
762      stats_tree taps plugins will be registered as tap listeners
763      by stats_tree_stat.c and need to registered before that */
764 #ifdef HAVE_PLUGINS
765   register_all_plugin_tap_listeners();
766 #endif
767   register_all_tap_listeners();
768
769   /* Now register the preferences for any non-dissector modules.
770      We must do that before we read the preferences as well. */
771   prefs_register_modules();
772
773   /* If invoked with the "-G" flag, we dump out information based on
774      the argument to the "-G" flag; if no argument is specified,
775      for backwards compatibility we dump out a glossary of display
776      filter symbols.
777
778      XXX - we do this here, for now, to support "-G" with no arguments.
779      If none of our build or other processes uses "-G" with no arguments,
780      we can just process it with the other arguments. */
781   if (argc >= 2 && strcmp(argv[1], "-G") == 0) {
782     if (argc == 2)
783       proto_registrar_dump_fields(1);
784     else {
785       if (strcmp(argv[2], "fields") == 0)
786         proto_registrar_dump_fields(1);
787       else if (strcmp(argv[2], "fields2") == 0)
788         proto_registrar_dump_fields(2);
789       else if (strcmp(argv[2], "fields3") == 0)
790         proto_registrar_dump_fields(3);
791       else if (strcmp(argv[2], "protocols") == 0)
792         proto_registrar_dump_protocols();
793       else if (strcmp(argv[2], "values") == 0)
794         proto_registrar_dump_values();
795       else if (strcmp(argv[2], "decodes") == 0)
796         dissector_dump_decodes();
797       else if (strcmp(argv[2], "defaultprefs") == 0)
798         write_prefs(NULL);
799       else if (strcmp(argv[2], "currentprefs") == 0) {
800         read_prefs(&gpf_open_errno, &gpf_read_errno, &gpf_path,
801             &pf_open_errno, &pf_read_errno, &pf_path);
802         write_prefs(NULL);
803       } else {
804         cmdarg_err("Invalid \"%s\" option for -G flag", argv[2]);
805         exit(1);
806       }
807     }
808     exit(0);
809   }
810
811   /* Set the C-language locale to the native environment. */
812   setlocale(LC_ALL, "");
813
814   prefs = read_prefs(&gpf_open_errno, &gpf_read_errno, &gpf_path,
815                      &pf_open_errno, &pf_read_errno, &pf_path);
816   if (gpf_path != NULL) {
817     if (gpf_open_errno != 0) {
818       cmdarg_err("Can't open global preferences file \"%s\": %s.",
819               pf_path, strerror(gpf_open_errno));
820     }
821     if (gpf_read_errno != 0) {
822       cmdarg_err("I/O error reading global preferences file \"%s\": %s.",
823               pf_path, strerror(gpf_read_errno));
824     }
825   }
826   if (pf_path != NULL) {
827     if (pf_open_errno != 0) {
828       cmdarg_err("Can't open your preferences file \"%s\": %s.", pf_path,
829               strerror(pf_open_errno));
830     }
831     if (pf_read_errno != 0) {
832       cmdarg_err("I/O error reading your preferences file \"%s\": %s.",
833               pf_path, strerror(pf_read_errno));
834     }
835     g_free(pf_path);
836     pf_path = NULL;
837   }
838
839   /* Set the name resolution code's flags from the preferences. */
840   g_resolv_flags = prefs->name_resolve;
841
842   /* Read the disabled protocols file. */
843   read_disabled_protos_list(&gdp_path, &gdp_open_errno, &gdp_read_errno,
844                             &dp_path, &dp_open_errno, &dp_read_errno);
845   if (gdp_path != NULL) {
846     if (gdp_open_errno != 0) {
847       cmdarg_err("Could not open global disabled protocols file\n\"%s\": %s.",
848                  gdp_path, strerror(gdp_open_errno));
849     }
850     if (gdp_read_errno != 0) {
851       cmdarg_err("I/O error reading global disabled protocols file\n\"%s\": %s.",
852                  gdp_path, strerror(gdp_read_errno));
853     }
854     g_free(gdp_path);
855   }
856   if (dp_path != NULL) {
857     if (dp_open_errno != 0) {
858       cmdarg_err(
859         "Could not open your disabled protocols file\n\"%s\": %s.", dp_path,
860         strerror(dp_open_errno));
861     }
862     if (dp_read_errno != 0) {
863       cmdarg_err(
864         "I/O error reading your disabled protocols file\n\"%s\": %s.", dp_path,
865         strerror(dp_read_errno));
866     }
867     g_free(dp_path);
868   }
869
870 #ifdef _WIN32
871   /* Load Wpcap, if possible */
872   load_wpcap();
873 #endif
874
875   init_cap_file(&cfile);
876
877   /* Assemble the compile-time version information string */
878   comp_info_str = g_string_new("Compiled ");
879   get_compiled_version_info(comp_info_str, get_epan_compiled_version_info);
880
881   /* Assemble the run-time version information string */
882   runtime_info_str = g_string_new("Running ");
883   get_runtime_version_info(runtime_info_str, NULL);
884
885   /* Print format defaults to this. */
886   print_format = PR_FMT_TEXT;
887
888   /* Now get our args */
889   while ((opt = getopt(argc, argv, optstring)) != -1) {
890     switch (opt) {
891       case 'a':        /* autostop criteria */
892       case 'b':        /* Ringbuffer option */
893       case 'c':        /* Capture xxx packets */
894       case 'f':        /* capture filter */
895       case 'i':        /* Use interface xxx */
896       case 'p':        /* Don't capture in promiscuous mode */
897       case 's':        /* Set the snapshot (capture) length */
898       case 'w':        /* Write to capture file xxx */
899       case 'y':        /* Set the pcap data link type */
900 #ifdef _WIN32
901       case 'B':        /* Buffer size */
902 #endif /* _WIN32 */
903 #ifdef HAVE_LIBPCAP
904         status = capture_opts_add_opt(&capture_opts, opt, optarg, &start_capture);
905         if(status != 0) {
906             exit(status);
907         }
908 #else
909         capture_option_specified = TRUE;
910         arg_error = TRUE;
911 #endif
912         break;
913       case 'd':        /* Decode as rule */
914         if (!add_decode_as(optarg))
915           exit(1);
916         break;
917       case 'D':        /* Print a list of capture devices and exit */
918 #ifdef HAVE_LIBPCAP
919         status = capture_opts_list_interfaces();
920         exit(status);
921 #else
922         capture_option_specified = TRUE;
923         arg_error = TRUE;
924 #endif
925         break;
926       case 'F':
927         out_file_type = wtap_short_string_to_file_type(optarg);
928         if (out_file_type < 0) {
929           cmdarg_err("\"%s\" isn't a valid capture file type", optarg);
930           list_capture_types();
931           exit(1);
932         }
933         break;
934       case 'h':        /* Print help and exit */
935         print_usage(TRUE);
936         exit(0);
937         break;
938       case 'l':        /* "Line-buffer" standard output */
939         /* This isn't line-buffering, strictly speaking, it's just
940            flushing the standard output after the information for
941            each packet is printed; however, that should be good
942            enough for all the purposes to which "-l" is put (and
943            is probably actually better for "-V", as it does fewer
944            writes).
945
946            See the comment in "process_packet()" for an explanation of
947            why we do that, and why we don't just use "setvbuf()" to
948            make the standard output line-buffered (short version: in
949            Windows, "line-buffered" is the same as "fully-buffered",
950            and the output buffer is only flushed when it fills up). */
951         line_buffered = TRUE;
952         break;
953       case 'L':        /* Print list of link-layer types and exit */
954 #ifdef HAVE_LIBPCAP
955         list_link_layer_types = TRUE;
956         break;
957 #else
958         capture_option_specified = TRUE;
959         arg_error = TRUE;
960 #endif
961         break;
962       case 'n':        /* No name resolution */
963         g_resolv_flags = RESOLV_NONE;
964         break;
965       case 'N':        /* Select what types of addresses/port #s to resolve */
966         if (g_resolv_flags == RESOLV_ALL)
967           g_resolv_flags = RESOLV_NONE;
968         badopt = string_to_name_resolve(optarg, &g_resolv_flags);
969         if (badopt != '\0') {
970           cmdarg_err("-N specifies unknown resolving option '%c'; valid options are 'm', 'n', and 't'",
971                      badopt);
972           exit(1);
973         }
974         break;
975       case 'o':        /* Override preference from command line */
976         switch (prefs_set_pref(optarg)) {
977
978         case PREFS_SET_OK:
979           break;
980
981         case PREFS_SET_SYNTAX_ERR:
982           cmdarg_err("Invalid -o flag \"%s\"", optarg);
983           exit(1);
984           break;
985
986         case PREFS_SET_NO_SUCH_PREF:
987         case PREFS_SET_OBSOLETE:
988           cmdarg_err("-o flag \"%s\" specifies unknown preference", optarg);
989           exit(1);
990           break;
991         }
992         break;
993       case 'q':        /* Quiet */
994         quiet = TRUE;
995         break;
996       case 'r':        /* Read capture file xxx */
997         cf_name = g_strdup(optarg);
998         break;
999       case 'R':        /* Read file filter */
1000         rfilter = optarg;
1001         break;
1002       case 'S':        /* show packets in real time */
1003         print_packet_info = TRUE;
1004         break;
1005       case 't':        /* Time stamp type */
1006         if (strcmp(optarg, "r") == 0)
1007           timestamp_set_type(TS_RELATIVE);
1008         else if (strcmp(optarg, "a") == 0)
1009           timestamp_set_type(TS_ABSOLUTE);
1010         else if (strcmp(optarg, "ad") == 0)
1011           timestamp_set_type(TS_ABSOLUTE_WITH_DATE);
1012         else if (strcmp(optarg, "d") == 0)
1013           timestamp_set_type(TS_DELTA);
1014         else {
1015           cmdarg_err("Invalid time stamp type \"%s\"",
1016             optarg);
1017           cmdarg_err_cont("It must be \"r\" for relative, \"a\" for absolute,");
1018           cmdarg_err_cont("\"ad\" for absolute with date, or \"d\" for delta.");
1019           exit(1);
1020         }
1021         break;
1022       case 'T':        /* printing Type */
1023         if (strcmp(optarg, "text") == 0) {
1024           output_action = WRITE_TEXT;
1025           print_format = PR_FMT_TEXT;
1026         } else if (strcmp(optarg, "ps") == 0) {
1027           output_action = WRITE_TEXT;
1028           print_format = PR_FMT_PS;
1029         } else if (strcmp(optarg, "pdml") == 0) {
1030           output_action = WRITE_XML;
1031           verbose = TRUE;
1032         } else if (strcmp(optarg, "psml") == 0) {
1033           output_action = WRITE_XML;
1034           verbose = FALSE;
1035         } else {
1036           cmdarg_err("Invalid -T parameter.");
1037           cmdarg_err_cont("It must be \"ps\", \"text\", \"pdml\", or \"psml\".");
1038           exit(1);
1039         }
1040         break;
1041       case 'v':        /* Show version and exit */
1042         printf("TShark " VERSION "%s\n"
1043                "\n"
1044                "%s"
1045                "\n"
1046                "%s"
1047                "\n"
1048                "%s",
1049                svnversion, get_copyright_info(), comp_info_str->str,
1050                runtime_info_str->str);
1051         exit(0);
1052         break;
1053       case 'V':        /* Verbose */
1054         verbose = TRUE;
1055         break;
1056       case 'x':        /* Print packet data in hex (and ASCII) */
1057           print_hex = TRUE;
1058           break;
1059       case 'X':
1060           ex_opt_add(optarg);
1061           break;
1062       case 'z':
1063         /* We won't call the init function for the stat this soon
1064            as it would disallow MATE's fields (which are registered
1065            by the preferences set callback) from being used as
1066            part of a tap filter.  Instead, we just add the argument
1067            to a list of stat arguments. */
1068         if (!process_stat_cmd_arg(optarg)) {
1069           cmdarg_err("invalid -z argument.");
1070           cmdarg_err_cont("  -z argument must be one of :");
1071           list_stat_cmd_args();
1072           exit(1);
1073         }
1074         break;
1075       default:
1076       case '?':        /* Bad flag - print usage message */
1077         switch(optopt) {
1078         case 'F':
1079           list_capture_types();
1080           break;
1081         default:
1082           print_usage(TRUE);
1083         }
1084         exit(1);
1085         break;
1086     }
1087   }
1088
1089   /* If no capture filter or read filter has been specified, and there are
1090      still command-line arguments, treat them as the tokens of a capture
1091      filter (if no "-r" flag was specified) or a read filter (if a "-r"
1092      flag was specified. */
1093   if (optind < argc) {
1094     if (cf_name != NULL) {
1095       if (rfilter != NULL) {
1096         cmdarg_err("Read filters were specified both with \"-R\" "
1097             "and with additional command-line arguments");
1098         exit(1);
1099       }
1100       rfilter = get_args_as_string(argc, argv, optind);
1101     } else {
1102 #ifdef HAVE_LIBPCAP
1103       if (capture_opts.has_cfilter) {
1104         cmdarg_err("Capture filters were specified both with \"-f\""
1105             " and with additional command-line arguments");
1106         exit(1);
1107       }
1108       capture_opts.has_cfilter = TRUE;
1109       capture_opts.cfilter = get_args_as_string(argc, argv, optind);
1110 #else
1111       capture_option_specified = TRUE;
1112 #endif
1113     }
1114   }
1115
1116   if (!capture_opts.saving_to_file) {
1117     /* We're not saving the capture to a file; if "-q" wasn't specified,
1118        we should print packet information */
1119     if (!quiet)
1120       print_packet_info = TRUE;
1121   } else {
1122     /* We're saving to a file; if we're writing to the standard output.
1123        and we'll also be writing dissected packets to the standard
1124        output, reject the request.  At best, we could redirect that
1125        to the standard error; we *can't* write both to the standard
1126        output and have either of them be useful. */
1127     if (strcmp(capture_opts.save_file, "-") == 0 && print_packet_info) {
1128       cmdarg_err("You can't write both raw packet data and dissected packets"
1129           " to the standard output.");
1130       exit(1);
1131     }
1132   }
1133
1134 #ifndef HAVE_LIBPCAP
1135   if (capture_option_specified)
1136     cmdarg_err("This version of TShark was not built with support for capturing packets.");
1137 #endif
1138   if (arg_error) {
1139     print_usage(FALSE);
1140     exit(1);
1141   }
1142
1143   /* We don't support capture filters when reading from a capture file
1144      (the BPF compiler doesn't support all link-layer types that we
1145      support in capture files we read). */
1146 #ifdef HAVE_LIBPCAP
1147   if (cf_name != NULL) {
1148     if (capture_opts.has_cfilter) {
1149       cmdarg_err("Only read filters, not capture filters, "
1150           "can be specified when reading a capture file.");
1151       exit(1);
1152     }
1153   }
1154 #endif
1155
1156   if (print_hex) {
1157     if (output_action != WRITE_TEXT) {
1158       cmdarg_err("Raw packet hex data can only be printed as text or PostScript");
1159       exit(1);
1160     }
1161   }
1162
1163 #ifdef HAVE_LIBPCAP
1164   if (list_link_layer_types) {
1165     /* We're supposed to list the link-layer types for an interface;
1166        did the user also specify a capture file to be read? */
1167     if (cf_name) {
1168       /* Yes - that's bogus. */
1169       cmdarg_err("You can't specify -L and a capture file to be read.");
1170       exit(1);
1171     }
1172     /* No - did they specify a ring buffer option? */
1173     if (capture_opts.multi_files_on) {
1174       cmdarg_err("Ring buffer requested, but a capture isn't being done.");
1175       exit(1);
1176     }
1177   } else {
1178     /* If they didn't specify a "-w" flag, but specified a maximum capture
1179        file size, tell them that this doesn't work, and exit. */
1180     if (capture_opts.has_autostop_filesize && capture_opts.save_file == NULL) {
1181       cmdarg_err("Maximum capture file size specified, but "
1182         "capture isn't being saved to a file.");
1183       exit(1);
1184     }
1185
1186     if (cf_name) {
1187       /*
1188        * "-r" was specified, so we're reading a capture file.
1189        * Capture options don't apply here.
1190        */
1191       if (capture_opts.multi_files_on) {
1192         cmdarg_err("Multiple capture files requested, but "
1193                    "a capture isn't being done.");
1194         exit(1);
1195       }
1196       if (capture_opts.has_file_duration) {
1197         cmdarg_err("Switching capture files after a time interval was specified, but "
1198                    "a capture isn't being done.");
1199         exit(1);
1200       }
1201       if (capture_opts.has_ring_num_files) {
1202         cmdarg_err("A ring buffer of capture files was specified, but "
1203           "a capture isn't being done.");
1204         exit(1);
1205       }
1206       if (capture_opts.has_autostop_files) {
1207         cmdarg_err("A maximum number of capture files was specified, but "
1208           "a capture isn't being done.");
1209         exit(1);
1210       }
1211       if (capture_opts.has_autostop_packets) {
1212         cmdarg_err("A maximum number of captured packets was specified, but "
1213           "a capture isn't being done.");
1214         exit(1);
1215       }
1216       if (capture_opts.has_autostop_filesize) {
1217         cmdarg_err("A maximum capture file size was specified, but "
1218           "a capture isn't being done.");
1219         exit(1);
1220       }
1221       if (capture_opts.has_autostop_duration) {
1222         cmdarg_err("A maximum capture time was specified, but "
1223           "a capture isn't being done.");
1224         exit(1);
1225       }
1226     } else {
1227       /*
1228        * "-r" wasn't specified, so we're doing a live capture.
1229        */
1230       if (capture_opts.saving_to_file) {
1231         /* They specified a "-w" flag, so we'll be saving to a capture file. */
1232
1233         /* When capturing, we only support writing libpcap format. */
1234         if (out_file_type != WTAP_FILE_PCAP) {
1235           cmdarg_err("Live captures can only be saved in libpcap format.");
1236           exit(1);
1237         }
1238         if (capture_opts.multi_files_on) {
1239           /* Multiple-file mode works only under certain conditions:
1240              a) it doesn't work if you're writing to the standard output;
1241              b) it doesn't work if you're writing to a pipe;
1242              c) it makes no sense if the maximum file size is set to "infinite"
1243                 (XXX - shouldn't that be "if there is no stop criterion",
1244                 as you might want to switch files based on a packet count
1245                 or a time). */
1246           if (strcmp(capture_opts.save_file, "-") == 0) {
1247             cmdarg_err("Multiple capture files requested, but "
1248               "the capture is being written to the standard output.");
1249             exit(1);
1250           }
1251           if (capture_opts.output_to_pipe) {
1252             cmdarg_err("Multiple capture files requested, but "
1253               "the capture file is a pipe.");
1254             exit(1);
1255           }
1256           if (!capture_opts.has_autostop_filesize) {
1257             cmdarg_err("Multiple capture files requested, but "
1258               "no maximum capture file size was specified.");
1259             exit(1);
1260           }
1261         }
1262       } else {
1263         /* They didn't specify a "-w" flag, so we won't be saving to a
1264            capture file.  Check for options that only make sense if
1265            we're saving to a file. */
1266         if (capture_opts.has_autostop_filesize) {
1267           cmdarg_err("Maximum capture file size specified, but "
1268            "capture isn't being saved to a file.");
1269           exit(1);
1270         }
1271         if (capture_opts.multi_files_on) {
1272           cmdarg_err("Multiple capture files requested, but "
1273             "the capture isn't being saved to a file.");
1274           exit(1);
1275         }
1276       }
1277     }
1278   }
1279 #endif
1280
1281 #ifdef _WIN32
1282   /* Start windows sockets */
1283   WSAStartup( MAKEWORD( 1, 1 ), &wsaData );
1284 #endif /* _WIN32 */
1285
1286   /* Notify all registered modules that have had any of their preferences
1287      changed either from one of the preferences file or from the command
1288      line that their preferences have changed. */
1289   prefs_apply_all();
1290
1291   /* At this point MATE will have registered its field array so we can
1292      have a tap filter with one of MATE's late-registered fields as part
1293      of the filter.  We can now process all the "-z" arguments. */
1294   start_requested_stats();
1295
1296   /* disabled protocols as per configuration file */
1297   if (gdp_path == NULL && dp_path == NULL) {
1298     set_disabled_protos_list();
1299   }
1300
1301   /* Build the column format array */
1302   col_setup(&cfile.cinfo, prefs->num_cols);
1303   for (i = 0; i < cfile.cinfo.num_cols; i++) {
1304     cfile.cinfo.col_fmt[i] = get_column_format(i);
1305     cfile.cinfo.col_title[i] = g_strdup(get_column_title(i));
1306     cfile.cinfo.fmt_matx[i] = (gboolean *) g_malloc0(sizeof(gboolean) *
1307       NUM_COL_FMTS);
1308     get_column_format_matches(cfile.cinfo.fmt_matx[i], cfile.cinfo.col_fmt[i]);
1309     cfile.cinfo.col_data[i] = NULL;
1310     if (cfile.cinfo.col_fmt[i] == COL_INFO)
1311       cfile.cinfo.col_buf[i] = (gchar *) g_malloc(sizeof(gchar) * COL_MAX_INFO_LEN);
1312     else
1313       cfile.cinfo.col_buf[i] = (gchar *) g_malloc(sizeof(gchar) * COL_MAX_LEN);
1314     cfile.cinfo.col_fence[i] = 0;
1315     cfile.cinfo.col_expr[i] = (gchar *) g_malloc(sizeof(gchar) * COL_MAX_LEN);
1316     cfile.cinfo.col_expr_val[i] = (gchar *) g_malloc(sizeof(gchar) * COL_MAX_LEN);
1317   }
1318
1319   for (i = 0; i < cfile.cinfo.num_cols; i++) {
1320       int j;
1321
1322       for (j = 0; j < NUM_COL_FMTS; j++) {
1323          if (!cfile.cinfo.fmt_matx[i][j])
1324              continue;
1325
1326          if (cfile.cinfo.col_first[j] == -1)
1327              cfile.cinfo.col_first[j] = i;
1328          cfile.cinfo.col_last[j] = i;
1329       }
1330   }
1331
1332 #ifdef HAVE_LIBPCAP
1333   capture_opts_trim_snaplen(&capture_opts, MIN_PACKET_SIZE);
1334   capture_opts_trim_ring_num_files(&capture_opts);
1335 #endif
1336
1337   if (rfilter != NULL) {
1338     if (!dfilter_compile(rfilter, &rfcode)) {
1339       cmdarg_err("%s", dfilter_error_msg);
1340       epan_cleanup();
1341 #ifdef HAVE_PCAP_OPEN_DEAD
1342       {
1343         pcap_t *pc;
1344
1345         pc = pcap_open_dead(DLT_EN10MB, MIN_PACKET_SIZE);
1346         if (pc != NULL) {
1347           if (pcap_compile(pc, &fcode, rfilter, 0, 0) != -1) {
1348             cmdarg_err_cont(
1349               "  Note: That display filter code looks like a valid capture filter;");
1350             cmdarg_err_cont(
1351               "        maybe you mixed them up?");
1352           }
1353           pcap_close(pc);
1354         }
1355       }
1356 #endif
1357       exit(2);
1358     }
1359   }
1360   cfile.rfcode = rfcode;
1361
1362   if (print_packet_info) {
1363     /* If we're printing as text or PostScript, we have
1364        to create a print stream. */
1365     if (output_action == WRITE_TEXT) {
1366       switch (print_format) {
1367
1368       case PR_FMT_TEXT:
1369         print_stream = print_stream_text_stdio_new(stdout);
1370         break;
1371
1372       case PR_FMT_PS:
1373         print_stream = print_stream_ps_stdio_new(stdout);
1374         break;
1375
1376       default:
1377         g_assert_not_reached();
1378       }
1379     }
1380   }
1381
1382   /* We have to dissect each packet if:
1383
1384         we're printing information about each packet;
1385
1386         we're using a read filter on the packets;
1387
1388         we're using any taps. */
1389   do_dissection = print_packet_info || rfcode || have_tap_listeners();
1390
1391   if (cf_name) {
1392     /*
1393      * We're reading a capture file.
1394      */
1395
1396     /*
1397      * Immediately relinquish any special privileges we have; we must not
1398      * be allowed to read any capture files the user running TShark
1399      * can't open.
1400      */
1401     relinquish_special_privs_perm();
1402
1403     if (cf_open(&cfile, cf_name, FALSE, &err) != CF_OK) {
1404       epan_cleanup();
1405       exit(2);
1406     }
1407
1408     /* Set timestamp precision; there should arguably be a command-line
1409        option to let the user set this. */
1410     switch(wtap_file_tsprecision(cfile.wth)) {
1411     case(WTAP_FILE_TSPREC_SEC):
1412       timestamp_set_precision(TS_PREC_AUTO_SEC);
1413       break;
1414     case(WTAP_FILE_TSPREC_DSEC):
1415       timestamp_set_precision(TS_PREC_AUTO_DSEC);
1416       break;
1417     case(WTAP_FILE_TSPREC_CSEC):
1418       timestamp_set_precision(TS_PREC_AUTO_CSEC);
1419       break;
1420     case(WTAP_FILE_TSPREC_MSEC):
1421       timestamp_set_precision(TS_PREC_AUTO_MSEC);
1422       break;
1423     case(WTAP_FILE_TSPREC_USEC):
1424       timestamp_set_precision(TS_PREC_AUTO_USEC);
1425       break;
1426     case(WTAP_FILE_TSPREC_NSEC):
1427       timestamp_set_precision(TS_PREC_AUTO_NSEC);
1428       break;
1429     default:
1430       g_assert_not_reached();
1431     }
1432
1433     /* Process the packets in the file */
1434     err = load_cap_file(&cfile, capture_opts.save_file, out_file_type);
1435     if (err != 0) {
1436       epan_cleanup();
1437       exit(2);
1438     }
1439     cf_name[0] = '\0';
1440   } else {
1441     /* No capture file specified, so we're supposed to do a live capture
1442        (or get a list of link-layer types for a live capture device);
1443        do we have support for live captures? */
1444 #ifdef HAVE_LIBPCAP
1445
1446 #ifdef _WIN32
1447     if (!has_wpcap) {
1448       char *detailed_err;
1449
1450       cmdarg_err("WinPcap couldn't be found.");
1451       detailed_err = cant_load_winpcap_err("TShark");
1452       cmdarg_err_cont("%s", detailed_err);
1453       g_free(detailed_err);
1454       exit(2);
1455     }
1456 #endif
1457
1458     /* trim the interface name and exit if that failed */
1459     if (!capture_opts_trim_iface(&capture_opts,
1460         (prefs->capture_device) ? get_if_name(prefs->capture_device) : NULL)) {
1461         exit(2);
1462     }
1463
1464     /* if requested, list the link layer types and exit */
1465     if (list_link_layer_types) {
1466         status = capture_opts_list_link_layer_types(&capture_opts);
1467         exit(status);
1468     }
1469
1470     if (!print_packet_info && !quiet) {
1471       /*
1472        * We're not printing information for each packet, and the user
1473        * didn't ask us not to print a count of packets as they arrive,
1474        * so print that count so the user knows that packets are arriving.
1475        *
1476        * XXX - what if the user wants to do a live capture, doesn't want
1477        * to save it to a file, doesn't want information printed for each
1478        * packet, does want some "-z" statistic, and wants packet counts
1479        * so they know whether they're seeing any packets?
1480        */
1481       print_packet_counts = TRUE;
1482     }
1483
1484     /* For now, assume libpcap gives microsecond precision. */
1485     timestamp_set_precision(TS_PREC_AUTO_USEC);
1486
1487     capture();
1488
1489     if (capture_opts.multi_files_on) {
1490       ringbuf_free();
1491     }
1492 #else
1493     /* No - complain. */
1494     cmdarg_err("This version of TShark was not built with support for capturing packets.");
1495     exit(2);
1496 #endif
1497   }
1498
1499   draw_tap_listeners(TRUE);
1500   funnel_dump_all_text_windows();
1501   epan_cleanup();
1502
1503   return 0;
1504 }
1505
1506 #ifdef HAVE_LIBPCAP
1507 /* Do the low-level work of a capture.
1508    Returns TRUE if it succeeds, FALSE otherwise. */
1509
1510 static condition  *volatile cnd_file_duration = NULL; /* this must be visible in process_packet */
1511
1512 static int
1513 capture(void)
1514 {
1515   int         err = 0;
1516   int         volatile volatile_err = 0;
1517   int         volatile inpkts = 0;
1518   int         pcap_cnt;
1519   condition  *volatile cnd_autostop_size = NULL;
1520   condition  *volatile cnd_autostop_duration = NULL;
1521   char       *descr;
1522 #ifndef _WIN32
1523   void        (*oldhandler)(int);
1524 #endif
1525   struct pcap_stat stats;
1526   gboolean    write_ok;
1527   gboolean    close_ok;
1528   gboolean    cfilter_error = FALSE;
1529   char        errmsg[1024+1];
1530   char        secondary_errmsg[4096+1];
1531   int         save_file_fd;
1532
1533   /* Initialize all data structures used for dissection. */
1534   init_dissection();
1535
1536   ld.wtap_linktype  = WTAP_ENCAP_UNKNOWN;
1537   ld.pdh            = NULL;
1538   ld.packet_cb      = capture_pcap_cb;
1539
1540
1541   /* open the "input file" from network interface or capture pipe */
1542   if (!capture_loop_open_input(&capture_opts, &ld, errmsg, sizeof(errmsg),
1543                                secondary_errmsg, sizeof(secondary_errmsg))) {
1544     goto error;
1545   }
1546
1547   /*
1548    * We've opened the capture device, so we shouldn't need any special
1549    * privileges any more; relinquish those privileges.
1550    *
1551    * XXX - if we have saved set-user-ID support, we should give up those
1552    * privileges immediately, and then reclaim them long enough to get
1553    * a list of network interfaces and to open one, and then give them
1554    * up again, so that stuff we do while processing the argument list,
1555    * reading the user's preferences, loading and starting plugins
1556    * (especially *user* plugins), etc. is done with the user's privileges,
1557    * not special privileges.
1558    */
1559   relinquish_special_privs_perm();
1560
1561   /* init the input filter from the network interface (capture pipe will do nothing) */
1562   switch (capture_loop_init_filter(ld.pcap_h, ld.from_cap_pipe, capture_opts.iface, capture_opts.cfilter)) {
1563
1564   case INITFILTER_NO_ERROR:
1565     break;
1566
1567   case INITFILTER_BAD_FILTER:
1568     cfilter_error = TRUE;
1569     g_snprintf(errmsg, sizeof(errmsg), "%s", pcap_geterr(ld.pcap_h));
1570     *secondary_errmsg = '\0';
1571     goto error;
1572
1573   case INITFILTER_OTHER_ERROR:
1574     g_snprintf(errmsg, sizeof(errmsg), "Can't install filter (%s).",
1575                pcap_geterr(ld.pcap_h));
1576     g_snprintf(secondary_errmsg, sizeof(secondary_errmsg), "%s", please_report);
1577     goto error;
1578   }
1579
1580   if (capture_opts.saving_to_file) {
1581     /* open the output file (temporary/specified name/ringbuffer/named pipe/stdout) */
1582     if (!capture_loop_open_output(&capture_opts, &save_file_fd, errmsg, sizeof(errmsg))) {
1583       *secondary_errmsg = '\0';
1584       goto error;
1585     }
1586
1587     /* set up to write to the already-opened capture output file/files */
1588     if(!capture_loop_init_output(&capture_opts, save_file_fd, &ld, errmsg, sizeof errmsg)) {
1589       *secondary_errmsg = '\0';
1590       goto error;
1591     }
1592
1593     /* Save the capture file name. */
1594     ld.save_file = capture_opts.save_file;
1595   }
1596
1597   ld.wtap_linktype = wtap_pcap_encap_to_wtap_encap(ld.linktype);
1598
1599 #ifdef _WIN32
1600   /* Catch a CTRL+C event and, if we get it, clean up and exit. */
1601   SetConsoleCtrlHandler(capture_cleanup, TRUE);
1602 #else /* _WIN32 */
1603   /* Catch SIGINT and SIGTERM and, if we get either of them, clean up
1604      and exit.
1605      XXX - deal with signal semantics on various UNIX platforms.  Or just
1606      use "sigaction()" and be done with it? */
1607   signal(SIGTERM, capture_cleanup);
1608   signal(SIGINT, capture_cleanup);
1609   if ((oldhandler = signal(SIGHUP, capture_cleanup)) != SIG_DFL)
1610     signal(SIGHUP, oldhandler);
1611
1612 #ifdef SIGINFO
1613   /* Catch SIGINFO and, if we get it and we're capturing to a file in
1614      quiet mode, report the number of packets we've captured. */
1615   signal(SIGINFO, report_counts_siginfo);
1616 #endif /* SIGINFO */
1617 #endif /* _WIN32 */
1618
1619   /* Let the user know what interface was chosen. */
1620   descr = get_interface_descriptive_name(capture_opts.iface);
1621   fprintf(stderr, "Capturing on %s\n", descr);
1622   g_free(descr);
1623
1624   /* initialize capture stop conditions */
1625   init_capture_stop_conditions();
1626   /* create stop conditions */
1627   if (capture_opts.has_autostop_filesize)
1628     cnd_autostop_size = cnd_new((const char*)CND_CLASS_CAPTURESIZE,
1629                                    (long)capture_opts.autostop_filesize * 1024);
1630   if (capture_opts.has_autostop_duration)
1631     cnd_autostop_duration = cnd_new((const char*)CND_CLASS_TIMEOUT,
1632                                (gint32)capture_opts.autostop_duration);
1633
1634   if (capture_opts.multi_files_on && capture_opts.has_file_duration)
1635     cnd_file_duration = cnd_new(CND_CLASS_TIMEOUT, capture_opts.file_duration);
1636
1637   if (!setjmp(ld.stopenv)) {
1638     ld.go = TRUE;
1639     ld.packet_count = 0;
1640   } else
1641     ld.go = FALSE;
1642
1643   while (ld.go) {
1644     /* We need to be careful with automatic variables defined in the
1645        outer scope which are changed inside the loop.  Most compilers
1646        don't try to roll them back to their original values after the
1647        longjmp which causes the loop to finish, but all that the
1648        standards say is that their values are indeterminate.  If we
1649        don't want them to be rolled back, we should define them with the
1650        volatile attribute (paraphrasing W. Richard Stevens, Advanced
1651        Programming in the UNIX Environment, p. 178).
1652
1653        The "err" variable causes a particular problem.  If we give it
1654        the volatile attribute, then when we pass a reference to it (as
1655        in "&err") to a function, GCC warns: "passing arg <n> of
1656        <function> discards qualifiers from pointer target type".
1657        Therefore within the loop and just beyond we don't use "err".
1658        Within the loop we define "loop_err", and assign its value to
1659        "volatile_err", which is in the outer scope and is checked when
1660        the loop finishes.
1661
1662        We also define "packet_count_prev" here to keep things tidy,
1663        since it's used only inside the loop.  If it were defined in the
1664        outer scope, GCC would give a warning (unnecessary in this case)
1665        that it might be clobbered, and we'd need to give it the volatile
1666        attribute to suppress the warning. */
1667
1668     int loop_err = 0;
1669     int packet_count_prev = 0;
1670
1671     if (cnd_autostop_size == NULL && cnd_autostop_duration == NULL) {
1672       /* We're not stopping at a particular capture file size, and we're
1673          not stopping after some particular amount of time has expired,
1674          so either we have no stop condition or the only stop condition
1675          is a maximum packet count.
1676
1677          If there's no maximum packet count, pass it -1, meaning "until
1678          you run out of packets in the bufferful you read".  Otherwise,
1679          pass it the number of packets we have left to capture.
1680
1681          We don't call "pcap_loop()" as, if we're saving to a file that's
1682          a FIFO, we want to flush the FIFO after we're done processing
1683          this libpcap bufferful of packets, so that the program
1684          reading the FIFO sees the packets immediately and doesn't get
1685          any partial packet, forcing it to block in the middle of reading
1686          that packet. */
1687       if (capture_opts.autostop_packets == 0)
1688         pcap_cnt = -1;
1689       else {
1690         if (ld.packet_count >= capture_opts.autostop_packets) {
1691           /* XXX do we need this test here? */
1692           /* It appears there's nothing more to capture. */
1693           break;
1694         }
1695         pcap_cnt = capture_opts.autostop_packets - ld.packet_count;
1696       }
1697     } else {
1698       /* We need to check the capture file size or the timeout after
1699          each packet. */
1700       pcap_cnt = 1;
1701     }
1702
1703     inpkts = capture_loop_dispatch(NULL, &ld, errmsg, sizeof errmsg);
1704     if (inpkts < 0) {
1705       /* Error from "pcap_dispatch()", or error or "no more packets" from
1706          "cap_pipe_dispatch(). */
1707       ld.go = FALSE;
1708     } else if (cnd_autostop_duration != NULL && cnd_eval(cnd_autostop_duration)) {
1709       /* The specified capture time has elapsed; stop the capture. */
1710       ld.go = FALSE;
1711     } else if (inpkts > 0) {
1712       if (capture_opts.autostop_packets != 0 &&
1713                  ld.packet_count >= capture_opts.autostop_packets) {
1714         /* The specified number of packets have been captured and have
1715            passed both any capture filter in effect and any read filter
1716            in effect. */
1717         ld.go = FALSE;
1718       } else if (cnd_autostop_size != NULL &&
1719                     cnd_eval(cnd_autostop_size, (guint32)ld.bytes_written)) {
1720         /* We're saving the capture to a file, and the capture file reached
1721            its maximum size. */
1722         if (capture_opts.multi_files_on) {
1723           /* Switch to the next ringbuffer file */
1724           if (ringbuf_switch_file(&ld.pdh, &capture_opts.save_file,
1725                                   &save_file_fd, &ld.bytes_written,
1726                                   &loop_err)) {
1727             /* File switch succeeded: reset the condition */
1728             cnd_reset(cnd_autostop_size);
1729             if (cnd_file_duration) {
1730               cnd_reset(cnd_file_duration);
1731             }
1732           } else {
1733             /* File switch failed: stop here */
1734             volatile_err = loop_err;
1735             ld.go = FALSE;
1736           }
1737         } else {
1738           /* No ringbuffer - just stop. */
1739           ld.go = FALSE;
1740         }
1741       }
1742       if (capture_opts.output_to_pipe) {
1743         if (ld.packet_count > packet_count_prev) {
1744           libpcap_dump_flush(ld.pdh, NULL);
1745           packet_count_prev = ld.packet_count;
1746         }
1747       }
1748     } /* inpkts > 0 */
1749   } /* while (ld.go) */
1750
1751   /* delete stop conditions */
1752   if (cnd_autostop_size != NULL)
1753     cnd_delete(cnd_autostop_size);
1754   if (cnd_autostop_duration != NULL)
1755     cnd_delete(cnd_autostop_duration);
1756   if (cnd_file_duration != NULL)
1757     cnd_delete(cnd_file_duration);
1758
1759   if (print_packet_counts) {
1760     /* We're printing packet counts to stderr.
1761        Send a newline so that we move to the line after the packet count. */
1762     fprintf(stderr, "\n");
1763   }
1764
1765   /* If we got an error while capturing, report it. */
1766   if (inpkts < 0) {
1767     if (ld.from_cap_pipe) {
1768       if (ld.cap_pipe_err == PIPERR) {
1769         cmdarg_err("Error while capturing packets: %s", errmsg);
1770       }
1771     } else {
1772       cmdarg_err("Error while capturing packets: %s", pcap_geterr(ld.pcap_h));
1773     }
1774   }
1775
1776   if (volatile_err == 0)
1777     write_ok = TRUE;
1778   else {
1779     show_capture_file_io_error(capture_opts.save_file, volatile_err, FALSE);
1780     write_ok = FALSE;
1781   }
1782
1783   if (capture_opts.save_file != NULL) {
1784     /* We're saving to a file or files; close all files. */
1785     close_ok = capture_loop_close_output(&capture_opts, &ld, &err);
1786
1787     /* If we've displayed a message about a write error, there's no point
1788        in displaying another message about an error on close. */
1789     if (!close_ok && write_ok)
1790       show_capture_file_io_error(capture_opts.save_file, err, TRUE);
1791   }
1792
1793   if (ld.from_cap_pipe && ld.cap_pipe_fd >= 0)
1794     eth_close(ld.cap_pipe_fd);
1795   else {
1796     /* Get the capture statistics, and, if any packets were dropped, report
1797        that. */
1798     if (pcap_stats(ld.pcap_h, &stats) >= 0) {
1799       if (stats.ps_drop != 0) {
1800         fprintf(stderr, "%u packets dropped\n", stats.ps_drop);
1801       }
1802     } else {
1803       cmdarg_err("Can't get packet-drop statistics: %s", pcap_geterr(ld.pcap_h));
1804     }
1805     pcap_close(ld.pcap_h);
1806   }
1807
1808   /* Report the number of captured packets if not reported during capture
1809      and we are saving to a file. */
1810   report_counts();
1811
1812   return TRUE;
1813
1814 error:
1815   if (capture_opts.multi_files_on) {
1816     ringbuf_error_cleanup();
1817   }
1818   g_free(capture_opts.save_file);
1819   capture_opts.save_file = NULL;
1820   if (cfilter_error) {
1821     dfilter_t   *rfcode = NULL;
1822     if (dfilter_compile(capture_opts.cfilter, &rfcode) && rfcode != NULL) {
1823       cmdarg_err(
1824         "Invalid capture filter: \"%s\"!\n"
1825         "\n"
1826         "That string looks like a valid display filter; however, it isn't a valid\n"
1827         "capture filter (%s).\n"
1828         "\n"
1829         "Note that display filters and capture filters don't have the same syntax,\n"
1830         "so you can't use most display filter expressions as capture filters.\n"
1831         "\n"
1832         "See the User's Guide for a description of the capture filter syntax.",
1833         capture_opts.cfilter, errmsg);
1834       dfilter_free(rfcode);
1835     } else {
1836       cmdarg_err(
1837         "Invalid capture filter: \"%s\"!\n"
1838         "\n"
1839         "That string isn't a valid capture filter (%s).\n"
1840         "See the User's Guide for a description of the capture filter syntax.",
1841         capture_opts.cfilter, errmsg);
1842     }
1843   } else {
1844     cmdarg_err("%s", errmsg);
1845     if (*secondary_errmsg != '\0') {
1846       fprintf(stderr, "\n");
1847       cmdarg_err_cont("%s", secondary_errmsg);
1848     }
1849   }
1850   if (ld.from_cap_pipe) {
1851     if (ld.cap_pipe_fd >= 0)
1852       eth_close(ld.cap_pipe_fd);
1853   } else {
1854   if (ld.pcap_h != NULL)
1855     pcap_close(ld.pcap_h);
1856   }
1857
1858   return FALSE;
1859 }
1860
1861 static void
1862 capture_pcap_cb(u_char *user, const struct pcap_pkthdr *phdr,
1863   const u_char *pd)
1864 {
1865   struct wtap_pkthdr whdr;
1866   union wtap_pseudo_header pseudo_header;
1867   const guchar *wtap_pd;
1868   loop_data *ld = (loop_data *) user;
1869   int loop_err;
1870   int err;
1871   int save_file_fd;
1872   gboolean packet_accepted;
1873
1874 #ifdef SIGINFO
1875   /*
1876    * Prevent a SIGINFO handler from writing to stdout while we're
1877    * doing so; instead, have it just set a flag telling us to print
1878    * that information when we're done.
1879    */
1880   infodelay = TRUE;
1881 #endif /* SIGINFO */
1882
1883   /* The current packet may have arrived after a very long silence,
1884    * way past the time to switch files.  In order not to have
1885    * the first packet of a new series of events as the last
1886    * [or only] packet in the file, switch before writing!
1887    */
1888   if (cnd_file_duration != NULL && cnd_eval(cnd_file_duration)) {
1889     /* time elapsed for this ring file, switch to the next */
1890     if (ringbuf_switch_file(&ld->pdh, &ld->save_file, &save_file_fd,
1891                             &ld->bytes_written, &loop_err)) {
1892       /* File switch succeeded: reset the condition */
1893       cnd_reset(cnd_file_duration);
1894     } else {
1895       /* File switch failed: stop here */
1896       /* XXX - we should do something with "loop_err" */
1897       ld->go = FALSE;
1898     }
1899   }
1900
1901   if (do_dissection) {
1902     /* We're goint to print packet information, run a read filter, or
1903        process taps.  Use process_packet() to handle that; in order
1904        to do that, we need to convert from libpcap to Wiretap format.
1905        If that fails, ignore the packet (wtap_process_pcap_packet has
1906        written an error message). */
1907     wtap_pd = wtap_process_pcap_packet(ld->wtap_linktype, phdr, pd,
1908                                        &pseudo_header, &whdr, &err);
1909     if (wtap_pd == NULL)
1910       return;
1911
1912     packet_accepted = process_packet(&cfile, 0, &whdr, &pseudo_header, wtap_pd);
1913   } else {
1914     /* We're just writing out packets. */
1915     packet_accepted = TRUE;
1916   }
1917
1918   if (packet_accepted) {
1919     /* Count this packet. */
1920 #ifdef HAVE_LIBPCAP
1921     ld->packet_count++;
1922 #endif
1923
1924     if (ld->pdh != NULL) {
1925       if (!libpcap_write_packet(ld->pdh, phdr, pd, &ld->bytes_written, &err)) {
1926         /* Error writing to a capture file */
1927         if (print_packet_counts) {
1928           /* We're printing counts of packets captured; move to the line after
1929              the count. */
1930           fprintf(stderr, "\n");
1931         }
1932         show_capture_file_io_error(ld->save_file, err, FALSE);
1933         pcap_close(ld->pcap_h);
1934         libpcap_dump_close(ld->pdh, &err);
1935         exit(2);
1936       }
1937     }
1938     if (print_packet_counts) {
1939       /* We're printing packet counts. */
1940       if (ld->packet_count != 0) {
1941         fprintf(stderr, "\r%u ", ld->packet_count);
1942         /* stderr could be line buffered */
1943         fflush(stderr);
1944       }
1945     }
1946   }
1947
1948 #ifdef SIGINFO
1949   /*
1950    * Allow SIGINFO handlers to write.
1951    */
1952   infodelay = FALSE;
1953
1954   /*
1955    * If a SIGINFO handler asked us to write out capture counts, do so.
1956    */
1957   if (infoprint)
1958     report_counts();
1959 #endif /* SIGINFO */
1960 }
1961
1962 #ifdef _WIN32
1963 static BOOL WINAPI
1964 capture_cleanup(DWORD ctrltype _U_)
1965 {
1966   /* CTRL_C_EVENT is sort of like SIGINT, CTRL_BREAK_EVENT is unique to
1967      Windows, CTRL_CLOSE_EVENT is sort of like SIGHUP, CTRL_LOGOFF_EVENT
1968      is also sort of like SIGHUP, and CTRL_SHUTDOWN_EVENT is sort of
1969      like SIGTERM at least when the machine's shutting down.
1970
1971      For now, we handle them all as indications that we should clean up
1972      and quit, just as we handle SIGINT, SIGHUP, and SIGTERM in that
1973      way on UNIX.
1974
1975      However, as handlers run in a new thread, we can't just longjmp
1976      out; we have to set "ld.go" to FALSE, and must return TRUE so that
1977      no other handler - such as one that would terminate the process -
1978      gets called.
1979
1980      XXX - for some reason, typing ^C to TShark, if you run this in
1981      a Cygwin console window in at least some versions of Cygwin,
1982      causes TShark to terminate immediately; this routine gets
1983      called, but the main loop doesn't get a chance to run and
1984      exit cleanly, at least if this is compiled with Microsoft Visual
1985      C++ (i.e., it's a property of the Cygwin console window or Bash;
1986      it happens if TShark is not built with Cygwin - for all I know,
1987      building it with Cygwin may make the problem go away). */
1988   ld.go = FALSE;
1989   return TRUE;
1990 }
1991 #else
1992 static void
1993 capture_cleanup(int signum _U_)
1994 {
1995   /* Longjmp back to the starting point; "pcap_dispatch()", on many
1996      UNIX platforms, just keeps looping if it gets EINTR, so if we set
1997      "ld.go" to FALSE and return, we won't break out of it and quit
1998      capturing. */
1999   longjmp(ld.stopenv, 1);
2000 }
2001 #endif /* _WIN32 */
2002
2003 static void
2004 report_counts(void)
2005 {
2006 #ifdef SIGINFO
2007   /* XXX - if we use sigaction, this doesn't have to be done.
2008      (Yes, this isn't necessary on BSD, but just in case a system
2009      where "signal()" has AT&T semantics adopts SIGINFO....) */
2010   signal(SIGINFO, report_counts_siginfo);
2011 #endif /* SIGINFO */
2012
2013   if (!print_packet_counts) {
2014     /* Report the count only if we aren't printing a packet count
2015        as packets arrive. */
2016     fprintf(stderr, "%u packets captured\n", ld.packet_count);
2017   }
2018 #ifdef SIGINFO
2019   infoprint = FALSE; /* we just reported it */
2020 #endif /* SIGINFO */
2021 }
2022
2023 #ifdef SIGINFO
2024 static void
2025 report_counts_siginfo(int signum _U_)
2026 {
2027   int sav_errno = errno;
2028   /* If we've been told to delay printing, just set a flag asking
2029      that we print counts (if we're supposed to), otherwise print
2030      the count of packets captured (if we're supposed to). */
2031   if (infodelay)
2032     infoprint = TRUE;
2033   else
2034     report_counts();
2035   errno = sav_errno;
2036 }
2037 #endif /* SIGINFO */
2038 #endif /* HAVE_LIBPCAP */
2039
2040 static int
2041 load_cap_file(capture_file *cf, char *save_file, int out_file_type)
2042 {
2043   gint         linktype;
2044   int          snapshot_length;
2045   wtap_dumper *pdh;
2046   int          err;
2047   gchar        *err_info;
2048   gint64       data_offset;
2049   char         *save_file_string = NULL;
2050
2051   linktype = wtap_file_encap(cf->wth);
2052   if (save_file != NULL) {
2053     /* Get a string that describes what we're writing to */
2054     save_file_string = output_file_description(save_file);
2055
2056     /* Set up to write to the capture file. */
2057     snapshot_length = wtap_snapshot_length(cf->wth);
2058     if (snapshot_length == 0) {
2059       /* Snapshot length of input file not known. */
2060       snapshot_length = WTAP_MAX_PACKET_SIZE;
2061     }
2062     pdh = wtap_dump_open(save_file, out_file_type, linktype, snapshot_length,
2063                          FALSE /* compressed */, &err);
2064
2065     if (pdh == NULL) {
2066       /* We couldn't set up to write to the capture file. */
2067       switch (err) {
2068
2069       case WTAP_ERR_UNSUPPORTED_FILE_TYPE:
2070         cmdarg_err("Capture files can't be written in that format.");
2071         break;
2072
2073       case WTAP_ERR_UNSUPPORTED_ENCAP:
2074       case WTAP_ERR_ENCAP_PER_PACKET_UNSUPPORTED:
2075         cmdarg_err("The capture file being read can't be written in "
2076           "that format.");
2077         break;
2078
2079       case WTAP_ERR_CANT_OPEN:
2080         cmdarg_err("The %s couldn't be created for some "
2081           "unknown reason.", save_file_string);
2082         break;
2083
2084       case WTAP_ERR_SHORT_WRITE:
2085         cmdarg_err("A full header couldn't be written to the %s.",
2086                    save_file_string);
2087         break;
2088
2089       default:
2090         cmdarg_err("The %s could not be created: %s.", save_file_string,
2091                    wtap_strerror(err));
2092         break;
2093       }
2094       goto out;
2095     }
2096   } else {
2097     if (print_packet_info) {
2098       if (!write_preamble(cf)) {
2099         err = errno;
2100         show_print_file_io_error(err);
2101         goto out;
2102       }
2103     }
2104     pdh = NULL;
2105   }
2106   while (wtap_read(cf->wth, &err, &err_info, &data_offset)) {
2107     if (process_packet(cf, data_offset, wtap_phdr(cf->wth),
2108                        wtap_pseudoheader(cf->wth), wtap_buf_ptr(cf->wth))) {
2109       /* Either there's no read filtering or this packet passed the
2110          filter, so, if we're writing to a capture file, write
2111          this packet out. */
2112       if (pdh != NULL) {
2113         if (!wtap_dump(pdh, wtap_phdr(cf->wth),
2114                        wtap_pseudoheader(cf->wth), wtap_buf_ptr(cf->wth),
2115                        &err)) {
2116           /* Error writing to a capture file */
2117           show_capture_file_io_error(save_file, err, FALSE);
2118           wtap_dump_close(pdh, &err);
2119           exit(2);
2120         }
2121       }
2122     }
2123   }
2124   if (err != 0) {
2125     /* Print a message noting that the read failed somewhere along the line. */
2126     switch (err) {
2127
2128     case WTAP_ERR_UNSUPPORTED_ENCAP:
2129       cmdarg_err("\"%s\" has a packet with a network type that TShark doesn't support.\n(%s)",
2130                  cf->filename, err_info);
2131       break;
2132
2133     case WTAP_ERR_CANT_READ:
2134       cmdarg_err("An attempt to read from \"%s\" failed for some unknown reason.",
2135                  cf->filename);
2136       break;
2137
2138     case WTAP_ERR_SHORT_READ:
2139       cmdarg_err("\"%s\" appears to have been cut short in the middle of a packet.",
2140                  cf->filename);
2141       break;
2142
2143     case WTAP_ERR_BAD_RECORD:
2144       cmdarg_err("\"%s\" appears to be damaged or corrupt.\n(%s)",
2145                  cf->filename, err_info);
2146       break;
2147
2148     default:
2149       cmdarg_err("An error occurred while reading \"%s\": %s.",
2150                  cf->filename, wtap_strerror(err));
2151       break;
2152     }
2153     if (save_file != NULL) {
2154       /* Now close the capture file. */
2155       if (!wtap_dump_close(pdh, &err))
2156         show_capture_file_io_error(save_file, err, TRUE);
2157     }
2158   } else {
2159     if (save_file != NULL) {
2160       /* Now close the capture file. */
2161       if (!wtap_dump_close(pdh, &err))
2162         show_capture_file_io_error(save_file, err, TRUE);
2163     } else {
2164       if (print_packet_info) {
2165         if (!write_finale()) {
2166           err = errno;
2167           show_print_file_io_error(err);
2168         }
2169       }
2170     }
2171   }
2172
2173 out:
2174   wtap_close(cf->wth);
2175   cf->wth = NULL;
2176
2177   if (save_file_string != NULL)
2178     g_free(save_file_string);
2179
2180   return err;
2181 }
2182
2183 static void
2184 fill_in_fdata(frame_data *fdata, capture_file *cf,
2185               const struct wtap_pkthdr *phdr, gint64 offset)
2186 {
2187   fdata->next = NULL;
2188   fdata->prev = NULL;
2189   fdata->pfd = NULL;
2190   fdata->num = cf->count;
2191   fdata->pkt_len = phdr->len;
2192   cum_bytes += phdr->len;
2193   fdata->cum_bytes  = cum_bytes;
2194   fdata->cap_len = phdr->caplen;
2195   fdata->file_off = offset;
2196   fdata->lnk_t = phdr->pkt_encap;
2197   fdata->abs_ts = *((nstime_t *) &phdr->ts);
2198   fdata->flags.passed_dfilter = 0;
2199   fdata->flags.encoding = CHAR_ASCII;
2200   fdata->flags.visited = 0;
2201   fdata->flags.marked = 0;
2202   fdata->flags.ref_time = 0;
2203   fdata->color_filter = NULL;
2204
2205   /* If we don't have the time stamp of the first packet in the
2206      capture, it's because this is the first packet.  Save the time
2207      stamp of this packet as the time stamp of the first packet. */
2208   if (nstime_is_zero(&first_ts)) {
2209     first_ts = fdata->abs_ts;
2210   }
2211
2212   /* If we don't have the time stamp of the previous displayed packet,
2213      it's because this is the first displayed packet.  Save the time
2214      stamp of this packet as the time stamp of the previous displayed
2215      packet. */
2216   if (nstime_is_zero(&prev_ts)) {
2217     prev_ts = fdata->abs_ts;
2218   }
2219
2220   /* Get the time elapsed between the first packet and this packet. */
2221   nstime_delta(&fdata->rel_ts, &fdata->abs_ts, &first_ts);
2222
2223   /* If it's greater than the current elapsed time, set the elapsed time
2224      to it (we check for "greater than" so as not to be confused by
2225      time moving backwards). */
2226   if ((gint32)cf->elapsed_time.secs < fdata->rel_ts.secs
2227         || ((gint32)cf->elapsed_time.secs == fdata->rel_ts.secs && (gint32)cf->elapsed_time.nsecs < fdata->rel_ts.nsecs)) {
2228     cf->elapsed_time = fdata->rel_ts;
2229   }
2230
2231   /* Get the time elapsed between the previous displayed packet and
2232      this packet. */
2233   nstime_delta(&fdata->del_ts, &fdata->abs_ts, &prev_ts);
2234   prev_ts = fdata->abs_ts;
2235 }
2236
2237 /* Free up all data attached to a "frame_data" structure. */
2238 static void
2239 clear_fdata(frame_data *fdata)
2240 {
2241   if (fdata->pfd)
2242     g_slist_free(fdata->pfd);
2243 }
2244
2245 static gboolean
2246 process_packet(capture_file *cf, gint64 offset, const struct wtap_pkthdr *whdr,
2247                union wtap_pseudo_header *pseudo_header, const guchar *pd)
2248 {
2249   frame_data fdata;
2250   gboolean create_proto_tree;
2251   epan_dissect_t *edt;
2252   gboolean passed;
2253
2254   /* Count this packet. */
2255   cf->count++;
2256
2257   /* If we're going to print packet information, or we're going to
2258      run a read filter, or we're going to process taps, set up to
2259      do a dissection and do so. */
2260   if (do_dissection) {
2261     fill_in_fdata(&fdata, cf, whdr, offset);
2262
2263     if (print_packet_info) {
2264       /* Grab any resolved addresses */
2265
2266       if (g_resolv_flags) {
2267         host_name_lookup_process(NULL);
2268       }
2269     }
2270
2271     passed = TRUE;
2272     if (cf->rfcode || verbose || num_tap_filters!=0)
2273       create_proto_tree = TRUE;
2274     else
2275       create_proto_tree = FALSE;
2276     /* The protocol tree will be "visible", i.e., printed, only if we're
2277        printing packet details, which is true if we're printing stuff
2278        ("print_packet_info" is true) and we're in verbose mode ("verbose"
2279        is true). */
2280     edt = epan_dissect_new(create_proto_tree, print_packet_info && verbose);
2281
2282     /* If we're running a read filter, prime the epan_dissect_t with that
2283        filter. */
2284     if (cf->rfcode)
2285       epan_dissect_prime_dfilter(edt, cf->rfcode);
2286
2287     tap_queue_init(edt);
2288
2289     /* We only need the columns if we're printing packet info but we're
2290        *not* verbose; in verbose mode, we print the protocol tree, not
2291        the protocol summary. */
2292     epan_dissect_run(edt, pseudo_header, pd, &fdata,
2293                      (print_packet_info && !verbose) ? &cf->cinfo : NULL);
2294
2295     tap_push_tapped_queue(edt);
2296
2297     /* Run the read filter if we have one. */
2298     if (cf->rfcode)
2299       passed = dfilter_apply_edt(cf->rfcode, edt);
2300     else
2301       passed = TRUE;
2302   } else {
2303     /* We're not running a display filter and we're not printing any
2304        packet information, so we don't need to do a dissection, and all
2305        packets are processed. */
2306     edt = NULL;
2307     passed = TRUE;
2308   }
2309
2310   if (passed) {
2311     /* Process this packet. */
2312     if (print_packet_info) {
2313       /* We're printing packet information; print the information for
2314          this packet. */
2315       print_packet(cf, edt);
2316
2317       /* The ANSI C standard does not appear to *require* that a line-buffered
2318          stream be flushed to the host environment whenever a newline is
2319          written, it just says that, on such a stream, characters "are
2320          intended to be transmitted to or from the host environment as a
2321          block when a new-line character is encountered".
2322
2323          The Visual C++ 6.0 C implementation doesn't do what is intended;
2324          even if you set a stream to be line-buffered, it still doesn't
2325          flush the buffer at the end of every line.
2326
2327          So, if the "-l" flag was specified, we flush the standard output
2328          at the end of a packet.  This will do the right thing if we're
2329          printing packet summary lines, and, as we print the entire protocol
2330          tree for a single packet without waiting for anything to happen,
2331          it should be as good as line-buffered mode if we're printing
2332          protocol trees.  (The whole reason for the "-l" flag in either
2333          tcpdump or TShark is to allow the output of a live capture to
2334          be piped to a program or script and to have that script see the
2335          information for the packet as soon as it's printed, rather than
2336          having to wait until a standard I/O buffer fills up. */
2337       if (line_buffered)
2338         fflush(stdout);
2339
2340       if (ferror(stdout)) {
2341         show_print_file_io_error(errno);
2342         exit(2);
2343       }
2344     }
2345   }
2346
2347   if (do_dissection) {
2348     epan_dissect_free(edt);
2349     clear_fdata(&fdata);
2350   }
2351   return passed;
2352 }
2353
2354 static void
2355 show_capture_file_io_error(const char *fname, int err, gboolean is_close)
2356 {
2357   char *save_file_string;
2358
2359   save_file_string = output_file_description(fname);
2360
2361   switch (err) {
2362
2363   case ENOSPC:
2364     cmdarg_err("Not all the packets could be written to the %s because there is "
2365                "no space left on the file system.",
2366                save_file_string);
2367     break;
2368
2369 #ifdef EDQUOT
2370   case EDQUOT:
2371     cmdarg_err("Not all the packets could be written to the %s because you are "
2372                "too close to, or over your disk quota.",
2373                save_file_string);
2374   break;
2375 #endif
2376
2377   case WTAP_ERR_CANT_CLOSE:
2378     cmdarg_err("The %s couldn't be closed for some unknown reason.",
2379                save_file_string);
2380     break;
2381
2382   case WTAP_ERR_SHORT_WRITE:
2383     cmdarg_err("Not all the packets could be written to the %s.",
2384                save_file_string);
2385     break;
2386
2387   default:
2388     if (is_close) {
2389       cmdarg_err("The %s could not be closed: %s.", save_file_string,
2390                  wtap_strerror(err));
2391     } else {
2392       cmdarg_err("An error occurred while writing to the %s: %s.",
2393                  save_file_string, wtap_strerror(err));
2394     }
2395     break;
2396   }
2397   g_free(save_file_string);
2398 }
2399
2400 static gboolean
2401 write_preamble(capture_file *cf)
2402 {
2403   switch (output_action) {
2404
2405   case WRITE_TEXT:
2406     return print_preamble(print_stream, cf->filename);
2407     break;
2408
2409   case WRITE_XML:
2410     if (verbose)
2411       write_pdml_preamble(stdout);
2412     else
2413       write_psml_preamble(stdout);
2414     return !ferror(stdout);
2415
2416   default:
2417     g_assert_not_reached();
2418     return FALSE;
2419   }
2420 }
2421
2422 static char *
2423 get_line_buf(size_t len)
2424 {
2425   static char *line_bufp = NULL;
2426   static size_t line_buf_len = 256;
2427   size_t new_line_buf_len;
2428
2429   for (new_line_buf_len = line_buf_len; len > new_line_buf_len;
2430        new_line_buf_len *= 2)
2431     ;
2432   if (line_bufp == NULL) {
2433     line_buf_len = new_line_buf_len;
2434     line_bufp = g_malloc(line_buf_len + 1);
2435   } else {
2436     if (new_line_buf_len > line_buf_len) {
2437       line_buf_len = new_line_buf_len;
2438       line_bufp = g_realloc(line_bufp, line_buf_len + 1);
2439     }
2440   }
2441   return line_bufp;
2442 }
2443
2444 static gboolean
2445 print_columns(capture_file *cf)
2446 {
2447   char *line_bufp;
2448   int i;
2449   size_t buf_offset;
2450   size_t column_len;
2451
2452   line_bufp = get_line_buf(256);
2453   buf_offset = 0;
2454   *line_bufp = '\0';
2455   for (i = 0; i < cf->cinfo.num_cols; i++) {
2456     switch (cf->cinfo.col_fmt[i]) {
2457     case COL_NUMBER:
2458 #ifdef HAVE_LIBPCAP
2459       /*
2460        * Don't print this if we're doing a live capture from a network
2461        * interface - if we're doing a live capture, you won't be
2462        * able to look at the capture in the future (it's not being
2463        * saved anywhere), so the frame numbers are unlikely to be
2464        * useful.
2465        *
2466        * (XXX - it might be nice to be able to save and print at
2467        * the same time, sort of like an "Update list of packets
2468        * in real time" capture in Wireshark.)
2469        */
2470       if (capture_opts.iface != NULL)
2471         continue;
2472 #endif
2473       column_len = strlen(cf->cinfo.col_data[i]);
2474       if (column_len < 3)
2475         column_len = 3;
2476       line_bufp = get_line_buf(buf_offset + column_len);
2477       sprintf(line_bufp + buf_offset, "%3s", cf->cinfo.col_data[i]);
2478       break;
2479
2480     case COL_CLS_TIME:
2481     case COL_REL_TIME:
2482     case COL_ABS_TIME:
2483     case COL_ABS_DATE_TIME: /* XXX - wider */
2484       column_len = strlen(cf->cinfo.col_data[i]);
2485       if (column_len < 10)
2486         column_len = 10;
2487       line_bufp = get_line_buf(buf_offset + column_len);
2488       sprintf(line_bufp + buf_offset, "%10s", cf->cinfo.col_data[i]);
2489       break;
2490
2491     case COL_DEF_SRC:
2492     case COL_RES_SRC:
2493     case COL_UNRES_SRC:
2494     case COL_DEF_DL_SRC:
2495     case COL_RES_DL_SRC:
2496     case COL_UNRES_DL_SRC:
2497     case COL_DEF_NET_SRC:
2498     case COL_RES_NET_SRC:
2499     case COL_UNRES_NET_SRC:
2500       column_len = strlen(cf->cinfo.col_data[i]);
2501       if (column_len < 12)
2502         column_len = 12;
2503       line_bufp = get_line_buf(buf_offset + column_len);
2504       sprintf(line_bufp + buf_offset, "%12s", cf->cinfo.col_data[i]);
2505       break;
2506
2507     case COL_DEF_DST:
2508     case COL_RES_DST:
2509     case COL_UNRES_DST:
2510     case COL_DEF_DL_DST:
2511     case COL_RES_DL_DST:
2512     case COL_UNRES_DL_DST:
2513     case COL_DEF_NET_DST:
2514     case COL_RES_NET_DST:
2515     case COL_UNRES_NET_DST:
2516       column_len = strlen(cf->cinfo.col_data[i]);
2517       if (column_len < 12)
2518         column_len = 12;
2519       line_bufp = get_line_buf(buf_offset + column_len);
2520       sprintf(line_bufp + buf_offset, "%-12s", cf->cinfo.col_data[i]);
2521       break;
2522
2523     default:
2524       column_len = strlen(cf->cinfo.col_data[i]);
2525       line_bufp = get_line_buf(buf_offset + column_len);
2526       strcat(line_bufp + buf_offset, cf->cinfo.col_data[i]);
2527       break;
2528     }
2529     buf_offset += column_len;
2530     if (i != cf->cinfo.num_cols - 1) {
2531       /*
2532        * This isn't the last column, so we need to print a
2533        * separator between this column and the next.
2534        *
2535        * If we printed a network source and are printing a
2536        * network destination of the same type next, separate
2537        * them with "->"; if we printed a network destination
2538        * and are printing a network source of the same type
2539        * next, separate them with "<-"; otherwise separate them
2540        * with a space.
2541        *
2542        * We add enough space to the buffer for " <- " or " -> ",
2543        * even if we're only adding " ".
2544        */
2545       line_bufp = get_line_buf(buf_offset + 4);
2546       switch (cf->cinfo.col_fmt[i]) {
2547
2548       case COL_DEF_SRC:
2549       case COL_RES_SRC:
2550       case COL_UNRES_SRC:
2551         switch (cf->cinfo.col_fmt[i + 1]) {
2552
2553         case COL_DEF_DST:
2554         case COL_RES_DST:
2555         case COL_UNRES_DST:
2556           strcat(line_bufp + buf_offset, " -> ");
2557           buf_offset += 4;
2558           break;
2559
2560         default:
2561           strcat(line_bufp + buf_offset, " ");
2562           buf_offset += 1;
2563           break;
2564         }
2565         break;
2566
2567       case COL_DEF_DL_SRC:
2568       case COL_RES_DL_SRC:
2569       case COL_UNRES_DL_SRC:
2570         switch (cf->cinfo.col_fmt[i + 1]) {
2571
2572         case COL_DEF_DL_DST:
2573         case COL_RES_DL_DST:
2574         case COL_UNRES_DL_DST:
2575           strcat(line_bufp + buf_offset, " -> ");
2576           buf_offset += 4;
2577           break;
2578
2579         default:
2580           strcat(line_bufp + buf_offset, " ");
2581           buf_offset += 1;
2582           break;
2583         }
2584         break;
2585
2586       case COL_DEF_NET_SRC:
2587       case COL_RES_NET_SRC:
2588       case COL_UNRES_NET_SRC:
2589         switch (cf->cinfo.col_fmt[i + 1]) {
2590
2591         case COL_DEF_NET_DST:
2592         case COL_RES_NET_DST:
2593         case COL_UNRES_NET_DST:
2594           strcat(line_bufp + buf_offset, " -> ");
2595           buf_offset += 4;
2596           break;
2597
2598         default:
2599           strcat(line_bufp + buf_offset, " ");
2600           buf_offset += 1;
2601           break;
2602         }
2603         break;
2604
2605       case COL_DEF_DST:
2606       case COL_RES_DST:
2607       case COL_UNRES_DST:
2608         switch (cf->cinfo.col_fmt[i + 1]) {
2609
2610         case COL_DEF_SRC:
2611         case COL_RES_SRC:
2612         case COL_UNRES_SRC:
2613           strcat(line_bufp + buf_offset, " <- ");
2614           buf_offset += 4;
2615           break;
2616
2617         default:
2618           strcat(line_bufp + buf_offset, " ");
2619           buf_offset += 1;
2620           break;
2621         }
2622         break;
2623
2624       case COL_DEF_DL_DST:
2625       case COL_RES_DL_DST:
2626       case COL_UNRES_DL_DST:
2627         switch (cf->cinfo.col_fmt[i + 1]) {
2628
2629         case COL_DEF_DL_SRC:
2630         case COL_RES_DL_SRC:
2631         case COL_UNRES_DL_SRC:
2632           strcat(line_bufp + buf_offset, " <- ");
2633           buf_offset += 4;
2634           break;
2635
2636         default:
2637           strcat(line_bufp + buf_offset, " ");
2638           buf_offset += 1;
2639           break;
2640         }
2641         break;
2642
2643       case COL_DEF_NET_DST:
2644       case COL_RES_NET_DST:
2645       case COL_UNRES_NET_DST:
2646         switch (cf->cinfo.col_fmt[i + 1]) {
2647
2648         case COL_DEF_NET_SRC:
2649         case COL_RES_NET_SRC:
2650         case COL_UNRES_NET_SRC:
2651           strcat(line_bufp + buf_offset, " <- ");
2652           buf_offset += 4;
2653           break;
2654
2655         default:
2656           strcat(line_bufp + buf_offset, " ");
2657           buf_offset += 1;
2658           break;
2659         }
2660         break;
2661
2662       default:
2663         strcat(line_bufp + buf_offset, " ");
2664         buf_offset += 1;
2665         break;
2666       }
2667     }
2668   }
2669   return print_line(print_stream, 0, line_bufp);
2670 }
2671
2672 static gboolean
2673 print_packet(capture_file *cf, epan_dissect_t *edt)
2674 {
2675   print_args_t  print_args;
2676
2677   if (verbose) {
2678     /* Print the information in the protocol tree. */
2679     switch (output_action) {
2680
2681     case WRITE_TEXT:
2682       print_args.to_file = TRUE;
2683       print_args.format = print_format;
2684       print_args.print_summary = !verbose;
2685       print_args.print_hex = verbose && print_hex;
2686       print_args.print_formfeed = FALSE;
2687       print_args.print_dissections = verbose ? print_dissections_expanded : print_dissections_none;
2688
2689       /* init the packet range */
2690       packet_range_init(&print_args.range);
2691
2692       if (!proto_tree_print(&print_args, edt, print_stream))
2693         return FALSE;
2694       if (!print_hex) {
2695         /* "print_hex_data()" will put out a leading blank line, as well
2696          as a trailing one; print one here, to separate the packets,
2697          only if "print_hex_data()" won't be called. */
2698         if (!print_line(print_stream, 0, ""))
2699           return FALSE;
2700       }
2701       break;
2702
2703     case WRITE_XML:
2704       proto_tree_write_pdml(edt, stdout);
2705       printf("\n");
2706       return !ferror(stdout);
2707     }
2708   } else {
2709     /* Just fill in the columns. */
2710     epan_dissect_fill_in_columns(edt);
2711
2712     /* Now print them. */
2713     switch (output_action) {
2714
2715     case WRITE_TEXT:
2716         if (!print_columns(cf))
2717           return FALSE;
2718         break;
2719
2720     case WRITE_XML:
2721         proto_tree_write_psml(edt, stdout);
2722         return !ferror(stdout);
2723     }
2724   }
2725   if (print_hex) {
2726     if (!print_hex_data(print_stream, edt))
2727       return FALSE;
2728     if (!print_line(print_stream, 0, ""))
2729       return FALSE;
2730   }
2731   return TRUE;
2732 }
2733
2734 static gboolean
2735 write_finale(void)
2736 {
2737   switch (output_action) {
2738
2739   case WRITE_TEXT:
2740     return print_finale(print_stream);
2741     break;
2742
2743   case WRITE_XML:
2744     if (verbose)
2745       write_pdml_finale(stdout);
2746     else
2747       write_psml_finale(stdout);
2748     return !ferror(stdout);
2749
2750   default:
2751     g_assert_not_reached();
2752     return FALSE;
2753   }
2754 }
2755
2756 static void
2757 show_print_file_io_error(int err)
2758 {
2759   switch (err) {
2760
2761   case ENOSPC:
2762     cmdarg_err("Not all the packets could be printed because there is "
2763 "no space left on the file system.");
2764     break;
2765
2766 #ifdef EDQUOT
2767   case EDQUOT:
2768     cmdarg_err("Not all the packets could be printed because you are "
2769 "too close to, or over your disk quota.");
2770   break;
2771 #endif
2772
2773   default:
2774     cmdarg_err("An error occurred while printing packets: %s.",
2775       strerror(err));
2776     break;
2777   }
2778 }
2779
2780 static const char *
2781 cf_open_error_message(int err, gchar *err_info, gboolean for_writing,
2782                       int file_type)
2783 {
2784   const char *errmsg;
2785   static char errmsg_errno[1024+1];
2786
2787   if (err < 0) {
2788     /* Wiretap error. */
2789     switch (err) {
2790
2791     case WTAP_ERR_NOT_REGULAR_FILE:
2792       errmsg = "The file \"%s\" is a \"special file\" or socket or other non-regular file.";
2793       break;
2794
2795     case WTAP_ERR_FILE_UNKNOWN_FORMAT:
2796       /* Seen only when opening a capture file for reading. */
2797       errmsg = "The file \"%s\" isn't a capture file in a format TShark understands.";
2798       break;
2799
2800     case WTAP_ERR_UNSUPPORTED:
2801       /* Seen only when opening a capture file for reading. */
2802       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
2803                "The file \"%%s\" isn't a capture file in a format TShark understands.\n"
2804                "(%s)", err_info);
2805       g_free(err_info);
2806       errmsg = errmsg_errno;
2807       break;
2808
2809     case WTAP_ERR_CANT_WRITE_TO_PIPE:
2810       /* Seen only when opening a capture file for writing. */
2811       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
2812                  "The file \"%%s\" is a pipe, and %s capture files can't be "
2813                  "written to a pipe.", wtap_file_type_string(file_type));
2814       errmsg = errmsg_errno;
2815       break;
2816
2817     case WTAP_ERR_UNSUPPORTED_FILE_TYPE:
2818       /* Seen only when opening a capture file for writing. */
2819       errmsg = "TShark doesn't support writing capture files in that format.";
2820       break;
2821
2822     case WTAP_ERR_UNSUPPORTED_ENCAP:
2823       if (for_writing)
2824         errmsg = "TShark can't save this capture in that format.";
2825       else {
2826         g_snprintf(errmsg_errno, sizeof(errmsg_errno),
2827                  "The file \"%%s\" is a capture for a network type that TShark doesn't support.\n"
2828                  "(%s)", err_info);
2829         g_free(err_info);
2830         errmsg = errmsg_errno;
2831       }
2832       break;
2833
2834     case WTAP_ERR_ENCAP_PER_PACKET_UNSUPPORTED:
2835       if (for_writing)
2836         errmsg = "TShark can't save this capture in that format.";
2837       else
2838         errmsg = "The file \"%s\" is a capture for a network type that TShark doesn't support.";
2839       break;
2840
2841     case WTAP_ERR_BAD_RECORD:
2842       /* Seen only when opening a capture file for reading. */
2843       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
2844                "The file \"%%s\" appears to be damaged or corrupt.\n"
2845                "(%s)", err_info);
2846       g_free(err_info);
2847       errmsg = errmsg_errno;
2848       break;
2849
2850     case WTAP_ERR_CANT_OPEN:
2851       if (for_writing)
2852         errmsg = "The file \"%s\" could not be created for some unknown reason.";
2853       else
2854         errmsg = "The file \"%s\" could not be opened for some unknown reason.";
2855       break;
2856
2857     case WTAP_ERR_SHORT_READ:
2858       errmsg = "The file \"%s\" appears to have been cut short"
2859                " in the middle of a packet or other data.";
2860       break;
2861
2862     case WTAP_ERR_SHORT_WRITE:
2863       errmsg = "A full header couldn't be written to the file \"%s\".";
2864       break;
2865
2866     default:
2867       g_snprintf(errmsg_errno, sizeof(errmsg_errno),
2868                  "The file \"%%s\" could not be %s: %s.",
2869                  for_writing ? "created" : "opened",
2870                  wtap_strerror(err));
2871       errmsg = errmsg_errno;
2872       break;
2873     }
2874   } else
2875     errmsg = file_open_error_message(err, for_writing);
2876   return errmsg;
2877 }
2878
2879 /*
2880  * Open/create errors are reported with an console message in TShark.
2881  */
2882 static void
2883 open_failure_message(const char *filename, int err, gboolean for_writing)
2884 {
2885   fprintf(stderr, "tshark: ");
2886   fprintf(stderr, file_open_error_message(err, for_writing), filename);
2887   fprintf(stderr, "\n");
2888 }
2889
2890 cf_status_t
2891 cf_open(capture_file *cf, const char *fname, gboolean is_tempfile, int *err)
2892 {
2893   wtap       *wth;
2894   gchar       *err_info;
2895   char        err_msg[2048+1];
2896
2897   wth = wtap_open_offline(fname, err, &err_info, FALSE);
2898   if (wth == NULL)
2899     goto fail;
2900
2901   /* The open succeeded.  Fill in the information for this file. */
2902
2903   /* Initialize all data structures used for dissection. */
2904   init_dissection();
2905
2906   cf->wth = wth;
2907   cf->f_datalen = 0; /* not used, but set it anyway */
2908
2909   /* Set the file name because we need it to set the follow stream filter.
2910      XXX - is that still true?  We need it for other reasons, though,
2911      in any case. */
2912   cf->filename = g_strdup(fname);
2913
2914   /* Indicate whether it's a permanent or temporary file. */
2915   cf->is_tempfile = is_tempfile;
2916
2917   /* If it's a temporary capture buffer file, mark it as not saved. */
2918   cf->user_saved = !is_tempfile;
2919
2920   cf->cd_t      = wtap_file_type(cf->wth);
2921   cf->count     = 0;
2922   cf->drops_known = FALSE;
2923   cf->drops     = 0;
2924   cf->snap      = wtap_snapshot_length(cf->wth);
2925   if (cf->snap == 0) {
2926     /* Snapshot length not known. */
2927     cf->has_snap = FALSE;
2928     cf->snap = WTAP_MAX_PACKET_SIZE;
2929   } else
2930     cf->has_snap = TRUE;
2931   nstime_set_zero(&cf->elapsed_time);
2932   nstime_set_zero(&first_ts);
2933   nstime_set_zero(&prev_ts);
2934
2935   return CF_OK;
2936
2937 fail:
2938   g_snprintf(err_msg, sizeof err_msg,
2939              cf_open_error_message(*err, err_info, FALSE, cf->cd_t), fname);
2940   cmdarg_err("%s", err_msg);
2941   return CF_ERROR;
2942 }
2943
2944
2945 /*
2946  * General errors are reported with an console message in TShark.
2947  */
2948 static void
2949 failure_message(const char *msg_format, va_list ap)
2950 {
2951   fprintf(stderr, "tshark: ");
2952   vfprintf(stderr, msg_format, ap);
2953   fprintf(stderr, "\n");
2954 }
2955
2956 /*
2957  * Read errors are reported with an console message in TShark.
2958  */
2959 static void
2960 read_failure_message(const char *filename, int err)
2961 {
2962   cmdarg_err("An error occurred while reading from the file \"%s\": %s.",
2963           filename, strerror(err));
2964 }
2965
2966 /*
2967  * Report an error in command-line arguments.
2968  */
2969 void
2970 cmdarg_err(const char *fmt, ...)
2971 {
2972   va_list ap;
2973
2974   va_start(ap, fmt);
2975   fprintf(stderr, "tshark: ");
2976   vfprintf(stderr, fmt, ap);
2977   fprintf(stderr, "\n");
2978   va_end(ap);
2979 }
2980
2981 /*
2982  * Report additional information for an error in command-line arguments.
2983  */
2984 void
2985 cmdarg_err_cont(const char *fmt, ...)
2986 {
2987   va_list ap;
2988
2989   va_start(ap, fmt);
2990   vfprintf(stderr, fmt, ap);
2991   fprintf(stderr, "\n");
2992   va_end(ap);
2993 }
2994
2995
2996 /****************************************************************************************************************/
2997 /* indication report "dummies", needed for capture_loop.c */
2998
2999 #ifdef HAVE_LIBPCAP
3000
3001 /** Report a new capture file having been opened. */
3002 void
3003 report_new_capture_file(const char *filename)
3004 {
3005     /* shouldn't happen */
3006     g_assert_not_reached();
3007 }
3008
3009 /** Report a number of new packets captured. */
3010 void
3011 report_packet_count(int packet_count)
3012 {
3013     /* shouldn't happen */
3014     g_assert_not_reached();
3015 }
3016
3017 /** Report the packet drops once the capture finishes. */
3018 void
3019 report_packet_drops(int drops)
3020 {
3021     /* shouldn't happen */
3022     g_assert_not_reached();
3023 }
3024
3025 /** Report an error in the capture. */
3026 void
3027 report_capture_error(const char *errmsg, const char *secondary_error_msg)
3028 {
3029     cmdarg_err(errmsg);
3030     cmdarg_err_cont(secondary_error_msg);
3031 }
3032
3033 /** Report an error with a capture filter. */
3034 void
3035 report_cfilter_error(const char *cfilter, const char *errmsg)
3036 {
3037
3038     cmdarg_err(
3039       "Invalid capture filter: \"%s\"!\n"
3040       "\n"
3041       "That string isn't a valid capture filter (%s).\n"
3042       "See the User's Guide for a description of the capture filter syntax.",
3043       cfilter, errmsg);
3044 }
3045
3046 #endif /* HAVE_LIBPCAP */
3047
3048
3049 /****************************************************************************************************************/
3050 /* signal pipe "dummies", needed for capture_loop.c */
3051
3052 #ifdef HAVE_LIBPCAP
3053
3054 #ifdef _WIN32
3055 gboolean
3056 signal_pipe_check_running(void)
3057 {
3058     /* currently, no check required */
3059     return TRUE;
3060 }
3061 #endif  /* _WIN32 */
3062
3063 #endif /* HAVE_LIBPCAP */