aboutsummaryrefslogtreecommitdiffstats
path: root/file.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 /file.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 'file.c')
-rw-r--r--file.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/file.c b/file.c
index 0091ae08d9..67e7da2d91 100644
--- a/file.c
+++ b/file.c
@@ -4230,10 +4230,14 @@ cf_save_packets(capture_file *cf, const char *fname, guint save_format,
wtapng_section_t *shb_hdr = NULL;
wtapng_iface_descriptions_t *idb_inf = NULL;
+ int encap;
shb_hdr = wtap_file_get_shb_info(cf->wth);
idb_inf = wtap_file_get_idb_info(cf->wth);
+ /* Determine what file encapsulation type we should use. */
+ encap = wtap_dump_file_encap_type(cf->linktypes);
+
if (file_exists(fname)) {
/* We're overwriting an existing file; write out to a new file,
and, if that succeeds, rename the new file on top of the
@@ -4243,10 +4247,10 @@ cf_save_packets(capture_file *cf, const char *fname, guint save_format,
we *HAVE* to do that, otherwise we're overwriting the file
from which we're reading the packets that we're writing!) */
fname_new = g_strdup_printf("%s~", fname);
- pdh = wtap_dump_open_ng(fname_new, save_format, cf->lnk_t, cf->snap,
+ pdh = wtap_dump_open_ng(fname_new, save_format, encap, cf->snap,
compressed, shb_hdr, idb_inf, &err);
} else {
- pdh = wtap_dump_open_ng(fname, save_format, cf->lnk_t, cf->snap,
+ pdh = wtap_dump_open_ng(fname, save_format, encap, cf->snap,
compressed, shb_hdr, idb_inf, &err);
}
g_free(idb_inf);
@@ -4434,6 +4438,7 @@ cf_export_specified_packets(capture_file *cf, const char *fname,
save_callback_args_t callback_args;
wtapng_section_t *shb_hdr = NULL;
wtapng_iface_descriptions_t *idb_inf = NULL;
+ int encap;
cf_callback_invoke(cf_cb_file_export_specified_packets_started, (gpointer)fname);
@@ -4447,6 +4452,9 @@ cf_export_specified_packets(capture_file *cf, const char *fname,
shb_hdr = wtap_file_get_shb_info(cf->wth);
idb_inf = wtap_file_get_idb_info(cf->wth);
+ /* Determine what file encapsulation type we should use. */
+ encap = wtap_dump_file_encap_type(cf->linktypes);
+
if (file_exists(fname)) {
/* We're overwriting an existing file; write out to a new file,
and, if that succeeds, rename the new file on top of the
@@ -4456,10 +4464,10 @@ cf_export_specified_packets(capture_file *cf, const char *fname,
we *HAVE* to do that, otherwise we're overwriting the file
from which we're reading the packets that we're writing!) */
fname_new = g_strdup_printf("%s~", fname);
- pdh = wtap_dump_open_ng(fname_new, save_format, cf->lnk_t, cf->snap,
+ pdh = wtap_dump_open_ng(fname_new, save_format, encap, cf->snap,
compressed, shb_hdr, idb_inf, &err);
} else {
- pdh = wtap_dump_open_ng(fname, save_format, cf->lnk_t, cf->snap,
+ pdh = wtap_dump_open_ng(fname, save_format, encap, cf->snap,
compressed, shb_hdr, idb_inf, &err);
}
g_free(idb_inf);