From a33e6528d96478e58aad7ff1a0dc2e6ad7db2a8a Mon Sep 17 00:00:00 2001 From: guy Date: Sat, 19 Nov 2011 20:18:01 +0000 Subject: 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. git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@39949 f5534014-38df-0310-8fa8-9805f1628bb7 --- tshark.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 57 insertions(+), 14 deletions(-) (limited to 'tshark.c') diff --git a/tshark.c b/tshark.c index 7a836f9406..e74d7a98b8 100644 --- a/tshark.c +++ b/tshark.c @@ -2672,6 +2672,7 @@ load_cap_file(capture_file *cf, char *save_file, int out_file_type, gint linktype; int snapshot_length; wtap_dumper *pdh; + guint32 framenum; int err; gchar *err_info = NULL; gint64 data_offset; @@ -2707,8 +2708,8 @@ load_cap_file(capture_file *cf, char *save_file, int out_file_type, case WTAP_ERR_UNSUPPORTED_ENCAP: case WTAP_ERR_ENCAP_PER_PACKET_UNSUPPORTED: - cmdarg_err("The capture file being read can't be written in " - "the format \"%s\".", wtap_encap_short_string(linktype)); + cmdarg_err("The capture file being read can't be written as a " + "\"%s\" file.", wtap_file_type_short_string(out_file_type)); break; case WTAP_ERR_CANT_OPEN: @@ -2753,7 +2754,6 @@ load_cap_file(capture_file *cf, char *save_file, int out_file_type, tap_flags = union_of_tap_listener_flags(); if (perform_two_pass_analysis) { - guint32 framenum; frame_data *fdata; int old_max_packet_count = max_packet_count; @@ -2799,7 +2799,26 @@ load_cap_file(capture_file *cf, char *save_file, int out_file_type, wtap_pseudoheader(cf->wth), wtap_buf_ptr(cf->wth), &err)) { /* Error writing to a capture file */ - show_capture_file_io_error(save_file, err, FALSE); + 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. + * + * XXX - framenum is not necessarily the frame number in + * the input file if there was a read filter. + */ + fprintf(stderr, + "Frame %u of \"%s\" has a network type that can't be saved in a \"%s\" file.\n", + framenum, cf->filename, + wtap_file_type_short_string(out_file_type)); + break; + + default: + show_capture_file_io_error(save_file, err, FALSE); + break; + } wtap_dump_close(pdh, &err); exit(2); } @@ -2818,7 +2837,10 @@ load_cap_file(capture_file *cf, char *save_file, int out_file_type, } } else { + framenum = 0; while (wtap_read(cf->wth, &err, &err_info, &data_offset)) { + framenum++; + if (process_packet(cf, data_offset, wtap_phdr(cf->wth), wtap_pseudoheader(cf->wth), wtap_buf_ptr(cf->wth), filtering_tap_listeners, tap_flags)) { @@ -2830,7 +2852,23 @@ load_cap_file(capture_file *cf, char *save_file, int out_file_type, wtap_pseudoheader(cf->wth), wtap_buf_ptr(cf->wth), &err)) { /* Error writing to a capture file */ - show_capture_file_io_error(save_file, err, FALSE); + 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, + "Frame %u of \"%s\" has a network type that can't be saved in a \"%s\" file.\n", + framenum, cf->filename, + wtap_file_type_short_string(out_file_type)); + break; + + default: + show_capture_file_io_error(save_file, err, FALSE); + break; + } wtap_dump_close(pdh, &err); exit(2); } @@ -3598,8 +3636,8 @@ cf_open_error_message(int err, gchar *err_info, gboolean for_writing, case WTAP_ERR_CANT_WRITE_TO_PIPE: /* Seen only when opening a capture file for writing. */ g_snprintf(errmsg_errno, sizeof(errmsg_errno), - "The file \"%%s\" is a pipe, and %s capture files can't be " - "written to a pipe.", wtap_file_type_string(file_type)); + "The file \"%%s\" is a pipe, and \"%s\" capture files can't be " + "written to a pipe.", wtap_file_type_short_string(file_type)); errmsg = errmsg_errno; break; @@ -3609,21 +3647,26 @@ cf_open_error_message(int err, gchar *err_info, gboolean for_writing, break; case WTAP_ERR_UNSUPPORTED_ENCAP: - if (for_writing) - errmsg = "TShark can't save this capture in that format."; - else { + if (for_writing) { + g_snprintf(errmsg_errno, sizeof(errmsg_errno), + "TShark can't save this capture as a \"%s\" file.", + wtap_file_type_short_string(file_type)); + } else { g_snprintf(errmsg_errno, sizeof(errmsg_errno), "The file \"%%s\" is a capture for a network type that TShark doesn't support.\n" "(%s)", err_info); g_free(err_info); - errmsg = errmsg_errno; } + errmsg = errmsg_errno; break; case WTAP_ERR_ENCAP_PER_PACKET_UNSUPPORTED: - if (for_writing) - errmsg = "TShark can't save this capture in that format."; - else + if (for_writing) { + g_snprintf(errmsg_errno, sizeof(errmsg_errno), + "TShark can't save this capture as a \"%s\" file.", + wtap_file_type_short_string(file_type)); + errmsg = errmsg_errno; + } else errmsg = "The file \"%s\" is a capture for a network type that TShark doesn't support."; break; -- cgit v1.2.3