1 /* Combine two dump files, either by appending or by merging by timestamp
3 * $Id: mergecap.c,v 1.24 2004/06/30 07:04:42 guy Exp $
5 * Written by Scott Renfro <scott@renfro.org> based on
6 * editcap by Richard Sharpe and Guy Harris
22 #ifdef HAVE_SYS_TIME_H
33 #include "cvsversion.h"
44 /* Win32 needs the O_BINARY flag for open() */
58 printf("Usage: mergecap [-hva] [-s <snaplen>] [-T <encap type>]\n");
59 printf(" [-F <capture type>] -w <outfile> <infile> [...]\n\n");
60 printf(" where\t-h produces this help listing.\n");
61 printf(" \t-v verbose operation, default is silent\n");
62 printf(" \t-a files should be concatenated, not merged\n");
63 printf(" \t Default merges based on frame timestamps\n");
64 printf(" \t-s <snaplen>: truncate packets to <snaplen> bytes of data\n");
65 printf(" \t-w <outfile>: sets output filename to <outfile>\n");
66 printf(" \t-T <encap type> encapsulation type to use:\n");
67 for (i = 0; i < WTAP_NUM_ENCAP_TYPES; i++) {
68 string = wtap_encap_short_string(i);
70 printf(" \t %s - %s\n",
71 string, wtap_encap_string(i));
73 printf(" \t default is the same as the first input file\n");
74 printf(" \t-F <capture type> capture file type to write:\n");
75 for (i = 0; i < WTAP_NUM_FILE_TYPES; i++) {
76 if (wtap_dump_can_open(i))
77 printf(" \t %s - %s\n",
78 wtap_file_type_short_string(i), wtap_file_type_string(i));
80 printf(" \t default is libpcap\n");
86 main(int argc, char *argv[])
92 gboolean do_append = FALSE;
93 int in_file_count = 0;
94 merge_in_file_t *in_files = NULL;
95 merge_out_file_t out_file;
97 char *out_filename = NULL;
99 /* initialize out_file */
101 out_file.pdh = NULL; /* wiretap dumpfile */
102 out_file.file_type = WTAP_FILE_PCAP; /* default to "libpcap" */
103 out_file.frame_type = -2; /* leave type alone */
104 out_file.snaplen = 0; /* no limit */
105 out_file.count = 1; /* frames output */
107 merge_verbose = VERBOSE_ERRORS;
109 /* Process the options first */
110 while ((opt = getopt(argc, argv, "hvas:T:F:w:")) != -1) {
114 out_filename = optarg;
118 do_append = !do_append;
122 out_file.frame_type = wtap_short_string_to_encap(optarg);
123 if (out_file.frame_type < 0) {
124 fprintf(stderr, "mergecap: \"%s\" is not a valid encapsulation type\n",
131 out_file.file_type = wtap_short_string_to_file_type(optarg);
132 if (out_file.file_type < 0) {
133 fprintf(stderr, "mergecap: \"%s\" is not a valid capture file type\n",
140 merge_verbose = VERBOSE_ALL;
144 out_file.snaplen = strtol(optarg, &p, 10);
145 if (p == optarg || *p != '\0') {
146 fprintf(stderr, "mergecap: \"%s\" is not a valid snapshot length\n",
153 printf("mergecap version %s"
162 case '?': /* Bad options if GNU getopt */
171 /* check for proper args; at a minimum, must have an output
172 * filename and one input file
174 in_file_count = argc - optind;
176 fprintf(stderr, "mergecap: an output filename must be set with -w\n");
177 fprintf(stderr, " run with -h for help\n");
181 /* open the input files */
182 in_file_count = merge_open_in_files(in_file_count, &argv[optind], &in_files, &err);
183 if (in_file_count < 1) {
184 fprintf(stderr, "mergecap: No valid input files\n");
188 /* set the outfile frame type */
189 if (out_file.frame_type == -2)
190 out_file.frame_type = merge_select_frame_type(in_file_count, in_files);
192 /* open the outfile */
193 if (strncmp(out_filename, "-", 2) == 0) {
194 /* use stdout as the outfile */
195 out_file.fd = 1 /*stdout*/;
197 /* open the outfile */
198 out_file.fd = open(out_filename, O_BINARY | O_WRONLY);
200 if(out_file.fd == -1) {
201 fprintf(stderr, "mergecap: couldn't open output file\n");
205 /* prepare the outfile */
206 if (!merge_open_outfile(&out_file, merge_max_snapshot_length(in_file_count, in_files), &err)) {
207 merge_close_in_files(in_file_count, in_files);
211 /* do the merge (or append) */
213 merge_append_files(in_file_count, in_files, &out_file, &err);
215 merge_files(in_file_count, in_files, &out_file, &err);
217 merge_close_in_files(in_file_count, in_files);
218 merge_close_outfile(&out_file);