From 751e078d2bc6adf1179de164291eb743abd8732b Mon Sep 17 00:00:00 2001 From: Guy Harris Date: Sun, 23 Apr 2017 13:18:02 -0700 Subject: Print first-pass read errors at the end. That way, they don't, for example, get lost as a result of being scrolled off the screen by output from the second pass. Also, do the post-processing of output regardless of whether we got read errors or not, and fix a code error hidden by a call to tshark_debug(). Change-Id: I389c7c794f4dd5fda6e4c50ce480802c92701866 Reviewed-on: https://code.wireshark.org/review/21305 Reviewed-by: Guy Harris --- tshark.c | 81 ++++++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 53 insertions(+), 28 deletions(-) (limited to 'tshark.c') diff --git a/tshark.c b/tshark.c index c9946cc5b9..2989460182 100644 --- a/tshark.c +++ b/tshark.c @@ -2946,12 +2946,13 @@ static gboolean process_cap_file(capture_file *cf, char *save_file, int out_file_type, gboolean out_file_name_res, int max_packet_count, gint64 max_byte_count) { + gboolean success = TRUE; gint linktype; int snapshot_length; wtap_dumper *pdh; guint32 framenum; - int err; - gchar *err_info = NULL; + int err = 0, err_pass1 = 0; + gchar *err_info = NULL, *err_info_pass1 = NULL; gint64 data_offset; gboolean filtering_tap_listeners; guint tap_flags; @@ -3023,13 +3024,15 @@ process_cap_file(capture_file *cf, char *save_file, int out_file_type, if (pdh == NULL) { /* We couldn't set up to write to the capture file. */ cfile_dump_open_failure_message("TShark", save_file, err, out_file_type); + success = FALSE; goto out; } } else { + /* Set up to print packet information. */ if (print_packet_info) { if (!write_preamble(cf)) { - err = errno; - show_print_file_io_error(err); + show_print_file_io_error(errno); + success = FALSE; goto out; } } @@ -3094,6 +3097,20 @@ process_cap_file(capture_file *cf, char *save_file, int out_file_type, } } + /* + * If we got a read error on the first pass, remember the error, so + * but do the second pass, so we can at least process the packets we + * read, and then report the first-pass error after the second pass + * (and before we report any second-pass errors), so all the the + * errors show up at the end. + */ + if (err != 0) { + err_pass1 = err; + err_info_pass1 = err_info; + err = 0; + err_info = NULL; + } + if (edt) { epan_dissect_free(edt); edt = NULL; @@ -3214,7 +3231,7 @@ process_cap_file(capture_file *cf, char *save_file, int out_file_type, create_proto_tree = (cf->rfcode || cf->dfcode || print_details || filtering_tap_listeners || (tap_flags & TL_REQUIRES_PROTO_TREE) || postdissectors_want_hfids() || - have_custom_cols(&cf->cinfo)) + have_custom_cols(&cf->cinfo)); tshark_debug("tshark: create_proto_tree = %s", create_proto_tree ? "TRUE" : "FALSE"); @@ -3270,7 +3287,7 @@ process_cap_file(capture_file *cf, char *save_file, int out_file_type, wtap_phdr_cleanup(&phdr); - if (err != 0) { + if (err != 0 || err_pass1 != 0) { tshark_debug("tshark: something failed along the line (%d)", err); /* * Print a message noting that the read failed somewhere along the line. @@ -3296,29 +3313,37 @@ process_cap_file(capture_file *cf, char *save_file, int out_file_type, } } #endif - cfile_read_failure_message("TShark", cf->filename, err, err_info); - if (save_file != NULL) { - /* Now close the capture file. */ - if (!wtap_dump_close(pdh, &err)) - cfile_close_failure_message(save_file, err); + if (err_pass1 != 0) { + /* Error on pass 1 of two-pass processing. */ + cfile_read_failure_message("TShark", cf->filename, err_pass1, + err_info_pass1); + g_free(err_info_pass1); } - } else { - if (save_file != NULL) { - if (pdh && out_file_name_res) { - if (!wtap_dump_set_addrinfo_list(pdh, get_addrinfo_list())) { - cmdarg_err("The file format \"%s\" doesn't support name resolution information.", - wtap_file_type_subtype_short_string(out_file_type)); - } + if (err != 0) { + /* Error on pass 2 of two-pass processing or on the only pass of + one-pass processing. */ + cfile_read_failure_message("TShark", cf->filename, err, err_info); + g_free(err_info); + } + success = FALSE; + } + if (save_file != NULL) { + if (pdh && out_file_name_res) { + if (!wtap_dump_set_addrinfo_list(pdh, get_addrinfo_list())) { + cmdarg_err("The file format \"%s\" doesn't support name resolution information.", + wtap_file_type_subtype_short_string(out_file_type)); } - /* Now close the capture file. */ - if (!wtap_dump_close(pdh, &err)) - cfile_close_failure_message(save_file, err); - } else { - if (print_packet_info) { - if (!write_finale()) { - err = errno; - show_print_file_io_error(err); - } + } + /* Now close the capture file. */ + if (!wtap_dump_close(pdh, &err)) { + cfile_close_failure_message(save_file, err); + success = FALSE; + } + } else { + if (print_packet_info) { + if (!write_finale()) { + show_print_file_io_error(errno); + success = FALSE; } } } @@ -3330,7 +3355,7 @@ out: wtap_block_array_free(shb_hdrs); wtap_block_array_free(nrb_hdrs); - return (err == 0); + return success; } static gboolean -- cgit v1.2.1