diff options
Diffstat (limited to 'wiretap')
-rw-r--r-- | wiretap/file_access.c | 59 |
1 files changed, 56 insertions, 3 deletions
diff --git a/wiretap/file_access.c b/wiretap/file_access.c index 898f17e078..408d648eb4 100644 --- a/wiretap/file_access.c +++ b/wiretap/file_access.c @@ -973,10 +973,18 @@ wtap_open_offline(const char *filename, unsigned int type, int *err, char **err_ } } - /* Now try the ones that don't use it. */ + /* + * Now try the heuristic types that have no extensions + * to check; we try those before the ones that have + * extensions that *don't* match this file's extension, + * on the theory that files of those types generally + * have one of the type's extensions, and, as this file + * *doesn't* have one of those extensions, it's probably + * *not* one of those files. + */ for (i = heuristic_open_routine_idx; i < open_info_arr->len; i++) { - /* Does this type use that extension? */ - if (!heuristic_uses_extension(i, extension)) { + /* Does this type have any extensions? */ + if (open_routines[i].extensions == NULL) { /* No. */ if (file_seek(wth->fh, 0, SEEK_SET, err) == -1) { /* Error - give up */ @@ -1010,6 +1018,51 @@ wtap_open_offline(const char *filename, unsigned int type, int *err, char **err_ } } } + + /* + * Now try the ones that have extensions where none of + * them matches this file's extensions. + */ + for (i = heuristic_open_routine_idx; i < open_info_arr->len; i++) { + /* + * Does this type have extensions and is this file's + * extension one of them? + */ + if (open_routines[i].extensions != NULL && + !heuristic_uses_extension(i, extension)) { + /* Yes and no. */ + if (file_seek(wth->fh, 0, SEEK_SET, err) == -1) { + /* Error - give up */ + g_free(extension); + wtap_close(wth); + return NULL; + } + + /* Set wth with wslua data if any - this is how we pass the data + * to the file reader, kind of like priv but not free'd later. + */ + wth->wslua_data = open_routines[i].wslua_data; + + switch ((*open_routines[i].open_routine)(wth, + err, err_info)) { + + case WTAP_OPEN_ERROR: + /* Error - give up */ + g_free(extension); + wtap_close(wth); + return NULL; + + case WTAP_OPEN_NOT_MINE: + /* No error, but not that type of file */ + break; + + case WTAP_OPEN_MINE: + /* We found the file type */ + g_free(extension); + goto success; + } + } + } g_free(extension); } else { /* No - try all the heuristics types in order. */ |