From 272c011d197ad04137d6d1d8d5c86ed8b93f61b4 Mon Sep 17 00:00:00 2001 From: Guy Harris Date: Mon, 21 Nov 2011 06:26:03 +0000 Subject: [PATCH] On an I/O error, merge_read_packet() and merge_append_read_packet() need to return a pointer to the merge_in_file_t that got the error. Set *err to 0 on success and an error code on an err, treat a null return as an EOF indication, and if we don't get a null return check for a non-zero error code and treat that as an I/O error. svn path=/trunk/; revision=39964 --- file.c | 9 +++++++-- merge.c | 29 ++++++++++++++++++++++------- mergecap.c | 9 +++++++-- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/file.c b/file.c index e3db476df3..f6b9af91d8 100644 --- a/file.c +++ b/file.c @@ -1290,8 +1290,13 @@ cf_merge_files(char **out_filenamep, int in_file_count, in_file = merge_read_packet(in_file_count, in_files, &read_err, &err_info); if (in_file == NULL) { - if (read_err != 0) - got_read_error = TRUE; + /* EOF */ + break; + } + + if (read_err != 0) { + /* I/O error reading from in_file */ + got_read_error = TRUE; break; } diff --git a/merge.c b/merge.c index a489fc233a..95be037fcf 100644 --- a/merge.c +++ b/merge.c @@ -150,9 +150,16 @@ is_earlier(struct wtap_nstime *l, struct wtap_nstime *r) { /* * Read the next packet, in chronological order, from the set of files - * to be merged. Return a pointer to the merge_in_file_t for the file - * from which the packet was read on success, or NULL on EOF or error. - * On EOF, *err is 0; on an error, it's an error code. + * to be merged. + * + * On success, set *err to 0 and return a pointer to the merge_in_file_t + * for the file from which the packet was read. + * + * On a read error, set *err to the error and return a pointer to the + * merge_in_file_t for the file on which we got an error. + * + * On an EOF (meaning all the files are at EOF), set *err to 0 and return + * NULL. */ merge_in_file_t * merge_read_packet(int in_file_count, merge_in_file_t in_files[], @@ -211,9 +218,16 @@ merge_read_packet(int in_file_count, merge_in_file_t in_files[], /* * Read the next packet, in file sequence order, from the set of files - * to be merged. Return a pointer to the merge_in_file_t for the file - * from which the packet was read on success, or NULL on EOF or error. - * On EOF, *err is 0; on an error, it's an error code. + * to be merged. + * + * On success, set *err to 0 and return a pointer to the merge_in_file_t + * for the file from which the packet was read. + * + * On a read error, set *err to the error and return a pointer to the + * merge_in_file_t for the file on which we got an error. + * + * On an EOF (meaning all the files are at EOF), set *err to 0 and return + * NULL. */ merge_in_file_t * merge_append_read_packet(int in_file_count, merge_in_file_t in_files[], @@ -232,7 +246,7 @@ merge_append_read_packet(int in_file_count, merge_in_file_t in_files[], if (*err != 0) { /* Read error - quit immediately. */ in_files[i].state = GOT_ERROR; - return NULL; + return &in_files[i]; } /* EOF - flag this file as being at EOF, and try the next one. */ in_files[i].state = AT_EOF; @@ -244,5 +258,6 @@ merge_append_read_packet(int in_file_count, merge_in_file_t in_files[], } /* Return the ordinal of the file from which the packet was read. */ + *err = 0; return &in_files[i]; } diff --git a/mergecap.c b/mergecap.c index 51e64464c8..91b956d3d8 100644 --- a/mergecap.c +++ b/mergecap.c @@ -351,8 +351,13 @@ main(int argc, char *argv[]) in_file = merge_read_packet(in_file_count, in_files, &read_err, &err_info); if (in_file == NULL) { - if (read_err != 0) - got_read_error = TRUE; + /* EOF */ + break; + } + + if (read_err != 0) { + /* I/O error reading from in_file */ + got_read_error = TRUE; break; }