X-Git-Url: http://git.samba.org/samba.git/?p=obnox%2Fwireshark%2Fwip.git;a=blobdiff_plain;f=editcap.c;h=d643ea45c6ead4f3bed4bcd898fe64f7768ea80e;hp=f8af5e13569da0a5ea8e7731789e2de22eb7cc37;hb=f71d7b8cb4b53b1d7e6981cc1e510d0d15c88334;hpb=b0470ef1fe28e236a3c2ceb11dedd80e1753f16e diff --git a/editcap.c b/editcap.c index f8af5e1356..d643ea45c6 100644 --- a/editcap.c +++ b/editcap.c @@ -42,9 +42,7 @@ #include "wtap.h" -#ifdef HAVE_GETOPT_H -#include -#else +#ifndef HAVE_GETOPT #include "wsutil/wsgetopt.h" #endif @@ -60,7 +58,7 @@ # include "wsutil/strptime.h" #endif -#include "epan/crypt/crypt-md5.h" +#include "epan/crypt/md5.h" #include "epan/plugins.h" #include "epan/report_err.h" #include "epan/filesystem.h" @@ -123,7 +121,11 @@ struct time_adjustment { static struct select_item selectfrm[MAX_SELECTIONS]; static int max_selected = -1; static int keep_em = 0; -static int out_file_type = WTAP_FILE_PCAP; /* default to "libpcap" */ +#ifdef PCAP_NG_DEFAULT +static int out_file_type = WTAP_FILE_PCAPNG; /* default to pcapng */ +#else +static int out_file_type = WTAP_FILE_PCAP; /* default to pcap */ +#endif static int out_frame_type = -2; /* Leave frame type alone */ static int verbose = 0; /* Not so verbose */ static struct time_adjustment time_adj = {{0, 0}, 0}; /* no adjustment */ @@ -662,9 +664,9 @@ usage(gboolean is_error) fprintf(output, "Editcap %s" #ifdef SVNVERSION - " (" SVNVERSION " from " SVNPATH ")" + " (" SVNVERSION " from " SVNPATH ")" #endif - "\n", VERSION); + "\n", VERSION); fprintf(output, "Edit and/or translate the format of capture files.\n"); fprintf(output, "See http://www.wireshark.org for more information.\n"); fprintf(output, "\n"); @@ -721,7 +723,7 @@ usage(gboolean is_error) fprintf(output, " -i split the packet output to different files\n"); fprintf(output, " based on uniform time intervals\n"); fprintf(output, " with a maximum of each.\n"); - fprintf(output, " -F set the output file type; default is libpcap.\n"); + fprintf(output, " -F set the output file type; default is pcapng.\n"); fprintf(output, " an empty \"-F\" option will list the file types.\n"); fprintf(output, " -T set the output file encapsulation type;\n"); fprintf(output, " default is the same as the input file.\n"); @@ -744,8 +746,8 @@ struct string_elem { static gint string_compare(gconstpointer a, gconstpointer b) { - return strcmp(((struct string_elem *)a)->sstr, - ((struct string_elem *)b)->sstr); + return strcmp(((const struct string_elem *)a)->sstr, + ((const struct string_elem *)b)->sstr); } static void @@ -805,7 +807,7 @@ list_encap_types(void) { static void failure_message(const char *msg_format _U_, va_list ap _U_) { - return; + return; } #endif @@ -818,7 +820,7 @@ main(int argc, char *argv[]) int opt; char *p; - unsigned int snaplen = 0; /* No limit */ + guint32 snaplen = 0; /* No limit */ int choplen = 0; /* No chop */ wtap_dumper *pdh = NULL; int count = 1; @@ -828,10 +830,11 @@ main(int argc, char *argv[]) const struct wtap_pkthdr *phdr; int err_type; guint8 *buf; + guint32 read_count = 0; int split_packet_count = 0; int written_count = 0; char *filename = NULL; - gboolean check_ts; + gboolean ts_okay = TRUE; int secs_per_block = 0; int block_cnt = 0; nstime_t block_start; @@ -902,7 +905,7 @@ main(int argc, char *argv[]) break; case 'C': - choplen = strtol(optarg, &p, 10); + choplen = strtol(optarg, &p, 10); if (p == optarg || *p != '\0') { fprintf(stderr, "editcap: \"%s\" isn't a valid chop length\n", optarg); @@ -983,10 +986,10 @@ main(int argc, char *argv[]) case 'T': out_frame_type = wtap_short_string_to_encap(optarg); if (out_frame_type < 0) { - fprintf(stderr, "editcap: \"%s\" isn't a valid encapsulation type\n\n", - optarg); + fprintf(stderr, "editcap: \"%s\" isn't a valid encapsulation type\n\n", + optarg); list_encap_types(); - exit(1); + exit(1); } break; @@ -1083,7 +1086,7 @@ main(int argc, char *argv[]) case WTAP_ERR_UNSUPPORTED: case WTAP_ERR_UNSUPPORTED_ENCAP: - case WTAP_ERR_BAD_RECORD: + case WTAP_ERR_BAD_FILE: fprintf(stderr, "(%s)\n", err_info); g_free(err_info); break; @@ -1120,6 +1123,8 @@ main(int argc, char *argv[]) } while (wtap_read(wth, &err, &err_info, &data_offset)) { + read_count++; + phdr = wtap_phdr(wth); buf = wtap_buf_ptr(wth); @@ -1135,9 +1140,9 @@ main(int argc, char *argv[]) } else filename = g_strdup(argv[optind+1]); - pdh = wtap_dump_open(filename, out_file_type, - out_frame_type, wtap_snapshot_length(wth), - FALSE /* compressed */, &err); + pdh = wtap_dump_open(filename, out_file_type, out_frame_type, + snaplen ? MIN(snaplen, wtap_snapshot_length(wth)) : wtap_snapshot_length(wth), + FALSE /* compressed */, &err); if (pdh == NULL) { fprintf(stderr, "editcap: Can't open or create %s: %s\n", filename, wtap_strerror(err)); @@ -1166,8 +1171,9 @@ main(int argc, char *argv[]) fprintf(stderr, "Continuing writing in file %s\n", filename); } - pdh = wtap_dump_open(filename, out_file_type, - out_frame_type, wtap_snapshot_length(wth), FALSE /* compressed */, &err); + pdh = wtap_dump_open(filename, out_file_type, out_frame_type, + snaplen ? MIN(snaplen, wtap_snapshot_length(wth)) : wtap_snapshot_length(wth), + FALSE /* compressed */, &err); if (pdh == NULL) { fprintf(stderr, "editcap: Can't open or create %s: %s\n", filename, @@ -1196,8 +1202,9 @@ main(int argc, char *argv[]) fprintf(stderr, "Continuing writing in file %s\n", filename); } - pdh = wtap_dump_open(filename, out_file_type, - out_frame_type, wtap_snapshot_length(wth), FALSE /* compressed */, &err); + pdh = wtap_dump_open(filename, out_file_type, out_frame_type, + snaplen ? MIN(snaplen, wtap_snapshot_length(wth)) : wtap_snapshot_length(wth), + FALSE /* compressed */, &err); if (pdh == NULL) { fprintf(stderr, "editcap: Can't open or create %s: %s\n", filename, wtap_strerror(err)); @@ -1206,10 +1213,10 @@ main(int argc, char *argv[]) } } - check_ts = check_timestamp(wth); + if (check_startstop) + ts_okay = check_timestamp(wth); - if ( ((check_startstop && check_ts) || (!check_startstop && !check_ts)) && ((!selected(count) && !keep_em) || - (selected(count) && keep_em)) ) { + if ( ts_okay && ((!selected(count) && !keep_em) || (selected(count) && keep_em)) ) { if (verbose && !dup_detect && !dup_detect_by_time) printf("Packet: %u\n", count); @@ -1219,23 +1226,26 @@ main(int argc, char *argv[]) phdr = wtap_phdr(wth); - if (choplen < 0 && (phdr->caplen + choplen) > 0) { + if (snaplen != 0 && phdr->caplen > snaplen) { snap_phdr = *phdr; - snap_phdr.caplen += choplen; + snap_phdr.caplen = snaplen; phdr = &snap_phdr; } - if (choplen > 0 && phdr->caplen > (unsigned int) choplen) { + if (choplen < 0) { snap_phdr = *phdr; - snap_phdr.caplen -= choplen; - snap_phdr.len -= choplen; - buf += choplen; + if (((signed int) phdr->caplen + choplen) > 0) + snap_phdr.caplen += choplen; + else + snap_phdr.caplen = 0; phdr = &snap_phdr; - } - - if (snaplen != 0 && phdr->caplen > snaplen) { + } else if (choplen > 0) { snap_phdr = *phdr; - snap_phdr.caplen = snaplen; + if (phdr->caplen > (unsigned int) choplen) { + snap_phdr.caplen -= choplen; + buf += choplen; + } else + snap_phdr.caplen = 0; phdr = &snap_phdr; } @@ -1419,7 +1429,7 @@ main(int argc, char *argv[]) if (err_type < ERR_WT_FMT) { if ((unsigned int)i < phdr->caplen - 2) - strncpy((char*) &buf[i], "%s", 2); + g_strlcpy((char*) &buf[i], "%s", 2); err_type = ERR_WT_TOTAL; } else { err_type -= ERR_WT_FMT; @@ -1436,8 +1446,22 @@ main(int argc, char *argv[]) } if (!wtap_dump(pdh, phdr, wtap_pseudoheader(wth), buf, &err)) { - fprintf(stderr, "editcap: Error writing to %s: %s\n", - filename, wtap_strerror(err)); + switch (err) { + + case WTAP_ERR_UNSUPPORTED_ENCAP: + /* + * This is a problem with the particular frame we're writing; + * note that, and give the frame number. + */ + fprintf(stderr, "editcap: Frame %u of \"%s\" has a network type that can't be saved in a file with that format\n.", + read_count, argv[optind]); + break; + + default: + fprintf(stderr, "editcap: Error writing to %s: %s\n", + filename, wtap_strerror(err)); + break; + } exit(2); } written_count++; @@ -1457,7 +1481,7 @@ main(int argc, char *argv[]) case WTAP_ERR_UNSUPPORTED: case WTAP_ERR_UNSUPPORTED_ENCAP: - case WTAP_ERR_BAD_RECORD: + case WTAP_ERR_BAD_FILE: fprintf(stderr, "(%s)\n", err_info); g_free(err_info); break; @@ -1469,12 +1493,13 @@ main(int argc, char *argv[]) g_free (filename); filename = g_strdup(argv[optind+1]); - pdh = wtap_dump_open(filename, out_file_type, - out_frame_type, wtap_snapshot_length(wth), FALSE /* compressed */, &err); + pdh = wtap_dump_open(filename, out_file_type, out_frame_type, + snaplen ? MIN(snaplen, wtap_snapshot_length(wth)): wtap_snapshot_length(wth), + FALSE /* compressed */, &err); if (pdh == NULL) { - fprintf(stderr, "editcap: Can't open or create %s: %s\n", filename, - wtap_strerror(err)); - exit(2); + fprintf(stderr, "editcap: Can't open or create %s: %s\n", filename, + wtap_strerror(err)); + exit(2); } }