aboutsummaryrefslogtreecommitdiffstats
path: root/wiretap
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2018-11-18 14:10:00 -0800
committerGuy Harris <guy@alum.mit.edu>2018-11-18 22:10:42 +0000
commitbf9286e554c8d2b9e506b62dc7c0ed8f6e830160 (patch)
tree7057b13cf88f642626c5cc0272a52d0a389d3c61 /wiretap
parent189f1ceec25f4900e25b6faea5f15aeb27a08c7e (diff)
Add an API to get the file extension for a compression type, and use it.
Add wtap_compressed_file_extension(), which returns NULL for WTAP_UNCOMPRESSED and the appropriate file extension for other compression types. Add wtap_compression_type_supported(), which returns TRUE for WTAP_UNCOMPRESSED and all supported compression types and FALSE otherwise. ("Supported" means "the code can decompmress files in that compression format and can write files in that compression format", so WTAP_GAIP_COMPRESSED is supported iff libwiretap is built with zlib.) In MainWindow::fileAddExtension, instead of checking for WTAP_GZIP_COMPRESSED and using ".gz" as the extension, use the extension returned by wtap_compressed_file_extension() for the compression type. Change-Id: I47cb0eca8c887ada3562df30b54e76509008180f Reviewed-on: https://code.wireshark.org/review/30707 Reviewed-by: Guy Harris <guy@alum.mit.edu>
Diffstat (limited to 'wiretap')
-rw-r--r--wiretap/file_access.c107
-rw-r--r--wiretap/file_wrappers.c13
-rw-r--r--wiretap/wtap-int.h6
-rw-r--r--wiretap/wtap.c40
-rw-r--r--wiretap/wtap.h4
5 files changed, 114 insertions, 56 deletions
diff --git a/wiretap/file_access.c b/wiretap/file_access.c
index e6a8d517c6..cc043ee374 100644
--- a/wiretap/file_access.c
+++ b/wiretap/file_access.c
@@ -78,30 +78,50 @@
#include "systemd_journal.h"
/*
- * Add an extension, and all compressed versions thereof, to a GSList
- * of extensions.
+ * Add an extension, and all compressed versions thereof if requested,
+ * to a GSList of extensions.
*/
static GSList *
add_extensions(GSList *extensions, const gchar *extension,
- const char **compressed_file_extensions)
+ gboolean include_compressed)
{
- const char **compressed_file_extensionp;
-
/*
* Add the specified extension.
*/
extensions = g_slist_prepend(extensions, g_strdup(extension));
- /*
- * Now add the extensions for compressed-file versions of
- * that extension.
- */
- for (compressed_file_extensionp = compressed_file_extensions;
- *compressed_file_extensionp != NULL;
- compressed_file_extensionp++) {
- extensions = g_slist_prepend(extensions,
- g_strdup_printf("%s.%s", extension,
- *compressed_file_extensionp));
+ if (include_compressed) {
+ /*
+ * We were asked to include the extensions for
+ * compressed-file versions of that extension; do so.
+ */
+ for (wtap_compression_type compression_type = WTAP_UNCOMPRESSED;
+ compression_type < WTAP_NUM_COMPRESSION_TYPES;
+ compression_type++) {
+ if (compression_type == WTAP_UNCOMPRESSED) {
+ /*
+ * This isn't a compression type, so it has
+ * no extension.
+ */
+ continue;
+ }
+ if (!wtap_compression_type_supported(compression_type)) {
+ /*
+ * We don't support this compression type,
+ * so don't include its extension.
+ */
+ continue;
+ }
+
+ /*
+ * It's a supported compression type, so append its
+ * extension to the extension we were handed, and
+ * include that as an extension pair.
+ */
+ extensions = g_slist_prepend(extensions,
+ g_strdup_printf("%s.%s", extension,
+ wtap_compressed_file_extension(compression_type)));
+ }
}
return extensions;
@@ -192,8 +212,7 @@ wtap_get_file_extension_type_name(int extension_type)
}
static GSList *
-add_extensions_for_file_extensions_type(int extension_type,
- GSList *extensions, const char **compressed_file_extensions)
+add_extensions_for_file_extensions_type(int extension_type, GSList *extensions)
{
gchar **extensions_set, **extensionp, *extension;
@@ -213,8 +232,7 @@ add_extensions_for_file_extensions_type(int extension_type,
* Add the extension, and all compressed variants
* of it.
*/
- extensions = add_extensions(extensions, extension,
- compressed_file_extensions);
+ extensions = add_extensions(extensions, extension, TRUE);
}
g_strfreev(extensions_set);
@@ -241,7 +259,7 @@ wtap_get_file_extension_type_extensions(guint extension_type)
* variants.
*/
extensions = add_extensions_for_file_extensions_type(extension_type,
- extensions, compressed_file_extension_table);
+ extensions);
return extensions;
}
@@ -283,7 +301,7 @@ wtap_get_all_capture_file_extensions_list(void)
* extensions, with compressed variants.
*/
extensions = add_extensions_for_file_extensions_type(i,
- extensions, compressed_file_extension_table);
+ extensions);
}
}
@@ -598,7 +616,6 @@ get_file_extension(const char *pathname)
gchar *filename;
gchar **components;
size_t ncomponents;
- const char **compressed_file_extensionp;
gchar *extensionp;
/*
@@ -646,12 +663,31 @@ get_file_extension(const char *pathname)
* files?
*/
extensionp = components[ncomponents - 1];
- for (compressed_file_extensionp = compressed_file_extension_table;
- *compressed_file_extensionp != NULL;
- compressed_file_extensionp++) {
- if (strcmp(extensionp, *compressed_file_extensionp) == 0) {
+ for (wtap_compression_type compression_type = WTAP_UNCOMPRESSED;
+ compression_type < WTAP_NUM_COMPRESSION_TYPES;
+ compression_type++) {
+ if (compression_type == WTAP_UNCOMPRESSED) {
+ /*
+ * This isn't a compression type, so it has no
+ * extension.
+ */
+ continue;
+ }
+ if (!wtap_compression_type_supported(compression_type)) {
+ /*
+ * We don't support this compression type, so don't
+ * include its extension.
+ */
+ continue;
+ }
+
+ /*
+ * Is the extension the extension corresponding to this
+ * compression type?
+ */
+ if (strcmp(extensionp, wtap_compressed_file_extension(compression_type)) == 0) {
/*
- * Yes, it's one of the compressed-file extensions.
+ * Yes, so it's one of the compressed-file extensions.
* Is there an extension before that?
*/
if (ncomponents == 2) {
@@ -2030,19 +2066,19 @@ wtap_short_string_to_file_type_subtype(const char *short_name)
static GSList *
add_extensions_for_file_type_subtype(int file_type_subtype, GSList *extensions,
- const char **compressed_file_extensions)
+ gboolean include_compressed)
{
gchar **extensions_set, **extensionp;
gchar *extension;
/*
* Add the default extension, and all compressed variants of
- * it, if there is a default extension.
+ * it if requested, if there is a default extension.
*/
if (dump_open_table[file_type_subtype].default_file_extension != NULL) {
extensions = add_extensions(extensions,
dump_open_table[file_type_subtype].default_file_extension,
- compressed_file_extensions);
+ include_compressed);
}
if (dump_open_table[file_type_subtype].additional_file_extensions != NULL) {
@@ -2064,10 +2100,10 @@ add_extensions_for_file_type_subtype(int file_type_subtype, GSList *extensions,
/*
* Add the extension, and all compressed variants
- * of it.
+ * of it if requested.
*/
extensions = add_extensions(extensions, extension,
- compressed_file_extensions);
+ include_compressed);
}
g_strfreev(extensions_set);
@@ -2087,9 +2123,6 @@ GSList *
wtap_get_file_extensions_list(int file_type_subtype, gboolean include_compressed)
{
GSList *extensions;
- static const char *no_compressed_extensions[] = {
- NULL
- };
if (file_type_subtype < 0 || file_type_subtype >= wtap_num_file_types_subtypes)
return NULL; /* not a valid file type */
@@ -2104,7 +2137,7 @@ wtap_get_file_extensions_list(int file_type_subtype, gboolean include_compressed
* variants if include_compressed is true.
*/
extensions = add_extensions_for_file_type_subtype(file_type_subtype, extensions,
- include_compressed ? compressed_file_extension_table : no_compressed_extensions);
+ include_compressed);
return extensions;
}
@@ -2130,7 +2163,7 @@ wtap_get_all_file_extensions_list(void)
for (i = 0; i < WTAP_NUM_FILE_TYPES_SUBTYPES; i++) {
extensions = add_extensions_for_file_type_subtype(i, extensions,
- compressed_file_extension_table);
+ TRUE); /* include compressed-file extensions */
}
return extensions;
diff --git a/wiretap/file_wrappers.c b/wiretap/file_wrappers.c
index daf0798ce7..c1ea1b9040 100644
--- a/wiretap/file_wrappers.c
+++ b/wiretap/file_wrappers.c
@@ -43,19 +43,6 @@
* Lzip format: http://www.nongnu.org/lzip/
*/
-/*
- * List of extensions for compressed files.
- * If we add support for more compressed file types, this table
- * might be expanded to include routines to handle the various
- * compression types.
- */
-const char *compressed_file_extension_table[] = {
-#ifdef HAVE_ZLIB
- "gz",
-#endif
- NULL
-};
-
/* #define GZBUFSIZE 8192 */
#define GZBUFSIZE 4096
diff --git a/wiretap/wtap-int.h b/wiretap/wtap-int.h
index fcd4b41167..76b6113531 100644
--- a/wiretap/wtap-int.h
+++ b/wiretap/wtap-int.h
@@ -251,12 +251,6 @@ extern gint wtap_num_file_types;
#endif
/*
- * Table of extensions for compressed file types we support.
- * Last pointer in the list is null.
- */
-extern const char *compressed_file_extension_table[];
-
-/*
* Read a given number of bytes from a file into a buffer or, if
* buf is NULL, just discard them.
*
diff --git a/wiretap/wtap.c b/wiretap/wtap.c
index a9ee84c3eb..5d32180d56 100644
--- a/wiretap/wtap.c
+++ b/wiretap/wtap.c
@@ -86,6 +86,25 @@ wtap_get_compression_type(wtap *wth)
return is_compressed ? WTAP_GZIP_COMPRESSED : WTAP_UNCOMPRESSED;
}
+/*
+ * Indicate whether a given compression type is supported.
+ */
+static const gboolean compression_type_supported[WTAP_NUM_COMPRESSION_TYPES] = {
+ TRUE,
+#ifdef HAVE_ZLIB
+ TRUE
+#else
+ FALSE
+#endif
+};
+
+gboolean
+wtap_compression_type_supported(wtap_compression_type compression_type)
+{
+ g_assert(compression_type >= 0 && compression_type < WTAP_NUM_COMPRESSION_TYPES);
+ return compression_type_supported[compression_type];
+}
+
static const char *compression_type_descriptions[WTAP_NUM_COMPRESSION_TYPES] = {
NULL, /* uncompressed */
"gzip compressed"
@@ -98,6 +117,27 @@ wtap_compression_type_description(wtap_compression_type compression_type)
return compression_type_descriptions[compression_type];
}
+/*
+ * List of extensions for compressed files.
+ * If we add support for more compressed file types, this table
+ * might be expanded to include routines to handle the various
+ * compression types.
+ *
+ * The entry is NULL for WTAP_UNCOMPRESSED, as it's not a compression type,
+ * and thus has no suffix to indicate the compression type.
+ */
+static const char *compressed_file_extensions[WTAP_NUM_COMPRESSION_TYPES] = {
+ NULL,
+ "gz"
+};
+
+const char *
+wtap_compressed_file_extension(wtap_compression_type compression_type)
+{
+ g_assert(compression_type >= 0 && compression_type < WTAP_NUM_COMPRESSION_TYPES);
+ return compressed_file_extensions[compression_type];
+}
+
guint
wtap_snapshot_length(wtap *wth)
{
diff --git a/wiretap/wtap.h b/wiretap/wtap.h
index a853e1735b..617e20ec6f 100644
--- a/wiretap/wtap.h
+++ b/wiretap/wtap.h
@@ -1710,8 +1710,12 @@ gint64 wtap_file_size(wtap *wth, int *err);
WS_DLL_PUBLIC
wtap_compression_type wtap_get_compression_type(wtap *wth);
WS_DLL_PUBLIC
+gboolean wtap_compression_type_supported(wtap_compression_type compression_type);
+WS_DLL_PUBLIC
const char *wtap_compression_type_description(wtap_compression_type compression_type);
WS_DLL_PUBLIC
+const char *wtap_compressed_file_extension(wtap_compression_type compression_type);
+WS_DLL_PUBLIC
guint wtap_snapshot_length(wtap *wth); /* per file */
WS_DLL_PUBLIC
int wtap_file_type_subtype(wtap *wth);