1 /* Combine two dump files, either by appending or by merging by timestamp
5 * Written by Scott Renfro <scott@renfro.org> based on
6 * editcap by Richard Sharpe and Guy Harris
23 #ifdef HAVE_SYS_TIME_H
34 #include "svnversion.h"
45 /* Win32 needs the O_BINARY flag for open() */
59 printf("Usage: mergecap [-hva] [-s <snaplen>] [-T <encap type>]\n");
60 printf(" [-F <capture type>] -w <outfile> <infile> [...]\n\n");
61 printf(" where\t-h produces this help listing.\n");
62 printf(" \t-v verbose operation, default is silent\n");
63 printf(" \t-a files should be concatenated, not merged\n");
64 printf(" \t Default merges based on frame timestamps\n");
65 printf(" \t-s <snaplen>: truncate packets to <snaplen> bytes of data\n");
66 printf(" \t-w <outfile>: sets output filename to <outfile>\n");
67 printf(" \t-T <encap type> encapsulation type to use:\n");
68 for (i = 0; i < WTAP_NUM_ENCAP_TYPES; i++) {
69 string = wtap_encap_short_string(i);
71 printf(" \t %s - %s\n",
72 string, wtap_encap_string(i));
74 printf(" \t default is the same as the first input file\n");
75 printf(" \t-F <capture type> capture file type to write:\n");
76 for (i = 0; i < WTAP_NUM_FILE_TYPES; i++) {
77 if (wtap_dump_can_open(i))
78 printf(" \t %s - %s\n",
79 wtap_file_type_short_string(i), wtap_file_type_string(i));
81 printf(" \t default is libpcap\n");
87 main(int argc, char *argv[])
93 gboolean do_append = FALSE;
94 int in_file_count = 0;
95 merge_in_file_t *in_files = NULL;
96 merge_out_file_t out_file;
98 char *out_filename = NULL;
100 /* initialize out_file */
102 out_file.pdh = NULL; /* wiretap dumpfile */
103 out_file.file_type = WTAP_FILE_PCAP; /* default to "libpcap" */
104 out_file.frame_type = -2; /* leave type alone */
105 out_file.snaplen = 0; /* no limit */
106 out_file.count = 1; /* frames output */
108 merge_verbose = VERBOSE_ERRORS;
110 /* Process the options first */
111 while ((opt = getopt(argc, argv, "hvas:T:F:w:")) != -1) {
115 out_filename = optarg;
119 do_append = !do_append;
123 out_file.frame_type = wtap_short_string_to_encap(optarg);
124 if (out_file.frame_type < 0) {
125 fprintf(stderr, "mergecap: \"%s\" is not a valid encapsulation type\n",
132 out_file.file_type = wtap_short_string_to_file_type(optarg);
133 if (out_file.file_type < 0) {
134 fprintf(stderr, "mergecap: \"%s\" is not a valid capture file type\n",
141 merge_verbose = VERBOSE_ALL;
145 out_file.snaplen = strtol(optarg, &p, 10);
146 if (p == optarg || *p != '\0') {
147 fprintf(stderr, "mergecap: \"%s\" is not a valid snapshot length\n",
154 printf("mergecap version %s"
163 case '?': /* Bad options if GNU getopt */
172 /* check for proper args; at a minimum, must have an output
173 * filename and one input file
175 in_file_count = argc - optind;
177 fprintf(stderr, "mergecap: an output filename must be set with -w\n");
178 fprintf(stderr, " run with -h for help\n");
182 /* open the input files */
183 in_file_count = merge_open_in_files(in_file_count, &argv[optind], &in_files, &err);
184 if (in_file_count < 1) {
185 fprintf(stderr, "mergecap: No valid input files\n");
189 /* set the outfile frame type */
190 if (out_file.frame_type == -2)
191 out_file.frame_type = merge_select_frame_type(in_file_count, in_files);
193 /* open the outfile */
194 if (strncmp(out_filename, "-", 2) == 0) {
195 /* use stdout as the outfile */
196 out_file.fd = 1 /*stdout*/;
198 /* open the outfile */
199 out_file.fd = open(out_filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644);
201 if (out_file.fd == -1) {
202 fprintf(stderr, "mergecap: Couldn't open output file %s: %s\n",
203 out_filename, strerror(errno));
207 /* prepare the outfile */
208 if (!merge_open_outfile(&out_file, merge_max_snapshot_length(in_file_count, in_files), &err)) {
209 merge_close_in_files(in_file_count, in_files);
213 /* do the merge (or append) */
215 merge_append_files(in_file_count, in_files, &out_file, &err);
217 merge_files(in_file_count, in_files, &out_file, &err);
219 merge_close_in_files(in_file_count, in_files);
220 merge_close_outfile(&out_file);