From Scott Renfro: correctly handle merging multiple files with
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Sat, 14 Jul 2001 19:28:11 +0000 (19:28 +0000)
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Sat, 14 Jul 2001 19:28:11 +0000 (19:28 +0000)
different encapsulation types (as best we can).

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@3720 f5534014-38df-0310-8fa8-9805f1628bb7

doc/mergecap.pod
mergecap.c

index f0d7fda248e70a4f0b0c777a7026472b7499e4f6..2cb39523cac790b7f59b567b2b295c652632df56 100644 (file)
@@ -6,12 +6,10 @@ mergecap - Merges two capture files into one
 =head1 SYNOPSYS
 
 B<mergecap>
+S<[ B<-hva> ]>
+S<[ B<-s> I<snaplen> ]>
 S<[ B<-F> I<file format> ]>
 S<[ B<-T> I<encapsulation type> ]>
-S<[ B<-a> ]>
-S<[ B<-v> ]>
-S<[ B<-s> I<snaplen> ]>
-S<[ B<-h> ]>
 S<B<-w> I<outfile>>
 I<infile>
 I<...>
@@ -60,10 +58,17 @@ appear to reject Ethernet frames larger than the standard Ethernet MTU,
 making them incapable of handling gigabit Ethernet captures if jumbo
 frames were used).
 
-If the B<-T> flag is used to specify an encapsulation type, the
+The output file frame encapsulation type is set to the type of the input
+files, if all input files have the same type.  If not all of the input
+files have the same frame encapsulation type, the output file type is
+set to WTAP_ENCAP_PER_PACKET.  Note that some capture file formats, most
+notably B<libpcap>, do not currently support WTAP_ENCAP_PER_PACKET.
+This combination will cause the output file creation to fail.
+
+If the B<-T> flag is used to specify a frame encapsulation type, the
 encapsulation type of the output capture file will be forced to the
 specified type, rather than being the type appropriate to the
-encapsulation type of the input capture file.  Note that this merely
+encapsulation type of the input capture files.  Note that this merely
 forces the encapsulation type of the output file to be the specified
 type; the packet headers of the packets will not be translated from the
 encapsulation type of the input capture file to the specified
index e19d0638f97ea67504c821eb8072b43fe3ad38e6..654c73a4826051b1dd386364f327c13912fa4ad6 100644 (file)
@@ -1,6 +1,6 @@
 /* Combine two dump files, either by appending or by merging by timestamp
  *
- * $Id: mergecap.c,v 1.2 2001/07/13 08:16:15 guy Exp $
+ * $Id: mergecap.c,v 1.3 2001/07/14 19:28:10 guy Exp $
  *
  * Written by Scott Renfro <scott@renfro.org> based on
  * editcap by Richard Sharpe and Guy Harris
@@ -183,6 +183,52 @@ merge(int count, in_file_t in_files[], out_file_t *out_file)
 }
 
 
+/*
+ * Select an output frame type based on the input files
+ * From Guy: If all files have the same frame type, then use that.
+ *           Otherwise select WTAP_ENCAP_PER_PACKET.  If the selected
+ *           output file type doesn't support per packet frame types,
+ *           then the wtap_dump_open call will fail with a reasonable
+ *           error condition.
+ */
+static int
+select_frame_type(int count, in_file_t files[])
+{
+  int i;
+  int selected_frame_type;
+  
+  selected_frame_type = wtap_file_encap(files[0].wth);
+  
+  for (i = 1; i < count; i++) {
+    int this_frame_type = wtap_file_encap(files[i].wth);
+    if (selected_frame_type != this_frame_type) {
+      selected_frame_type = WTAP_ENCAP_PER_PACKET;
+      if (verbose) {
+        fprintf(stderr, "mergecap: multiple frame encapsulation types detected\n");
+        fprintf(stderr, "          defaulting to WTAP_ENCAP_PER_PACKET\n");
+        fprintf(stderr, "          %s had type %s (%s)\n",
+                files[0].filename,
+                wtap_encap_string(selected_frame_type),
+                wtap_encap_short_string(selected_frame_type));
+        fprintf(stderr, "          %s had type %s (%s)\n",
+                files[i].filename,
+                wtap_encap_string(this_frame_type),
+                wtap_encap_short_string(this_frame_type));
+      }
+      break;
+    }
+  }
+  
+  if (verbose) {
+      fprintf(stderr, "mergecap: selected frame_type %s (%s)\n",
+              wtap_encap_string(selected_frame_type),
+              wtap_encap_short_string(selected_frame_type));
+  }
+
+  return selected_frame_type;
+}
+    
+
 /*
  * Close the output file
  */
@@ -215,8 +261,8 @@ open_outfile(out_file_t *out_file, int snapshot_len)
   out_file->pdh = wtap_dump_open(out_file->filename, out_file->file_type,
                                  out_file->frame_type, snapshot_len, &err);
   if (!out_file->pdh) {
-    fprintf(stderr, "mergecap: Can't open/create %s: %s\n",
-            out_file->filename, wtap_strerror(err));
+    fprintf(stderr, "mergecap: Can't open/create %s:\n", out_file->filename);
+    fprintf(stderr, "          %s\n", wtap_strerror(err));
     return FALSE;
   }
   return TRUE;
@@ -285,7 +331,7 @@ open_in_files(int argc, char *argv[], in_file_t *in_files[])
               wtap_strerror(err));
     } else {
       if (verbose) {
-        fprintf(stderr, "File %s is a %s capture file.\n", argv[i],
+        fprintf(stderr, "mergecap: %s is type %s.\n", argv[i],
                 wtap_file_type_string(wtap_file_type(files[count].wth)));
       }
       count++;
@@ -308,7 +354,7 @@ usage()
   int i;
   const char *string;
 
-  fprintf(stderr, "Usage: mergecap [-h] [-v] [-a] [-s <snaplen>] [-T <encap type>]\n");
+  fprintf(stderr, "Usage: mergecap [-hva] [-s <snaplen>] [-T <encap type>]\n");
   fprintf(stderr, "          [-F <capture type>] -w <outfile> <infile> [...]\n\n");
   fprintf(stderr, "  where\t-h produces this help listing.\n");
   fprintf(stderr, "       \t-v verbose operation, default is silent\n");
@@ -356,7 +402,7 @@ main(int argc, char *argv[])
   out_file.count      = 1;                 /* frames output */
 
   /* Process the options first */
-  while ((opt = getopt(argc, argv, "w:aT:F:vs:h")) != EOF) {
+  while ((opt = getopt(argc, argv, "hvas:T:F:w:")) != EOF) {
 
     switch (opt) {
     case 'w':
@@ -432,7 +478,7 @@ main(int argc, char *argv[])
 
   /* set the outfile frame type */
   if (out_file.frame_type == -2)
-    out_file.frame_type = wtap_file_encap(in_files[0].wth);
+    out_file.frame_type = select_frame_type(in_file_count, in_files);
   
   /* open the outfile */
   if (!open_outfile(&out_file, max_snapshot_length(in_file_count, in_files))) {