Ethereal-dev: [Ethereal-dev] [PATCH] mergecap : better error handling
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Guy Martin <gmsoft@xxxxxxxxxx>
Date: Tue, 28 Dec 2004 16:43:50 +0100
Hi all, Here is a patch which improve error handling of mergecap. Instead of quitting if a input file have some error (the file was trunkated in my case), it continue to read the next file for merging. The patch is attached. Regards, -- Guy Martin Gentoo Linux - HPPA port Lead / IPv6 team Lug Charleroi (Belgium)
--- merge.c.orig 2004-12-28 15:35:43.335717392 +0100 +++ merge.c 2004-12-28 16:31:55.266106056 +0100 @@ -156,10 +156,10 @@ * to be merged. */ wtap * -merge_read_packet(int in_file_count, merge_in_file_t in_files[], int *err, +merge_read_packet(int in_file_count, merge_in_file_t in_files[], gchar **err_info) { - int i; + int i, err; int ei = -1; struct timeval tv = {LONG_MAX, LONG_MAX}; struct wtap_pkthdr *phdr; @@ -175,10 +175,11 @@ * No packet available, and we haven't seen an error or EOF yet, * so try to read the next packet. */ - if (!wtap_read(in_files[i].wth, err, err_info, &in_files[i].data_offset)) { - if (*err != 0) { + if (!wtap_read(in_files[i].wth, &err, err_info, &in_files[i].data_offset)) { + if (err != 0) { in_files[i].state = GOT_ERROR; - return NULL; + in_files[i].error = err; + continue; } in_files[i].state = AT_EOF; } else @@ -196,7 +197,6 @@ if (ei == -1) { /* All the streams are at EOF. Return an EOF indication. */ - *err = 0; return NULL; } @@ -213,29 +213,29 @@ */ wtap * merge_append_read_packet(int in_file_count, merge_in_file_t in_files[], - int *err, gchar **err_info) + gchar **err_info) { - int i; + int i, err; /* * Find the first file not at EOF, and read the next packet from it. */ for (i = 0; i < in_file_count; i++) { - if (in_files[i].state == AT_EOF) - continue; /* This file is already at EOF */ - if (wtap_read(in_files[i].wth, err, err_info, &in_files[i].data_offset)) + if (in_files[i].state == AT_EOF && in_files[i].state == GOT_ERROR) + continue; /* This file is already at EOF or there was a error reading it */ + if (wtap_read(in_files[i].wth, &err, err_info, &in_files[i].data_offset)) break; /* We have a packet */ - if (*err != 0) { - /* Read error - quit immediately. */ + if (err != 0) { + /* Read error - continue to the next file. */ in_files[i].state = GOT_ERROR; - return NULL; + in_files[i].error = err; + continue; } /* EOF - flag this file as being at EOF, and try the next one. */ in_files[i].state = AT_EOF; } if (i == in_file_count) { /* All the streams are at EOF. Return an EOF indication. */ - *err = 0; return NULL; } --- mergecap.c.orig 2004-12-28 15:38:41.370651968 +0100 +++ mergecap.c 2004-12-28 16:19:36.087478288 +0100 @@ -140,7 +140,7 @@ wtap *wth; struct wtap_pkthdr *phdr, snap_phdr; wtap_dumper *pdh; - int open_err, read_err, write_err, close_err; + int open_err, write_err, close_err; gchar *err_info; int err_fileno; char *out_filename = NULL; @@ -298,7 +298,7 @@ out_filename, strerror(errno)); exit(1); } - } + } /* prepare the outfile */ pdh = wtap_dump_fdopen(out_fd, file_type, frame_type, snaplen, &open_err); @@ -314,14 +314,10 @@ count = 1; for (;;) { if (do_append) - wth = merge_append_read_packet(in_file_count, in_files, &read_err, - &err_info); + wth = merge_append_read_packet(in_file_count, in_files, &err_info); else - wth = merge_read_packet(in_file_count, in_files, &read_err, - &err_info); + wth = merge_read_packet(in_file_count, in_files, &err_info); if (wth == NULL) { - if (read_err != 0) - got_read_error = TRUE; break; } @@ -345,29 +341,28 @@ } merge_close_in_files(in_file_count, in_files); - if (!got_read_error && !got_write_error) { + if (!got_write_error) { if (!wtap_dump_close(pdh, &write_err)) got_write_error = TRUE; } else wtap_dump_close(pdh, &close_err); - if (got_read_error) { - /* - * Find the file on which we got the error, and report the error. - */ - for (i = 0; i < in_file_count; i++) { - if (in_files[i].state == GOT_ERROR) { - fprintf(stderr, "mergecap: Error reading %s: %s\n", - in_files[i].filename, wtap_strerror(read_err)); - switch (read_err) { - - case WTAP_ERR_UNSUPPORTED: - case WTAP_ERR_UNSUPPORTED_ENCAP: - case WTAP_ERR_BAD_RECORD: - fprintf(stderr, "(%s)\n", err_info); - g_free(err_info); - break; - } + /* + * Find the file on which we got the error, and report the error. + */ + for (i = 0; i < in_file_count; i++) { + if (in_files[i].state == GOT_ERROR) { + fprintf(stderr, "mergecap: Error reading %s: %s\n", + in_files[i].filename, wtap_strerror(in_files[i].error)); + switch (in_files[i].error) { + + case WTAP_ERR_UNSUPPORTED: + case WTAP_ERR_UNSUPPORTED_ENCAP: + case WTAP_ERR_BAD_RECORD: + got_read_error = TRUE; + fprintf(stderr, "(%s)\n", err_info); + g_free(err_info); + continue; } } } --- merge.h.orig 2004-12-28 15:52:18.805383000 +0100 +++ merge.h 2004-12-28 16:39:09.308121640 +0100 @@ -45,6 +45,7 @@ long data_offset; in_file_state_e state; long size; /* file size */ + int error; } merge_in_file_t; /** Open a number of input files to merge. @@ -99,7 +100,7 @@ * error or EOF */ extern wtap * -merge_read_packet(int in_file_count, merge_in_file_t in_files[], int *err, +merge_read_packet(int in_file_count, merge_in_file_t in_files[], gchar **err_info); @@ -115,7 +116,7 @@ */ extern wtap * merge_append_read_packet(int in_file_count, merge_in_file_t in_files[], - int *err, gchar **err_info); + gchar **err_info); #ifdef __cplusplus }
Attachment:
pgpEUn_9uW9M_.pgp
Description: PGP signature
- Prev by Date: Re: [Ethereal-dev] ethereal RTCP dissection bug
- Next by Date: Re: [Ethereal-dev] dissector - need help
- Previous by thread: Re: [Ethereal-dev] ethereal RTCP dissection bug
- Next by thread: [Ethereal-dev] Calling tap_queue_packet() more times from the same dissector
- Index(es):