2013-09-06 21:57:04 +00:00
/* Combine dump files, either by appending or by merging by timestamp
2001-07-12 19:59:41 +00:00
*
2011-11-30 15:55:53 +00:00
* Wireshark - Network traffic analyzer
* By Gerald Combs < gerald @ wireshark . org >
* Copyright 1998 Gerald Combs
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License along
* with this program ; if not , write to the Free Software Foundation , Inc . ,
* 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA .
*
* Mergecap written by Scott Renfro < scott @ renfro . org > based on
2001-07-12 19:59:41 +00:00
* editcap by Richard Sharpe and Guy Harris
*
*/
2014-08-22 21:13:05 +00:00
# include <config.h>
2001-07-12 19:59:41 +00:00
# include <stdio.h>
# include <stdlib.h>
2004-07-13 05:58:15 +00:00
# include <errno.h>
2001-07-12 19:59:41 +00:00
# include <glib.h>
# ifdef HAVE_UNISTD_H
# include <unistd.h>
# endif
2014-07-03 04:50:54 +00:00
# ifdef HAVE_GETOPT_H
# include <getopt.h>
# endif
2001-07-12 19:59:41 +00:00
# ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
# endif
2014-07-03 08:45:32 +00:00
# ifdef HAVE_LIBZ
2014-08-05 20:10:44 +00:00
# include <zlib.h> /* to get the libz version number */
2014-07-03 08:45:32 +00:00
# endif
2001-07-12 19:59:41 +00:00
# include <string.h>
# include "wtap.h"
2011-08-09 21:02:10 +00:00
# ifndef HAVE_GETOPT
2013-07-16 02:35:33 +00:00
# include <wsutil/wsgetopt.h>
2001-07-12 19:59:41 +00:00
# endif
2014-07-03 08:54:13 +00:00
# include <wsutil/clopts_common.h>
2013-07-16 02:35:33 +00:00
# include <wsutil/strnatcmp.h>
# include <wsutil/file_util.h>
2014-07-03 08:54:13 +00:00
# include <wsutil/cmdarg_err.h>
2014-07-03 08:45:32 +00:00
# include <wsutil/crash_info.h>
# include <wsutil/os_version_info.h>
# include <wsutil/ws_version_info.h>
2013-07-16 01:16:50 +00:00
2013-07-16 02:35:33 +00:00
# include <wiretap/merge.h>
2013-07-10 16:18:37 +00:00
2014-07-03 08:45:32 +00:00
# include "version_info.h"
2004-06-29 20:59:24 +00:00
# ifdef HAVE_FCNTL_H
# include <fcntl.h>
# endif
2011-01-06 23:28:58 +00:00
# ifdef _WIN32
2011-05-24 00:07:56 +00:00
# include <wsutil/unicode-utils.h>
2011-01-06 23:28:58 +00:00
# endif /* _WIN32 */
2001-07-13 08:16:16 +00:00
/*
* Show the usage
2002-08-28 21:04:11 +00:00
*/
2001-07-13 08:16:16 +00:00
static void
2014-07-03 08:45:32 +00:00
print_usage ( FILE * output )
2001-07-12 19:59:41 +00:00
{
2014-01-03 14:44:16 +00:00
fprintf ( output , " \n " ) ;
fprintf ( output , " Usage: mergecap [options] -w <outfile>|- <infile> [<infile> ...] \n " ) ;
fprintf ( output , " \n " ) ;
fprintf ( output , " Output: \n " ) ;
fprintf ( output , " -a concatenate rather than merge files. \n " ) ;
fprintf ( output , " default is to merge based on frame timestamps. \n " ) ;
fprintf ( output , " -s <snaplen> truncate packets to <snaplen> bytes of data. \n " ) ;
fprintf ( output , " -w <outfile>|- set the output filename to <outfile> or '-' for stdout. \n " ) ;
fprintf ( output , " -F <capture type> set the output file type; default is pcapng. \n " ) ;
fprintf ( output , " an empty \" -F \" option will list the file types. \n " ) ;
fprintf ( output , " -T <encap type> set the output file encapsulation type; \n " ) ;
fprintf ( output , " default is the same as the first input file. \n " ) ;
fprintf ( output , " an empty \" -T \" option will list the encapsulation types. \n " ) ;
fprintf ( output , " \n " ) ;
fprintf ( output , " Miscellaneous: \n " ) ;
fprintf ( output , " -h display this help and exit. \n " ) ;
fprintf ( output , " -v verbose output. \n " ) ;
2006-01-10 23:06:05 +00:00
}
2014-07-03 08:54:13 +00:00
/*
* Report an error in command - line arguments .
*/
static void
mergecap_cmdarg_err ( const char * fmt , va_list ap )
{
fprintf ( stderr , " mergecap: " ) ;
vfprintf ( stderr , fmt , ap ) ;
fprintf ( stderr , " \n " ) ;
}
/*
* Report additional information for an error in command - line arguments .
*/
static void
mergecap_cmdarg_err_cont ( const char * fmt , va_list ap )
{
vfprintf ( stderr , fmt , ap ) ;
fprintf ( stderr , " \n " ) ;
}
2011-12-22 21:52:16 +00:00
struct string_elem {
2013-09-06 21:57:04 +00:00
const char * sstr ; /* The short string */
const char * lstr ; /* The long string */
2011-12-22 21:52:16 +00:00
} ;
static gint
string_compare ( gconstpointer a , gconstpointer b )
{
2013-09-06 21:57:04 +00:00
return strcmp ( ( ( const struct string_elem * ) a ) - > sstr ,
( ( const struct string_elem * ) b ) - > sstr ) ;
2011-12-22 21:52:16 +00:00
}
2006-01-10 23:06:05 +00:00
2013-07-10 16:18:37 +00:00
static gint
string_nat_compare ( gconstpointer a , gconstpointer b )
{
2014-10-29 17:53:49 +00:00
return ws_ascii_strnatcmp ( ( ( const struct string_elem * ) a ) - > sstr ,
( ( const struct string_elem * ) b ) - > sstr ) ;
2013-07-10 16:18:37 +00:00
}
2011-12-22 21:52:16 +00:00
static void
string_elem_print ( gpointer data , gpointer not_used _U_ )
{
2013-09-06 21:57:04 +00:00
fprintf ( stderr , " %s - %s \n " , ( ( struct string_elem * ) data ) - > sstr ,
( ( struct string_elem * ) data ) - > lstr ) ;
2011-12-22 21:52:16 +00:00
}
static void
list_capture_types ( void ) {
int i ;
struct string_elem * captypes ;
GSList * list = NULL ;
2013-11-08 09:53:01 +00:00
captypes = g_new ( struct string_elem , WTAP_NUM_FILE_TYPES_SUBTYPES ) ;
2011-12-22 21:52:16 +00:00
fprintf ( stderr , " mergecap: The available capture file types for the \" -F \" flag are: \n " ) ;
2013-11-08 09:53:01 +00:00
for ( i = 0 ; i < WTAP_NUM_FILE_TYPES_SUBTYPES ; i + + ) {
2011-12-22 21:52:16 +00:00
if ( wtap_dump_can_open ( i ) ) {
2013-11-08 09:53:01 +00:00
captypes [ i ] . sstr = wtap_file_type_subtype_short_string ( i ) ;
captypes [ i ] . lstr = wtap_file_type_subtype_string ( i ) ;
2011-12-22 21:52:16 +00:00
list = g_slist_insert_sorted ( list , & captypes [ i ] , string_compare ) ;
2006-01-10 23:06:05 +00:00
}
2011-12-22 21:52:16 +00:00
}
g_slist_foreach ( list , string_elem_print , NULL ) ;
g_slist_free ( list ) ;
g_free ( captypes ) ;
2006-01-10 23:06:05 +00:00
}
2011-12-22 21:52:16 +00:00
static void
list_encap_types ( void ) {
2013-09-06 21:57:04 +00:00
int i ;
struct string_elem * encaps ;
GSList * list = NULL ;
encaps = g_new ( struct string_elem , WTAP_NUM_ENCAP_TYPES ) ;
fprintf ( stderr , " mergecap: The available encapsulation types for the \" -T \" flag are: \n " ) ;
for ( i = 0 ; i < WTAP_NUM_ENCAP_TYPES ; i + + ) {
encaps [ i ] . sstr = wtap_encap_short_string ( i ) ;
if ( encaps [ i ] . sstr ! = NULL ) {
encaps [ i ] . lstr = wtap_encap_string ( i ) ;
list = g_slist_insert_sorted ( list , & encaps [ i ] , string_nat_compare ) ;
2006-01-10 23:06:05 +00:00
}
2013-09-06 21:57:04 +00:00
}
g_slist_foreach ( list , string_elem_print , NULL ) ;
g_slist_free ( list ) ;
g_free ( encaps ) ;
2001-07-12 19:59:41 +00:00
}
2014-07-03 08:45:32 +00:00
static void
get_mergecap_compiled_info ( GString * str )
{
/* LIBZ */
g_string_append ( str , " , " ) ;
# ifdef HAVE_LIBZ
g_string_append ( str , " with libz " ) ;
# ifdef ZLIB_VERSION
g_string_append ( str , ZLIB_VERSION ) ;
# else /* ZLIB_VERSION */
g_string_append ( str , " (version unknown) " ) ;
# endif /* ZLIB_VERSION */
# else /* HAVE_LIBZ */
g_string_append ( str , " without libz " ) ;
# endif /* HAVE_LIBZ */
}
static void
get_mergecap_runtime_info ( GString * str )
{
/* zlib */
# if defined(HAVE_LIBZ) && !defined(_WIN32)
g_string_append_printf ( str , " , with libz %s " , zlibVersion ( ) ) ;
# endif
}
2001-07-12 19:59:41 +00:00
int
main ( int argc , char * argv [ ] )
{
2014-07-03 08:45:32 +00:00
GString * comp_info_str ;
GString * runtime_info_str ;
2014-01-03 14:44:16 +00:00
int opt ;
2014-07-03 04:50:54 +00:00
static const struct option long_options [ ] = {
{ ( char * ) " help " , no_argument , NULL , ' h ' } ,
{ ( char * ) " version " , no_argument , NULL , ' V ' } ,
{ 0 , 0 , 0 , 0 }
} ;
2014-01-03 14:44:16 +00:00
gboolean do_append = FALSE ;
gboolean verbose = FALSE ;
int in_file_count = 0 ;
guint snaplen = 0 ;
2011-06-20 23:31:26 +00:00
# ifdef PCAP_NG_DEFAULT
2014-01-03 14:44:16 +00:00
int file_type = WTAP_FILE_TYPE_SUBTYPE_PCAPNG ; /* default to pcap format */
2011-06-20 23:31:26 +00:00
# else
2014-01-03 14:44:16 +00:00
int file_type = WTAP_FILE_TYPE_SUBTYPE_PCAP ; /* default to pcapng format */
2011-06-20 23:31:26 +00:00
# endif
2014-01-03 14:44:16 +00:00
int frame_type = - 2 ;
int out_fd ;
merge_in_file_t * in_files = NULL , * in_file ;
int i ;
2004-10-29 00:36:52 +00:00
struct wtap_pkthdr * phdr , snap_phdr ;
2014-05-09 05:18:49 +00:00
wtap_dumper * pdh ;
2014-01-03 14:44:16 +00:00
int open_err , read_err = 0 , write_err , close_err ;
2014-12-21 19:15:47 +00:00
gchar * err_info , * write_err_info = NULL ;
2014-01-03 14:44:16 +00:00
int err_fileno ;
char * out_filename = NULL ;
gboolean got_read_error = FALSE , got_write_error = FALSE ;
int count ;
2004-06-18 10:01:59 +00:00
2014-07-03 08:54:13 +00:00
cmdarg_err_init ( mergecap_cmdarg_err , mergecap_cmdarg_err_cont ) ;
2011-01-06 23:28:58 +00:00
# ifdef _WIN32
2011-05-24 00:07:56 +00:00
arg_list_utf_16to8 ( argc , argv ) ;
2013-02-20 01:19:42 +00:00
create_app_running_mutex ( ) ;
2011-01-06 23:28:58 +00:00
# endif /* _WIN32 */
2014-07-03 08:45:32 +00:00
/* Assemble the compile-time version information string */
comp_info_str = g_string_new ( " Compiled " ) ;
get_compiled_version_info ( comp_info_str , NULL , get_mergecap_compiled_info ) ;
/* Assemble the run-time version information string */
runtime_info_str = g_string_new ( " Running " ) ;
get_runtime_version_info ( runtime_info_str , get_mergecap_runtime_info ) ;
/* Add it to the information to be reported on a crash. */
ws_add_crash_info ( " Mergecap (Wireshark) %s \n "
" \n "
" %s "
" \n "
" %s " ,
get_ws_vcs_version_info ( ) , comp_info_str - > str , runtime_info_str - > str ) ;
2001-07-12 19:59:41 +00:00
/* Process the options first */
2014-07-03 04:50:54 +00:00
while ( ( opt = getopt_long ( argc , argv , " aF:hs:T:vVw: " , long_options , NULL ) ) ! = - 1 ) {
2001-07-12 19:59:41 +00:00
switch ( opt ) {
case ' a ' :
do_append = ! do_append ;
break ;
2002-08-28 21:04:11 +00:00
2001-07-12 19:59:41 +00:00
case ' F ' :
2013-11-08 09:53:01 +00:00
file_type = wtap_short_string_to_file_type_subtype ( optarg ) ;
2004-10-27 23:28:37 +00:00
if ( file_type < 0 ) {
2013-09-06 21:57:04 +00:00
fprintf ( stderr , " mergecap: \" %s \" isn't a valid capture file type \n " ,
optarg ) ;
2006-01-10 23:06:05 +00:00
list_capture_types ( ) ;
2013-09-06 21:57:04 +00:00
exit ( 1 ) ;
2001-07-12 19:59:41 +00:00
}
break ;
2013-09-06 21:57:04 +00:00
case ' h ' :
2014-07-03 08:45:32 +00:00
printf ( " Mergecap (Wireshark) %s \n "
" Merge two or more capture files into one. \n "
" See http://www.wireshark.org for more information. \n " ,
get_ws_vcs_version_info ( ) ) ;
print_usage ( stdout ) ;
2013-09-06 21:57:04 +00:00
exit ( 0 ) ;
2001-07-12 19:59:41 +00:00
break ;
case ' s ' :
2004-10-27 23:28:37 +00:00
snaplen = get_positive_int ( optarg , " snapshot length " ) ;
2001-07-12 19:59:41 +00:00
break ;
2013-09-06 21:57:04 +00:00
case ' T ' :
frame_type = wtap_short_string_to_encap ( optarg ) ;
if ( frame_type < 0 ) {
fprintf ( stderr , " mergecap: \" %s \" isn't a valid encapsulation type \n " ,
optarg ) ;
list_encap_types ( ) ;
exit ( 1 ) ;
}
break ;
case ' v ' :
verbose = TRUE ;
break ;
2014-06-20 18:48:27 +00:00
case ' V ' :
2014-12-23 21:58:38 +00:00
show_version ( " Mergecap (Wireshark) " , comp_info_str , runtime_info_str ) ;
2014-07-03 08:45:32 +00:00
g_string_free ( comp_info_str , TRUE ) ;
g_string_free ( runtime_info_str , TRUE ) ;
2014-06-20 18:48:27 +00:00
exit ( 0 ) ;
break ;
2013-09-06 21:57:04 +00:00
case ' w ' :
out_filename = optarg ;
2001-07-12 19:59:41 +00:00
break ;
case ' ? ' : /* Bad options if GNU getopt */
2006-01-10 23:06:05 +00:00
switch ( optopt ) {
case ' F ' :
list_capture_types ( ) ;
break ;
case ' T ' :
list_encap_types ( ) ;
break ;
default :
2014-07-03 08:45:32 +00:00
print_usage ( stderr ) ;
2006-01-10 23:06:05 +00:00
}
exit ( 1 ) ;
2001-07-12 19:59:41 +00:00
break ;
}
}
2001-07-13 08:16:16 +00:00
/* check for proper args; at a minimum, must have an output
* filename and one input file
*/
in_file_count = argc - optind ;
2004-06-29 20:59:24 +00:00
if ( ! out_filename ) {
2001-07-13 08:16:16 +00:00
fprintf ( stderr , " mergecap: an output filename must be set with -w \n " ) ;
2004-01-18 02:12:59 +00:00
fprintf ( stderr , " run with -h for help \n " ) ;
2004-10-28 01:52:05 +00:00
return 1 ;
2001-07-12 19:59:41 +00:00
}
2004-10-27 19:36:22 +00:00
if ( in_file_count < 1 ) {
fprintf ( stderr , " mergecap: No input files were specified \n " ) ;
2004-10-28 01:52:05 +00:00
return 1 ;
2004-10-27 19:36:22 +00:00
}
2001-07-12 19:59:41 +00:00
2001-07-13 08:16:16 +00:00
/* open the input files */
2004-10-28 01:06:11 +00:00
if ( ! merge_open_in_files ( in_file_count , & argv [ optind ] , & in_files ,
2004-10-29 00:36:52 +00:00
& open_err , & err_info , & err_fileno ) ) {
2004-10-28 01:06:11 +00:00
fprintf ( stderr , " mergecap: Can't open %s: %s \n " , argv [ optind + err_fileno ] ,
2013-09-06 21:57:04 +00:00
wtap_strerror ( open_err ) ) ;
2014-12-18 04:03:47 +00:00
if ( err_info ! = NULL ) {
2004-10-28 01:06:11 +00:00
fprintf ( stderr , " (%s) \n " , err_info ) ;
g_free ( err_info ) ;
}
2004-10-28 01:52:05 +00:00
return 2 ;
2001-07-13 08:16:16 +00:00
}
2004-10-28 01:06:11 +00:00
if ( verbose ) {
for ( i = 0 ; i < in_file_count ; i + + )
fprintf ( stderr , " mergecap: %s is type %s. \n " , argv [ optind + i ] ,
2014-05-09 05:18:49 +00:00
wtap_file_type_subtype_string ( wtap_file_type_subtype ( in_files [ i ] . wth ) ) ) ;
2004-10-28 01:06:11 +00:00
}
2004-10-27 23:28:37 +00:00
if ( snaplen = = 0 ) {
/*
* Snapshot length not specified - default to the maximum of the
* snapshot lengths of the input files .
*/
snaplen = merge_max_snapshot_length ( in_file_count , in_files ) ;
}
2001-07-13 08:16:16 +00:00
/* set the outfile frame type */
2004-10-27 23:28:37 +00:00
if ( frame_type = = - 2 ) {
/*
* Default to the appropriate frame type for the input files .
*/
frame_type = merge_select_frame_type ( in_file_count , in_files ) ;
2004-10-28 01:06:11 +00:00
if ( verbose ) {
if ( frame_type = = WTAP_ENCAP_PER_PACKET ) {
/*
* Find out why we had to choose WTAP_ENCAP_PER_PACKET .
*/
int first_frame_type , this_frame_type ;
2014-05-09 05:18:49 +00:00
first_frame_type = wtap_file_encap ( in_files [ 0 ] . wth ) ;
2004-10-28 01:06:11 +00:00
for ( i = 1 ; i < in_file_count ; i + + ) {
2014-05-09 05:18:49 +00:00
this_frame_type = wtap_file_encap ( in_files [ i ] . wth ) ;
2004-10-28 01:06:11 +00:00
if ( first_frame_type ! = this_frame_type ) {
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 " ,
in_files [ 0 ] . filename ,
wtap_encap_string ( first_frame_type ) ,
wtap_encap_short_string ( first_frame_type ) ) ;
fprintf ( stderr , " %s had type %s (%s) \n " ,
in_files [ i ] . filename ,
wtap_encap_string ( this_frame_type ) ,
wtap_encap_short_string ( this_frame_type ) ) ;
break ;
}
}
}
fprintf ( stderr , " mergecap: selected frame_type %s (%s) \n " ,
wtap_encap_string ( frame_type ) ,
wtap_encap_short_string ( frame_type ) ) ;
}
2004-10-27 23:28:37 +00:00
}
2002-08-28 21:04:11 +00:00
2001-07-13 08:16:16 +00:00
/* open the outfile */
2008-05-22 15:46:27 +00:00
if ( strncmp ( out_filename , " - " , 2 ) = = 0 ) {
2004-06-29 20:59:24 +00:00
/* use stdout as the outfile */
2004-10-27 23:28:37 +00:00
out_fd = 1 /*stdout*/ ;
2004-06-29 20:59:24 +00:00
} else {
/* open the outfile */
2008-05-22 15:46:27 +00:00
out_fd = ws_open ( out_filename , O_WRONLY | O_CREAT | O_TRUNC | O_BINARY , 0644 ) ;
2004-10-27 23:28:37 +00:00
if ( out_fd = = - 1 ) {
fprintf ( stderr , " mergecap: Couldn't open output file %s: %s \n " ,
2011-06-28 09:00:11 +00:00
out_filename , g_strerror ( errno ) ) ;
2004-10-27 23:28:37 +00:00
exit ( 1 ) ;
}
2008-05-22 15:46:27 +00:00
}
2004-06-29 20:59:24 +00:00
/* prepare the outfile */
2013-11-08 09:53:01 +00:00
if ( file_type = = WTAP_FILE_TYPE_SUBTYPE_PCAPNG ) {
2013-09-06 21:57:04 +00:00
wtapng_section_t * shb_hdr ;
2012-04-25 14:01:15 +00:00
GString * comment_gstr ;
shb_hdr = g_new ( wtapng_section_t , 1 ) ;
2012-04-25 19:21:25 +00:00
comment_gstr = g_string_new ( " File created by merging: \n " ) ;
2012-04-25 14:01:15 +00:00
for ( i = 0 ; i < in_file_count ; i + + ) {
2013-09-06 21:57:04 +00:00
g_string_append_printf ( comment_gstr , " File%d: %s \n " , i + 1 , in_files [ i ] . filename ) ;
2012-04-25 14:01:15 +00:00
}
shb_hdr - > section_length = - 1 ;
/* options */
2013-09-06 21:57:04 +00:00
shb_hdr - > opt_comment = comment_gstr - > str ; /* NULL if not available */
shb_hdr - > shb_hardware = NULL ; /* NULL if not available, UTF-8 string containing the description of the hardware used to create this section. */
shb_hdr - > shb_os = NULL ; /* NULL if not available, UTF-8 string containing the name of the operating system used to create this section. */
2014-09-22 20:53:02 +00:00
shb_hdr - > shb_user_appl = g_strdup ( " mergecap " ) ; /* NULL if not available, UTF-8 string containing the name of the application used to create this section. */
2012-04-25 14:01:15 +00:00
2012-04-25 18:38:55 +00:00
pdh = wtap_dump_fdopen_ng ( out_fd , file_type , frame_type , snaplen ,
2012-04-25 14:01:15 +00:00
FALSE /* compressed */ , shb_hdr , NULL /* wtapng_iface_descriptions_t *idb_inf */ , & open_err ) ;
g_string_free ( comment_gstr , TRUE ) ;
2013-09-06 21:57:04 +00:00
} else {
pdh = wtap_dump_fdopen ( out_fd , file_type , frame_type , snaplen , FALSE /* compressed */ , & open_err ) ;
2012-04-25 14:01:15 +00:00
}
2004-10-29 00:36:52 +00:00
if ( pdh = = NULL ) {
2004-06-18 10:01:59 +00:00
merge_close_in_files ( in_file_count , in_files ) ;
2008-01-24 19:09:30 +00:00
g_free ( in_files ) ;
2004-10-28 01:06:11 +00:00
fprintf ( stderr , " mergecap: Can't open or create %s: %s \n " , out_filename ,
2004-10-29 00:36:52 +00:00
wtap_strerror ( open_err ) ) ;
2001-07-13 08:16:16 +00:00
exit ( 1 ) ;
}
/* do the merge (or append) */
2004-10-29 00:36:52 +00:00
count = 1 ;
for ( ; ; ) {
if ( do_append )
When reporting "sorry, *this* packet can't be written to a file of that
type" when writing out a capture file (i.e., writing a
per-packet-encapsulation capture to a file type that supports it but
doesn't support one of the packet's encapsulations), report the packet
number and, when doing this in a merge operation, report the file from
which it came.
When reporting "sorry, that file can't be written to a file of that
type, period", show the file type rather than the input file link-layer
type that causes the problem. (We could show both. We could be
*really* ambitious and iterate through all possible file types and show
the ones that will or at least might work....)
file_write_error_message() is documented as handling only UNIX-style
errnos, and libwireshark should be usable without libwiretap, so leave
it up to its callers to handle Wiretap errors such as
WTAP_ERR_SHORT_WRITE.
Clean up indentation.
svn path=/trunk/; revision=39949
2011-11-19 20:18:01 +00:00
in_file = merge_append_read_packet ( in_file_count , in_files , & read_err ,
& err_info ) ;
2004-10-29 00:36:52 +00:00
else
When reporting "sorry, *this* packet can't be written to a file of that
type" when writing out a capture file (i.e., writing a
per-packet-encapsulation capture to a file type that supports it but
doesn't support one of the packet's encapsulations), report the packet
number and, when doing this in a merge operation, report the file from
which it came.
When reporting "sorry, that file can't be written to a file of that
type, period", show the file type rather than the input file link-layer
type that causes the problem. (We could show both. We could be
*really* ambitious and iterate through all possible file types and show
the ones that will or at least might work....)
file_write_error_message() is documented as handling only UNIX-style
errnos, and libwireshark should be usable without libwiretap, so leave
it up to its callers to handle Wiretap errors such as
WTAP_ERR_SHORT_WRITE.
Clean up indentation.
svn path=/trunk/; revision=39949
2011-11-19 20:18:01 +00:00
in_file = merge_read_packet ( in_file_count , in_files , & read_err ,
& err_info ) ;
if ( in_file = = NULL ) {
2011-11-21 06:26:03 +00:00
/* EOF */
break ;
}
if ( read_err ! = 0 ) {
/* I/O error reading from in_file */
got_read_error = TRUE ;
2004-10-29 00:36:52 +00:00
break ;
}
if ( verbose )
fprintf ( stderr , " Record: %u \n " , count + + ) ;
/* We simply write it, perhaps after truncating it; we could do other
* things , like modify it . */
2014-05-09 05:18:49 +00:00
phdr = wtap_phdr ( in_file - > wth ) ;
2004-10-29 00:36:52 +00:00
if ( snaplen ! = 0 & & phdr - > caplen > snaplen ) {
snap_phdr = * phdr ;
snap_phdr . caplen = snaplen ;
phdr = & snap_phdr ;
}
2014-12-18 00:02:50 +00:00
if ( ! wtap_dump ( pdh , phdr , wtap_buf_ptr ( in_file - > wth ) , & write_err , & write_err_info ) ) {
2004-10-29 00:36:52 +00:00
got_write_error = TRUE ;
break ;
}
}
2001-07-13 08:16:16 +00:00
2004-06-18 10:01:59 +00:00
merge_close_in_files ( in_file_count , in_files ) ;
2014-01-21 08:50:35 +00:00
if ( ! got_write_error ) {
2014-05-09 05:18:49 +00:00
if ( ! wtap_dump_close ( pdh , & write_err ) )
2004-10-29 00:36:52 +00:00
got_write_error = TRUE ;
2014-01-21 08:50:35 +00:00
} else {
/*
* We already got a write error ; no need to report another
* write error on close .
*
* Don ' t overwrite the earlier write error .
*/
2014-05-09 05:18:49 +00:00
( void ) wtap_dump_close ( pdh , & close_err ) ;
2014-01-21 08:50:35 +00:00
}
2004-10-28 01:52:05 +00:00
2004-10-29 00:36:52 +00:00
if ( got_read_error ) {
2004-10-28 01:52:05 +00:00
/*
* Find the file on which we got the error , and report the error .
*/
for ( i = 0 ; i < in_file_count ; i + + ) {
2004-10-29 00:36:52 +00:00
if ( in_files [ i ] . state = = GOT_ERROR ) {
2004-10-28 01:52:05 +00:00
fprintf ( stderr , " mergecap: Error reading %s: %s \n " ,
2004-10-29 00:36:52 +00:00
in_files [ i ] . filename , wtap_strerror ( read_err ) ) ;
2014-12-18 04:03:47 +00:00
if ( err_info ! = NULL ) {
2004-10-29 00:36:52 +00:00
fprintf ( stderr , " (%s) \n " , err_info ) ;
g_free ( err_info ) ;
2004-10-28 01:52:05 +00:00
}
}
}
2004-10-29 00:36:52 +00:00
}
2004-10-28 01:52:05 +00:00
2004-10-29 00:36:52 +00:00
if ( got_write_error ) {
When reporting "sorry, *this* packet can't be written to a file of that
type" when writing out a capture file (i.e., writing a
per-packet-encapsulation capture to a file type that supports it but
doesn't support one of the packet's encapsulations), report the packet
number and, when doing this in a merge operation, report the file from
which it came.
When reporting "sorry, that file can't be written to a file of that
type, period", show the file type rather than the input file link-layer
type that causes the problem. (We could show both. We could be
*really* ambitious and iterate through all possible file types and show
the ones that will or at least might work....)
file_write_error_message() is documented as handling only UNIX-style
errnos, and libwireshark should be usable without libwiretap, so leave
it up to its callers to handle Wiretap errors such as
WTAP_ERR_SHORT_WRITE.
Clean up indentation.
svn path=/trunk/; revision=39949
2011-11-19 20:18:01 +00:00
switch ( write_err ) {
2014-12-17 06:40:45 +00:00
case WTAP_ERR_UNWRITABLE_ENCAP :
When reporting "sorry, *this* packet can't be written to a file of that
type" when writing out a capture file (i.e., writing a
per-packet-encapsulation capture to a file type that supports it but
doesn't support one of the packet's encapsulations), report the packet
number and, when doing this in a merge operation, report the file from
which it came.
When reporting "sorry, that file can't be written to a file of that
type, period", show the file type rather than the input file link-layer
type that causes the problem. (We could show both. We could be
*really* ambitious and iterate through all possible file types and show
the ones that will or at least might work....)
file_write_error_message() is documented as handling only UNIX-style
errnos, and libwireshark should be usable without libwiretap, so leave
it up to its callers to handle Wiretap errors such as
WTAP_ERR_SHORT_WRITE.
Clean up indentation.
svn path=/trunk/; revision=39949
2011-11-19 20:18:01 +00:00
/*
2014-01-22 00:26:36 +00:00
* This is a problem with the particular frame we ' re writing and
* the file type and subtype we ' re wwriting ; note that , and
* report the frame number and file type / subtype .
When reporting "sorry, *this* packet can't be written to a file of that
type" when writing out a capture file (i.e., writing a
per-packet-encapsulation capture to a file type that supports it but
doesn't support one of the packet's encapsulations), report the packet
number and, when doing this in a merge operation, report the file from
which it came.
When reporting "sorry, that file can't be written to a file of that
type, period", show the file type rather than the input file link-layer
type that causes the problem. (We could show both. We could be
*really* ambitious and iterate through all possible file types and show
the ones that will or at least might work....)
file_write_error_message() is documented as handling only UNIX-style
errnos, and libwireshark should be usable without libwiretap, so leave
it up to its callers to handle Wiretap errors such as
WTAP_ERR_SHORT_WRITE.
Clean up indentation.
svn path=/trunk/; revision=39949
2011-11-19 20:18:01 +00:00
*/
2014-01-22 00:26:36 +00:00
fprintf ( stderr , " mergecap: Frame %u of \" %s \" has a network type that can't be saved in a \" %s \" file. \n " ,
2014-02-25 16:10:50 +00:00
in_file ? in_file - > packet_num : 0 , in_file ? in_file - > filename : " UNKNOWN " ,
2014-01-22 00:26:36 +00:00
wtap_file_type_subtype_string ( file_type ) ) ;
break ;
case WTAP_ERR_PACKET_TOO_LARGE :
/*
* This is a problem with the particular frame we ' re writing and
* the file type and subtype we ' re wwriting ; note that , and
* report the frame number and file type / subtype .
*/
2014-12-18 00:02:50 +00:00
fprintf ( stderr , " mergecap: Frame %u of \" %s \" is too large for a \" %s \" file. \n " ,
2014-02-25 16:10:50 +00:00
in_file ? in_file - > packet_num : 0 , in_file ? in_file - > filename : " UNKNOWN " ,
2014-01-22 00:26:36 +00:00
wtap_file_type_subtype_string ( file_type ) ) ;
When reporting "sorry, *this* packet can't be written to a file of that
type" when writing out a capture file (i.e., writing a
per-packet-encapsulation capture to a file type that supports it but
doesn't support one of the packet's encapsulations), report the packet
number and, when doing this in a merge operation, report the file from
which it came.
When reporting "sorry, that file can't be written to a file of that
type, period", show the file type rather than the input file link-layer
type that causes the problem. (We could show both. We could be
*really* ambitious and iterate through all possible file types and show
the ones that will or at least might work....)
file_write_error_message() is documented as handling only UNIX-style
errnos, and libwireshark should be usable without libwiretap, so leave
it up to its callers to handle Wiretap errors such as
WTAP_ERR_SHORT_WRITE.
Clean up indentation.
svn path=/trunk/; revision=39949
2011-11-19 20:18:01 +00:00
break ;
2014-12-18 00:31:49 +00:00
case WTAP_ERR_UNWRITABLE_REC_TYPE :
2014-12-18 00:02:50 +00:00
/*
* This is a problem with the particular record we ' re writing and
* the file type and subtype we ' re wwriting ; note that , and
* report the record number and file type / subtype .
*/
fprintf ( stderr , " mergecap: Record %u of \" %s \" has a record type that can't be saved in a \" %s \" file. \n " ,
in_file ? in_file - > packet_num : 0 , in_file ? in_file - > filename : " UNKNOWN " ,
wtap_file_type_subtype_string ( file_type ) ) ;
break ;
case WTAP_ERR_UNWRITABLE_REC_DATA :
/*
* This is a problem with the particular record we ' re writing and
* the file type and subtype we ' re wwriting ; note that , and
* report the record number and file type / subtype .
*/
fprintf ( stderr , " mergecap: Record %u of \" %s \" has data that can't be saved in a \" %s \" file. \n (%s) \n " ,
in_file ? in_file - > packet_num : 0 , in_file ? in_file - > filename : " UNKNOWN " ,
wtap_file_type_subtype_string ( file_type ) ,
2014-12-18 04:03:47 +00:00
write_err_info ! = NULL ? write_err_info : " no information supplied " ) ;
2014-12-18 00:02:50 +00:00
g_free ( write_err_info ) ;
break ;
When reporting "sorry, *this* packet can't be written to a file of that
type" when writing out a capture file (i.e., writing a
per-packet-encapsulation capture to a file type that supports it but
doesn't support one of the packet's encapsulations), report the packet
number and, when doing this in a merge operation, report the file from
which it came.
When reporting "sorry, that file can't be written to a file of that
type, period", show the file type rather than the input file link-layer
type that causes the problem. (We could show both. We could be
*really* ambitious and iterate through all possible file types and show
the ones that will or at least might work....)
file_write_error_message() is documented as handling only UNIX-style
errnos, and libwireshark should be usable without libwiretap, so leave
it up to its callers to handle Wiretap errors such as
WTAP_ERR_SHORT_WRITE.
Clean up indentation.
svn path=/trunk/; revision=39949
2011-11-19 20:18:01 +00:00
default :
fprintf ( stderr , " mergecap: Error writing to outfile: %s \n " ,
wtap_strerror ( write_err ) ) ;
break ;
}
2004-10-28 01:06:11 +00:00
}
2001-07-13 08:16:16 +00:00
2008-01-24 19:09:30 +00:00
g_free ( in_files ) ;
2001-07-12 19:59:41 +00:00
2004-10-29 00:36:52 +00:00
return ( ! got_read_error & & ! got_write_error ) ? 0 : 2 ;
2001-07-12 19:59:41 +00:00
}
2013-09-06 21:57:04 +00:00
/*
* Editor modelines - http : //www.wireshark.org/tools/modelines.html
*
* Local variables :
* c - basic - offset : 2
2014-01-03 14:44:16 +00:00
* tab - width : 8
2013-09-06 21:57:04 +00:00
* indent - tabs - mode : nil
* End :
*
2014-01-03 14:44:16 +00:00
* vi : set shiftwidth = 2 tabstop = 8 expandtab :
* : indentSize = 2 : tabSize = 8 : noTabs = true :
2013-09-06 21:57:04 +00:00
*/