diff options
Diffstat (limited to 'wiretap')
-rw-r--r-- | wiretap/file_access.c | 81 | ||||
-rw-r--r-- | wiretap/file_wrappers.c | 31 | ||||
-rw-r--r-- | wiretap/wtap-int.h | 3 | ||||
-rw-r--r-- | wiretap/wtap.def | 3 | ||||
-rw-r--r-- | wiretap/wtap.h | 3 |
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); |