diff options
author | Guy Harris <guy@alum.mit.edu> | 2011-11-19 20:18:01 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2011-11-19 20:18:01 +0000 |
commit | 2929c93ea276766076aed8bf617befba65d32eb4 (patch) | |
tree | 23f6e64eaa570e79fd24e3dd413e77eed56f9737 /mergecap.c | |
parent | 4b2aa811e14412e3731714e4e54c344e967173c1 (diff) | |
download | wireshark-2929c93ea276766076aed8bf617befba65d32eb4.tar.gz wireshark-2929c93ea276766076aed8bf617befba65d32eb4.tar.bz2 wireshark-2929c93ea276766076aed8bf617befba65d32eb4.zip |
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.
svn path=/trunk/; revision=39949
Diffstat (limited to 'mergecap.c')
-rw-r--r-- | mergecap.c | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/mergecap.c b/mergecap.c index 99a9cf26f2..51e64464c8 100644 --- a/mergecap.c +++ b/mergecap.c @@ -157,9 +157,8 @@ main(int argc, char *argv[]) #endif int frame_type = -2; int out_fd; - merge_in_file_t *in_files = NULL; + merge_in_file_t *in_files = NULL, *in_file; int i; - wtap *wth; struct wtap_pkthdr *phdr, snap_phdr; wtap_dumper *pdh; int open_err, read_err, write_err, close_err; @@ -346,12 +345,12 @@ main(int argc, char *argv[]) count = 1; for (;;) { if (do_append) - wth = merge_append_read_packet(in_file_count, in_files, &read_err, - &err_info); + in_file = merge_append_read_packet(in_file_count, in_files, &read_err, + &err_info); else - wth = merge_read_packet(in_file_count, in_files, &read_err, - &err_info); - if (wth == NULL) { + 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; break; @@ -362,15 +361,15 @@ main(int argc, char *argv[]) /* We simply write it, perhaps after truncating it; we could do other * things, like modify it. */ - phdr = wtap_phdr(wth); + phdr = wtap_phdr(in_file->wth); if (snaplen != 0 && phdr->caplen > snaplen) { snap_phdr = *phdr; snap_phdr.caplen = snaplen; phdr = &snap_phdr; } - if (!wtap_dump(pdh, phdr, wtap_pseudoheader(wth), - wtap_buf_ptr(wth), &write_err)) { + if (!wtap_dump(pdh, phdr, wtap_pseudoheader(in_file->wth), + wtap_buf_ptr(in_file->wth), &write_err)) { got_write_error = TRUE; break; } @@ -405,8 +404,22 @@ main(int argc, char *argv[]) } if (got_write_error) { - fprintf(stderr, "mergecap: Error writing to outfile: %s\n", - wtap_strerror(write_err)); + switch (write_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, "mergecap: Frame %u of \"%s\" has a network type that can't be saved in a file with that format\n.", + in_file->packet_num, in_file->filename); + break; + + default: + fprintf(stderr, "mergecap: Error writing to outfile: %s\n", + wtap_strerror(write_err)); + break; + } } g_free(in_files); |