aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--epan/wslua/wslua_file.c2
-rw-r--r--filetap/file_access.c35
-rw-r--r--filetap/ftap.h3
-rw-r--r--wiretap/file_access.c161
-rw-r--r--wiretap/wtap.h3
5 files changed, 109 insertions, 95 deletions
diff --git a/epan/wslua/wslua_file.c b/epan/wslua/wslua_file.c
index c9dd8d526c..d7476ad446 100644
--- a/epan/wslua/wslua_file.c
+++ b/epan/wslua/wslua_file.c
@@ -2182,7 +2182,7 @@ WSLUA_FUNCTION wslua_register_filehandler(lua_State* L) {
fh->file_type = wtap_register_file_type_subtypes(&(fh->finfo),fh->file_type);
if (fh->is_reader) {
- struct open_info oi = { NULL, OPEN_INFO_HEURISTIC, NULL, NULL, NULL };
+ struct open_info oi = { NULL, OPEN_INFO_HEURISTIC, NULL, NULL, NULL, NULL };
oi.name = fh->finfo.short_name;
oi.open_routine = wslua_filehandler_open;
oi.extensions = fh->finfo.additional_file_extensions;
diff --git a/filetap/file_access.c b/filetap/file_access.c
index 3b7b103770..e82905f840 100644
--- a/filetap/file_access.c
+++ b/filetap/file_access.c
@@ -278,11 +278,11 @@ void ftap_register_magic_number_open_routine(ftap_open_routine_t open_routine) {
* appear before the *really* weak entries, such as the VWR entry.
*/
static const struct ftap_heuristic_open_info heuristic_open_info_base[] = {
- { NULL, "(empty)", },
+ { NULL, "(empty)", NULL},
};
#define N_HEURISTIC_FILE_TYPES (sizeof heuristic_open_info_base / sizeof heuristic_open_info_base[0])
-static const struct ftap_heuristic_open_info* heuristic_open_info = NULL;
+static struct ftap_heuristic_open_info* heuristic_open_info = NULL;
static GArray* heuristic_open_info_arr = NULL;
@@ -290,22 +290,34 @@ static GArray* heuristic_open_info_arr = NULL;
* Initialize the heuristics array if it has not been initialized yet.
*/
static void init_heuristic_open_info(void) {
+ unsigned int i;
+ struct ftap_heuristic_open_info *i_open;
- if (heuristic_open_info_arr) return;
+ if (heuristic_open_info_arr)
+ return;
heuristic_open_info_arr = g_array_new(FALSE,TRUE,sizeof(struct ftap_heuristic_open_info));
g_array_append_vals(heuristic_open_info_arr,heuristic_open_info_base,N_HEURISTIC_FILE_TYPES);
- heuristic_open_info = (const struct ftap_heuristic_open_info*)(void *)heuristic_open_info_arr->data;
+ heuristic_open_info = (struct ftap_heuristic_open_info*)(void *)heuristic_open_info_arr->data;
+
+ /* Populate the extensions_set list now */
+ for (i = 0, i_open = heuristic_open_info; i < heuristic_open_info_arr->len; i++, i_open++) {
+ if (i_open->extensions != NULL)
+ i_open->extensions_set = g_strsplit(i_open->extensions, ";", 0);
+ }
}
-void ftap_register_heuristic_open_info(const struct ftap_heuristic_open_info *hi) {
+void ftap_register_heuristic_open_info(struct ftap_heuristic_open_info *hi) {
init_heuristic_open_info();
g_array_append_val(heuristic_open_info_arr,*hi);
- heuristic_open_info = (const struct ftap_heuristic_open_info*)(void *)heuristic_open_info_arr->data;
+ if (hi->extensions != NULL)
+ hi->extensions_set = g_strsplit(hi->extensions, ";", 0);
+
+ heuristic_open_info = (struct ftap_heuristic_open_info*)(void *)heuristic_open_info_arr->data;
}
/*
@@ -423,7 +435,7 @@ static char *get_file_extension(const char *pathname)
static gboolean heuristic_uses_extension(unsigned int i, const char *extension)
{
- gchar **extensions_set, **extensionp;
+ gchar **extensionp;
/*
* Does this file type *have* any extensions?
@@ -432,21 +444,14 @@ static gboolean heuristic_uses_extension(unsigned int i, const char *extension)
return FALSE; /* no */
/*
- * Get a list of the extensions used by the specified file type.
- */
- extensions_set = g_strsplit(heuristic_open_info[i].extensions, ";", 0);
-
- /*
* Check each of them against the specified extension.
*/
- for (extensionp = extensions_set; *extensionp != NULL;
+ for (extensionp = heuristic_open_info[i].extensions_set; *extensionp != NULL;
extensionp++) {
if (strcmp(extension, *extensionp) == 0) {
- g_strfreev(extensions_set);
return TRUE; /* it's one of them */
}
}
- g_strfreev(extensions_set);
return FALSE; /* it's not one of them */
}
diff --git a/filetap/ftap.h b/filetap/ftap.h
index 5524c5cafa..85839e0b6b 100644
--- a/filetap/ftap.h
+++ b/filetap/ftap.h
@@ -145,6 +145,7 @@ typedef int (*ftap_open_routine_t)(struct ftap*, int *, char **);
struct ftap_heuristic_open_info {
ftap_open_routine_t open_routine;
const char *extensions;
+ gchar **extensions_set; /* populated using extensions member during initialization */
};
struct ftap_file_type_subtype_info {
@@ -286,7 +287,7 @@ void ftap_register_file_type_extension(const struct filetap_extension_info *ei);
WS_DLL_PUBLIC
void ftap_register_magic_number_open_routine(ftap_open_routine_t open_routine);
WS_DLL_PUBLIC
-void ftap_register_heuristic_open_info(const struct ftap_heuristic_open_info *oi);
+void ftap_register_heuristic_open_info(struct ftap_heuristic_open_info *oi);
WS_DLL_PUBLIC
int ftap_register_file_type_subtypes(const struct ftap_file_type_subtype_info* fi);
WS_DLL_PUBLIC
diff --git a/wiretap/file_access.c b/wiretap/file_access.c
index f58d037a41..9a9a34d7c4 100644
--- a/wiretap/file_access.c
+++ b/wiretap/file_access.c
@@ -301,39 +301,39 @@ GSList *wtap_get_all_file_extensions_list(void)
*/
static struct open_info open_info_base[] = {
- { "Pcap", OPEN_INFO_MAGIC, libpcap_open, "pcap", NULL },
- { "PcapNG", OPEN_INFO_MAGIC, pcapng_open, "pcapng", NULL },
- { "NgSniffer", OPEN_INFO_MAGIC, ngsniffer_open, NULL, NULL },
- { "Snoop", OPEN_INFO_MAGIC, snoop_open, NULL, NULL },
- { "IP Trace", OPEN_INFO_MAGIC, iptrace_open, NULL, NULL },
- { "Netmon", OPEN_INFO_MAGIC, netmon_open, NULL, NULL },
- { "Netxray", OPEN_INFO_MAGIC, netxray_open, NULL, NULL },
- { "Radcom", OPEN_INFO_MAGIC, radcom_open, NULL, NULL },
- { "Nettl", OPEN_INFO_MAGIC, nettl_open, NULL, NULL },
- { "Visual", OPEN_INFO_MAGIC, visual_open, NULL, NULL },
- { "5 Views", OPEN_INFO_MAGIC, _5views_open, NULL, NULL },
- { "Network Instruments", OPEN_INFO_MAGIC, network_instruments_open, NULL, NULL },
- { "Peek Tagged", OPEN_INFO_MAGIC, peektagged_open, NULL, NULL },
- { "DBS Etherwatch", OPEN_INFO_MAGIC, dbs_etherwatch_open, NULL, NULL },
- { "K12", OPEN_INFO_MAGIC, k12_open, NULL, NULL },
- { "Catapult DCT 2000", OPEN_INFO_MAGIC, catapult_dct2000_open, NULL, NULL },
- { "Aethra", OPEN_INFO_MAGIC, aethra_open, NULL, NULL },
- { "BTSNOOP", OPEN_INFO_MAGIC, btsnoop_open, "log", NULL },
- { "EYESDN", OPEN_INFO_MAGIC, eyesdn_open, NULL, NULL },
- { "TNEF", OPEN_INFO_MAGIC, tnef_open, NULL, NULL },
- { "MIME Files with Magic Bytes", OPEN_INFO_MAGIC, mime_file_open, NULL, NULL },
- { "Lanalyzer", OPEN_INFO_HEURISTIC, lanalyzer_open, "tr1", NULL },
+ { "Pcap", OPEN_INFO_MAGIC, libpcap_open, "pcap", NULL, NULL },
+ { "PcapNG", OPEN_INFO_MAGIC, pcapng_open, "pcapng", NULL, NULL },
+ { "NgSniffer", OPEN_INFO_MAGIC, ngsniffer_open, NULL, NULL, NULL },
+ { "Snoop", OPEN_INFO_MAGIC, snoop_open, NULL, NULL, NULL },
+ { "IP Trace", OPEN_INFO_MAGIC, iptrace_open, NULL, NULL, NULL },
+ { "Netmon", OPEN_INFO_MAGIC, netmon_open, NULL, NULL, NULL },
+ { "Netxray", OPEN_INFO_MAGIC, netxray_open, NULL, NULL, NULL },
+ { "Radcom", OPEN_INFO_MAGIC, radcom_open, NULL, NULL, NULL },
+ { "Nettl", OPEN_INFO_MAGIC, nettl_open, NULL, NULL, NULL },
+ { "Visual", OPEN_INFO_MAGIC, visual_open, NULL, NULL, NULL },
+ { "5 Views", OPEN_INFO_MAGIC, _5views_open, NULL, NULL, NULL },
+ { "Network Instruments", OPEN_INFO_MAGIC, network_instruments_open, NULL, NULL, NULL },
+ { "Peek Tagged", OPEN_INFO_MAGIC, peektagged_open, NULL, NULL, NULL },
+ { "DBS Etherwatch", OPEN_INFO_MAGIC, dbs_etherwatch_open, NULL, NULL, NULL },
+ { "K12", OPEN_INFO_MAGIC, k12_open, NULL, NULL, NULL },
+ { "Catapult DCT 2000", OPEN_INFO_MAGIC, catapult_dct2000_open, NULL, NULL, NULL },
+ { "Aethra", OPEN_INFO_MAGIC, aethra_open, NULL, NULL, NULL },
+ { "BTSNOOP", OPEN_INFO_MAGIC, btsnoop_open, "log", NULL, NULL },
+ { "EYESDN", OPEN_INFO_MAGIC, eyesdn_open, NULL, NULL, NULL },
+ { "TNEF", OPEN_INFO_MAGIC, tnef_open, NULL, NULL, NULL },
+ { "MIME Files with Magic Bytes", OPEN_INFO_MAGIC, mime_file_open, NULL, NULL, NULL },
+ { "Lanalyzer", OPEN_INFO_HEURISTIC, lanalyzer_open, "tr1", NULL, NULL },
/*
* PacketLogger must come before MPEG, because its files
* are sometimes grabbed by mpeg_open.
*/
- { "Packet Logger", OPEN_INFO_HEURISTIC, packetlogger_open, "pklg", NULL },
+ { "Packet Logger", OPEN_INFO_HEURISTIC, packetlogger_open, "pklg", NULL, NULL },
/* Some MPEG files have magic numbers, others just have heuristics. */
- { "Mpeg", OPEN_INFO_HEURISTIC, mpeg_open, "mpg;mp3", NULL },
- { "DCT3 Trace", OPEN_INFO_HEURISTIC, dct3trace_open, "xml", NULL },
- { "Daintree SNA", OPEN_INFO_HEURISTIC, daintree_sna_open, "dcf", NULL },
- { "Stanag 4607", OPEN_INFO_HEURISTIC, stanag4607_open, NULL, NULL },
- { "BER", OPEN_INFO_HEURISTIC, ber_open, NULL, NULL },
+ { "Mpeg", OPEN_INFO_HEURISTIC, mpeg_open, "mpg;mp3", NULL, NULL },
+ { "DCT3 Trace", OPEN_INFO_HEURISTIC, dct3trace_open, "xml", NULL, NULL },
+ { "Daintree SNA", OPEN_INFO_HEURISTIC, daintree_sna_open, "dcf", NULL, NULL },
+ { "Stanag 4607", OPEN_INFO_HEURISTIC, stanag4607_open, NULL, NULL, NULL },
+ { "BER", OPEN_INFO_HEURISTIC, ber_open, NULL, NULL, NULL },
/* I put NetScreen *before* erf, because there were some
* false positives with my test-files (Sake Blok, July 2007)
*
@@ -346,28 +346,28 @@ static struct open_info open_info_base[] = {
* because there were some cases where files of those types were
* misidentified as vwr files (Guy Harris, December 2013)
*/
- { "Netscreen", OPEN_INFO_HEURISTIC, netscreen_open, "txt", NULL },
- { "ERF", OPEN_INFO_HEURISTIC, erf_open, "erf", NULL },
- { "IPfix", OPEN_INFO_HEURISTIC, ipfix_open, "pfx;ipfix",NULL },
- { "K12 Text", OPEN_INFO_HEURISTIC, k12text_open, "txt", NULL },
- { "Peek Classic", OPEN_INFO_HEURISTIC, peekclassic_open, "pkt;tpc;apc;wpz", NULL },
- { "PPP Dump", OPEN_INFO_HEURISTIC, pppdump_open, NULL, NULL },
- { "iSeries", OPEN_INFO_HEURISTIC, iseries_open, "txt", NULL },
- { "i4btrace", OPEN_INFO_HEURISTIC, i4btrace_open, NULL, NULL },
- { "Mp2t", OPEN_INFO_HEURISTIC, mp2t_open, "ts;mpg", NULL },
- { "Csids", OPEN_INFO_HEURISTIC, csids_open, NULL, NULL },
- { "VMS", OPEN_INFO_HEURISTIC, vms_open, "txt", NULL },
- { "Cosine", OPEN_INFO_HEURISTIC, cosine_open, "txt", NULL },
- { "Hcidump", OPEN_INFO_HEURISTIC, hcidump_open, NULL, NULL },
- { "Commview", OPEN_INFO_HEURISTIC, commview_open, "ncf", NULL },
- { "Nstrace", OPEN_INFO_HEURISTIC, nstrace_open, "txt", NULL },
- { "Logcat ", OPEN_INFO_HEURISTIC, logcat_open, "logcat", NULL },
+ { "Netscreen", OPEN_INFO_HEURISTIC, netscreen_open, "txt", NULL, NULL },
+ { "ERF", OPEN_INFO_HEURISTIC, erf_open, "erf", NULL, NULL },
+ { "IPfix", OPEN_INFO_HEURISTIC, ipfix_open, "pfx;ipfix",NULL, NULL },
+ { "K12 Text", OPEN_INFO_HEURISTIC, k12text_open, "txt", NULL, NULL },
+ { "Peek Classic", OPEN_INFO_HEURISTIC, peekclassic_open, "pkt;tpc;apc;wpz", NULL, NULL },
+ { "PPP Dump", OPEN_INFO_HEURISTIC, pppdump_open, NULL, NULL, NULL },
+ { "iSeries", OPEN_INFO_HEURISTIC, iseries_open, "txt", NULL, NULL },
+ { "i4btrace", OPEN_INFO_HEURISTIC, i4btrace_open, NULL, NULL, NULL },
+ { "Mp2t", OPEN_INFO_HEURISTIC, mp2t_open, "ts;mpg", NULL, NULL },
+ { "Csids", OPEN_INFO_HEURISTIC, csids_open, NULL, NULL, NULL },
+ { "VMS", OPEN_INFO_HEURISTIC, vms_open, "txt", NULL, NULL },
+ { "Cosine", OPEN_INFO_HEURISTIC, cosine_open, "txt", NULL, NULL },
+ { "Hcidump", OPEN_INFO_HEURISTIC, hcidump_open, NULL, NULL, NULL },
+ { "Commview", OPEN_INFO_HEURISTIC, commview_open, "ncf", NULL, NULL },
+ { "Nstrace", OPEN_INFO_HEURISTIC, nstrace_open, "txt", NULL, NULL },
+ { "Logcat ", OPEN_INFO_HEURISTIC, logcat_open, "logcat", NULL, NULL },
/* ASCII trace files from Telnet sessions. */
- { "Ascend", OPEN_INFO_HEURISTIC, ascend_open, "txt", NULL },
- { "Toshiba", OPEN_INFO_HEURISTIC, toshiba_open, "txt", NULL },
+ { "Ascend", OPEN_INFO_HEURISTIC, ascend_open, "txt", NULL, NULL },
+ { "Toshiba", OPEN_INFO_HEURISTIC, toshiba_open, "txt", NULL, NULL },
/* Extremely weak heuristics - put them at the end. */
- { "VWR", OPEN_INFO_HEURISTIC, vwr_open, "vwr", NULL },
- { "Camins", OPEN_INFO_HEURISTIC, camins_open, "camins", NULL },
+ { "VWR", OPEN_INFO_HEURISTIC, vwr_open, "vwr", NULL, NULL },
+ { "Camins", OPEN_INFO_HEURISTIC, camins_open, "camins", NULL, NULL },
};
/* this is only used to build the dynamic array on load, do NOT use this
@@ -401,14 +401,24 @@ static void set_heuristic_routine(void) {
}
void init_open_routines(void) {
+ unsigned int i;
+ struct open_info *i_open;
- if (open_info_arr) return;
+ if (open_info_arr)
+ return;
open_info_arr = g_array_new(TRUE,TRUE,sizeof(struct open_info));
g_array_append_vals(open_info_arr, open_info_base, N_OPEN_INFO_ROUTINES);
open_routines = (struct open_info *)(void*) open_info_arr->data;
+
+ /* Populate the extensions_set list now */
+ for (i = 0, i_open = open_routines; i < open_info_arr->len; i++, i_open++) {
+ if (i_open->extensions != NULL)
+ i_open->extensions_set = g_strsplit(i_open->extensions, ";", 0);
+ }
+
set_heuristic_routine();
}
@@ -417,7 +427,7 @@ void init_open_routines(void) {
* Also, it checks for an existing reader of the same name and errors if it finds one; if
* you want to handle that condition more gracefully, call wtap_has_open_info() first.
*/
-void wtap_register_open_info(const struct open_info *oi, const gboolean first_routine) {
+void wtap_register_open_info(struct open_info *oi, const gboolean first_routine) {
init_open_routines();
if (!oi || !oi->name) {
@@ -431,6 +441,9 @@ void wtap_register_open_info(const struct open_info *oi, const gboolean first_ro
return;
}
+ if (oi->extensions != NULL)
+ oi->extensions_set = g_strsplit(oi->extensions, ";", 0);
+
/* if it's magic and first, prepend it; if it's heuristic and not first,
append it; if it's anything else, stick it in the middle */
if (first_routine && oi->type == OPEN_INFO_MAGIC) {
@@ -451,7 +464,7 @@ void wtap_register_open_info(const struct open_info *oi, const gboolean first_ro
* that condition more gracefully, call wtap_has_open_info() first.
*/
void wtap_deregister_open_info(const gchar *name) {
- guint i;
+ guint i;
init_open_routines();
if (!name) {
@@ -460,11 +473,13 @@ void wtap_deregister_open_info(const gchar *name) {
}
for (i = 0; i < open_info_arr->len; i++) {
- if (open_routines[i].name && strcmp(open_routines[i].name, name) == 0) {
- open_info_arr = g_array_remove_index(open_info_arr, i);
- set_heuristic_routine();
- return;
- }
+ if (open_routines[i].name && strcmp(open_routines[i].name, name) == 0) {
+ if (open_routines[i].extensions_set != NULL)
+ g_strfreev(open_routines[i].extensions_set);
+ open_info_arr = g_array_remove_index(open_info_arr, i);
+ set_heuristic_routine();
+ return;
+ }
}
g_error("deregister_open_info: name not found");
@@ -473,7 +488,7 @@ void wtap_deregister_open_info(const gchar *name) {
/* Determines if a open routine short name already exists
*/
gboolean wtap_has_open_info(const gchar *name) {
- guint i;
+ guint i;
init_open_routines();
if (!name) {
@@ -482,13 +497,13 @@ gboolean wtap_has_open_info(const gchar *name) {
}
- for (i = 0; i < open_info_arr->len; i++) {
- if (open_routines[i].name && strcmp(open_routines[i].name, name) == 0) {
- return TRUE;
- }
- }
+ for (i = 0; i < open_info_arr->len; i++) {
+ if (open_routines[i].name && strcmp(open_routines[i].name, name) == 0) {
+ return TRUE;
+ }
+ }
- return FALSE;
+ return FALSE;
}
/*
@@ -517,7 +532,7 @@ gboolean wtap_has_open_info(const gchar *name) {
unsigned int open_info_name_to_type(const char *name)
{
unsigned int i;
- init_open_routines();
+ init_open_routines();
if (!name)
return WTAP_TYPE_AUTO;
@@ -625,14 +640,12 @@ static char *get_file_extension(const char *pathname)
return extensionp;
}
-/* TODO: this is called every time a file is checked for matching heuristic,
- * which means just clicking on a file in the open dialog may call this thing
- * twice... for *each* open_routine. That's silly, since this info never changes.
- * It would be better to create this list in the lookup array on initialization.
+/*
+ * Check if file extension is used in this heuristic
*/
static gboolean heuristic_uses_extension(unsigned int i, const char *extension)
{
- gchar **extensions_set, **extensionp;
+ gchar **extensionp;
/*
* Does this file type *have* any extensions?
@@ -641,21 +654,15 @@ static gboolean heuristic_uses_extension(unsigned int i, const char *extension)
return FALSE; /* no */
/*
- * Get a list of the extensions used by the specified file type.
- */
- extensions_set = g_strsplit(open_routines[i].extensions, ";", 0);
-
- /*
* Check each of them against the specified extension.
*/
- for (extensionp = extensions_set; *extensionp != NULL;
+ for (extensionp = open_routines[i].extensions_set; *extensionp != NULL;
extensionp++) {
if (strcmp(extension, *extensionp) == 0) {
- g_strfreev(extensions_set);
return TRUE; /* it's one of them */
}
}
- g_strfreev(extensions_set);
+
return FALSE; /* it's not one of them */
}
diff --git a/wiretap/wtap.h b/wiretap/wtap.h
index ea8c3d132e..6c99f73323 100644
--- a/wiretap/wtap.h
+++ b/wiretap/wtap.h
@@ -1258,6 +1258,7 @@ struct open_info {
int type;
wtap_open_routine_t open_routine;
const char *extensions;
+ gchar **extensions_set; /* populated using extensions member during initialization */
void* wslua_data; /* should be NULL for C-code file readers */
};
WS_DLL_PUBLIC struct open_info *open_routines;
@@ -1535,7 +1536,7 @@ WS_DLL_PUBLIC
void wtap_register_file_type_extension(const struct file_extension_info *ei);
WS_DLL_PUBLIC
-void wtap_register_open_info(const struct open_info *oi, const gboolean first_routine);
+void wtap_register_open_info(struct open_info *oi, const gboolean first_routine);
WS_DLL_PUBLIC
gboolean wtap_has_open_info(const gchar *name);
WS_DLL_PUBLIC