diff options
author | Guy Harris <guy@alum.mit.edu> | 2012-07-20 04:00:29 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2012-07-20 04:00:29 +0000 |
commit | 633de5c7d11a096c8529681d79d5a9ad491cb882 (patch) | |
tree | 7727779d613d958a44caab302d6275854f0a1e8a /wiretap | |
parent | 99f775935797fea1d2bbae4e83a5c1d830bb081d (diff) | |
download | wireshark-633de5c7d11a096c8529681d79d5a9ad491cb882.tar.gz wireshark-633de5c7d11a096c8529681d79d5a9ad491cb882.tar.bz2 wireshark-633de5c7d11a096c8529681d79d5a9ad491cb882.zip |
Add a routine that, given a set of packet encapsulation types, returns
the per-file encapsulation type needed to write out a set of packets
with all those encapsulation types. If there's only one such
encapsulation type, that's the type, otherwise WTAP_ENCAP_PER_PACKET is
needed. Use that in wtap_dump_can_write_encaps().
Also use it in cf_save_packets() and cf_export_specified_packets(), so
that we can write out files with WTAP_ENCAP_PER_PACKET as the file
encapsulation type and only one actual per-packet encapsulation type in
some cases where that failed before. This fixes the case that showed up
in bug 7505, although there are other cases where we *could* write out a
capture in a given file format but won't be able to do so; fixing those
will take more work.
#BACKPORT
(Note: this adds a routine to libwiretap, so, when backported, the
*minor* version of the library should be increased. Code that worked
with the version of the library prior to this change will continue to
work, so there's no need to change the *major* version of the library.)
svn path=/trunk/; revision=43847
Diffstat (limited to 'wiretap')
-rw-r--r-- | wiretap/file_access.c | 45 | ||||
-rw-r--r-- | wiretap/wtap.def | 1 | ||||
-rw-r--r-- | wiretap/wtap.h | 6 |
3 files changed, 39 insertions, 13 deletions
diff --git a/wiretap/file_access.c b/wiretap/file_access.c index 40d3317be6..cc986bf4fc 100644 --- a/wiretap/file_access.c +++ b/wiretap/file_access.c @@ -762,6 +762,25 @@ int wtap_get_num_file_types(void) } /* + * Given a GArray of WTAP_ENCAP_ types, return the per-file encapsulation + * type that would be needed to write out a file with those types. If + * there's only one type, it's that type, otherwise it's + * WTAP_ENCAP_PER_PACKET. + */ +int +wtap_dump_file_encap_type(const GArray *file_encaps) +{ + int encap; + + encap = WTAP_ENCAP_PER_PACKET; + if (file_encaps->len == 1) { + /* OK, use the one-and-only encapsulation type. */ + encap = g_array_index(file_encaps, gint, 0); + } + return encap; +} + +/* * Return TRUE if a capture with a given GArray of WTAP_ENCAP_ types * can be written in a specified format, and FALSE if it can't. */ @@ -779,24 +798,24 @@ wtap_dump_can_write_encaps(int ft, const GArray *file_encaps) } /* - * OK, we can write in that format; can we write out all the - * specified encapsulation types in that format? + * Is the required per-file encapsulation type supported? + * This might be WTAP_ENCAP_PER_PACKET. + */ + if (!wtap_dump_can_write_encap(ft, wtap_dump_file_encap_type(file_encaps))) + return FALSE; + + /* + * Yes. Are all the individual encapsulation types supported? */ - if (file_encaps->len > 1) { - /* - * We have more than one encapsulation type, - * so that format needs to support - * WTAP_ENCAP_PER_PACKET. - */ - if (!wtap_dump_can_write_encap(ft, WTAP_ENCAP_PER_PACKET)) - return FALSE; - } - for (i = 0; i < file_encaps->len; i++) { if (!wtap_dump_can_write_encap(ft, - g_array_index(file_encaps, int, i))) + g_array_index(file_encaps, int, i))) { + /* No - one of them isn't. */ return FALSE; + } } + + /* Yes - we're OK. */ return TRUE; } diff --git a/wiretap/wtap.def b/wiretap/wtap.def index 7da50417a2..0ed9650392 100644 --- a/wiretap/wtap.def +++ b/wiretap/wtap.def @@ -35,6 +35,7 @@ wtap_dump_can_compress wtap_dump_close wtap_dump_fdopen wtap_dump_fdopen_ng +wtap_dump_file_encap_type wtap_dump_flush wtap_dump_open wtap_dump_open_ng diff --git a/wiretap/wtap.h b/wiretap/wtap.h index 74e7db254e..2c9538cb5f 100644 --- a/wiretap/wtap.h +++ b/wiretap/wtap.h @@ -1108,6 +1108,12 @@ gboolean wtap_dump_can_open(int filetype); gboolean wtap_dump_can_write_encap(int filetype, int encap); /** + * Given a GArray of WTAP_ENCAP_ types, return the per-file encapsulation + * type that would be needed to write out a file with those types. + */ +int wtap_dump_file_encap_type(const GArray *file_encaps); + +/** * Return TRUE if a capture with a given GArray of WTAP_ENCAP_ types * can be written in a specified format, and FALSE if it can't. */ |