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