aboutsummaryrefslogtreecommitdiffstats
path: root/wiretap
diff options
context:
space:
mode:
Diffstat (limited to 'wiretap')
-rw-r--r--wiretap/file_access.c81
-rw-r--r--wiretap/file_wrappers.c31
-rw-r--r--wiretap/wtap-int.h3
-rw-r--r--wiretap/wtap.def3
-rw-r--r--wiretap/wtap.h3
5 files changed, 113 insertions, 8 deletions
diff --git a/wiretap/file_access.c b/wiretap/file_access.c
index c327da4015..8ade7cf66b 100644
--- a/wiretap/file_access.c
+++ b/wiretap/file_access.c
@@ -716,16 +716,85 @@ int wtap_short_string_to_file_type(const char *short_name)
return -1; /* no such file type, or we can't write it */
}
-/* file extensions to use. */
-const char *wtap_file_extensions_string(int filetype)
+/* Return a list of file extensions that are used by the specified file type.
+ This includes compressed extensions, e.g. not just "pcap" but also
+ "pcap.gz" if we can read gzipped files.
+
+ All strings in the list are allocated with g_malloc() and must be freed
+ with g_free(). */
+GSList *wtap_get_file_extensions_list(int filetype)
{
+ gchar **extensions_set, **extensionp;
+ gchar *extension;
+ GSList *compressed_file_extensions, *compressed_file_extension;
+ GSList *extensions;
+
if (filetype < 0 || filetype >= wtap_num_file_types)
- return NULL;
- else
- return dump_open_table[filetype].file_extensions;
+ return NULL; /* not a valid file type */
+
+ if (dump_open_table[filetype].file_extensions == NULL)
+ return NULL; /* valid, but no extensions list */
+
+ /*
+ * Split the extension-list string into a set of extensions.
+ */
+ extensions_set = g_strsplit(dump_open_table[filetype].file_extensions,
+ ";", 0);
+
+ /*
+ * Get the list of compressed-file extensions.
+ */
+ compressed_file_extensions = wtap_get_compressed_file_extensions();
+
+ /*
+ * Add each of those extensions to the list.
+ */
+ extensions = NULL; /* empty list, to start with */
+ for (extensionp = extensions_set; *extensionp != NULL; extensionp++) {
+ extension = *extensionp;
+
+ /*
+ * XXX - skip past the "*.".
+ */
+ extension += 2;
+
+ /*
+ * Now add the extension.
+ */
+ extensions = g_slist_append(extensions, g_strdup(extension));
+
+ /*
+ * Now add the extensions for compressed-file versions of
+ * that extension.
+ */
+ for (compressed_file_extension = compressed_file_extensions;
+ compressed_file_extension != NULL;
+ compressed_file_extension = g_slist_next(compressed_file_extension)) {
+ extensions = g_slist_append(extensions,
+ g_strdup_printf("%s.%s", extension,
+ (gchar *)compressed_file_extension->data));
+ }
+ }
+ g_strfreev(extensions_set);
+ g_slist_free(compressed_file_extensions);
+ return extensions;
+}
+
+/*
+ * Free a list returned by wtap_file_extensions_list().
+ */
+void wtap_free_file_extensions_list(GSList *extensions)
+{
+ GSList *extension;
+
+ for (extension = extensions; extension != NULL;
+ extension = g_slist_next(extension)) {
+ g_free(extension->data);
+ }
+ g_slist_free(extensions);
}
-/* default file extension to use. */
+/* Return the default file extension to use with the specified file type. */
const char *wtap_file_extension_default_string(int filetype)
{
if (filetype < 0 || filetype >= wtap_num_file_types)
diff --git a/wiretap/file_wrappers.c b/wiretap/file_wrappers.c
index 7baa0abe07..a5f4739f15 100644
--- a/wiretap/file_wrappers.c
+++ b/wiretap/file_wrappers.c
@@ -73,6 +73,37 @@
* Bzip2 format: http://bzip.org/
*/
+/*
+ * 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.
+ */
+static const char *compressed_file_extensions[] = {
+#ifdef HAVE_LIBZ
+ "gz",
+#endif
+ NULL
+};
+
+/*
+ * Return a GSList of all the compressed file extensions.
+ * The data pointers all point to items in compressed_file_extensions[],
+ * so the GSList can just be freed with g_slist_free().
+ */
+GSList *
+wtap_get_compressed_file_extensions(void)
+{
+ const char **extension;
+ GSList *extensions;
+
+ extensions = NULL;
+ for (extension = &compressed_file_extensions[0]; *extension != NULL;
+ extension++)
+ extensions = g_slist_append(extensions, (gpointer)(*extension));
+ return extensions;
+}
+
/* #define GZBUFSIZE 8192 */
#define GZBUFSIZE 4096
diff --git a/wiretap/wtap-int.h b/wiretap/wtap-int.h
index 4fb6fe565c..2d0dd94fda 100644
--- a/wiretap/wtap-int.h
+++ b/wiretap/wtap-int.h
@@ -342,6 +342,9 @@ extern gint wtap_num_file_types;
#define g_ptr_array_len(a) ((a)->len)
#endif
+/*** get GSList of all compressed file extensions ***/
+GSList *wtap_get_compressed_file_extensions(void);
+
#endif /* __WTAP_INT_H__ */
/*
diff --git a/wiretap/wtap.def b/wiretap/wtap.def
index 490829f697..2d67ba60cb 100644
--- a/wiretap/wtap.def
+++ b/wiretap/wtap.def
@@ -44,7 +44,8 @@ wtap_dump_set_addrinfo_list
wtap_encap_short_string
wtap_encap_string
wtap_file_encap
-wtap_file_extensions_string
+wtap_get_file_extensions_list
+wtap_free_file_extensions_list
wtap_file_extension_default_string
wtap_file_size
wtap_file_tsprecision
diff --git a/wiretap/wtap.h b/wiretap/wtap.h
index e2f84597ed..4f0cb54209 100644
--- a/wiretap/wtap.h
+++ b/wiretap/wtap.h
@@ -954,7 +954,8 @@ const char *wtap_file_type_string(int filetype);
const char *wtap_file_type_short_string(int filetype);
int wtap_short_string_to_file_type(const char *short_name);
-const char *wtap_file_extensions_string(int filetype);
+GSList *wtap_get_file_extensions_list(int filetype);
+void wtap_free_file_extensions_list(GSList *extensions);
const char *wtap_file_extension_default_string(int filetype);
const char *wtap_encap_string(int encap);