aboutsummaryrefslogtreecommitdiffstats
path: root/wiretap/file_access.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2012-07-20 04:00:29 +0000
committerGuy Harris <guy@alum.mit.edu>2012-07-20 04:00:29 +0000
commit633de5c7d11a096c8529681d79d5a9ad491cb882 (patch)
tree7727779d613d958a44caab302d6275854f0a1e8a /wiretap/file_access.c
parent99f775935797fea1d2bbae4e83a5c1d830bb081d (diff)
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/file_access.c')
-rw-r--r--wiretap/file_access.c45
1 files changed, 32 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;
}