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