searchFile: use filenamemcopy

This commit is contained in:
Philippe Teuwen 2019-08-23 21:49:58 +02:00
parent e0cdb5d7a7
commit 31e430744b
2 changed files with 23 additions and 24 deletions

View file

@ -662,64 +662,63 @@ int searchAndList(const char *pm3dir, const char *ext) {
return PM3_SUCCESS; return PM3_SUCCESS;
} }
char *searchFile(const char *pm3dir, const char *ext, const char *filename) { char *searchFile(const char *pm3dir, const char *suffix, const char *preferredName) {
const char *suffix = ""; char *filename = filenamemcopy(preferredName, suffix);
if (!str_endswith(filename, ext)) { if (filename == NULL) return NULL;
suffix = ext;
}
// explicit absolute (/) or relative path (./) => try only to match it directly // explicit absolute (/) or relative path (./) => try only to match it directly
if (((strlen(filename) > 1) && (filename[0] == '/')) || if (((strlen(filename) > 1) && (filename[0] == '/')) ||
((strlen(filename) > 2) && (filename[0] == '.') && (filename[1] == '/'))) ((strlen(filename) > 2) && (filename[0] == '.') && (filename[1] == '/')))
{ {
char *path = malloc(strlen(filename) + strlen(suffix) + 1); if (fileExists(filename))
strcpy(path, filename); return filename;
strcat(path, suffix);
if (fileExists(path))
return path;
else else
free(path); free(filename);
return NULL; return NULL;
} }
// else // else
// try pm3 dirs in current workdir (dev mode) // try pm3 dirs in current workdir (dev mode)
const char *exec_path = get_my_executable_directory(); const char *exec_path = get_my_executable_directory();
if (exec_path != NULL) { if (exec_path != NULL) {
char *path = malloc(strlen(exec_path) + strlen(pm3dir) + strlen(filename) + strlen(suffix) + 1); char *path = malloc(strlen(exec_path) + strlen(pm3dir) + strlen(filename) + 1);
strcpy(path, exec_path); strcpy(path, exec_path);
strcat(path, pm3dir); strcat(path, pm3dir);
strcat(path, filename); strcat(path, filename);
strcat(path, suffix); if (fileExists(path)) {
if (fileExists(path)) free(filename);
return path; return path;
else } else {
free(path); free(path);
}
} }
// try pm3 dirs in user .proxmark3 (user mode) // try pm3 dirs in user .proxmark3 (user mode)
char *user_path = getenv("HOME"); char *user_path = getenv("HOME");
if (user_path != NULL) { if (user_path != NULL) {
char *path = malloc(strlen(user_path) + strlen(PM3_USER_DIRECTORY) + strlen(pm3dir) + strlen(filename) + strlen(suffix) + 1); char *path = malloc(strlen(user_path) + strlen(PM3_USER_DIRECTORY) + strlen(pm3dir) + strlen(filename) + 1);
strcpy(path, user_path); strcpy(path, user_path);
strcat(path, PM3_USER_DIRECTORY); strcat(path, PM3_USER_DIRECTORY);
strcat(path, pm3dir); strcat(path, pm3dir);
strcat(path, filename); strcat(path, filename);
strcat(path, suffix); if (fileExists(path)) {
if (fileExists(path)) free(filename);
return path; return path;
else } else {
free(path); free(path);
}
} }
// try pm3 dirs in pm3 installation dir (install mode) // try pm3 dirs in pm3 installation dir (install mode)
{ {
char *path = malloc(strlen(PM3_SHARE_PATH) + strlen(pm3dir) + strlen(filename) + strlen(suffix) + 1); char *path = malloc(strlen(PM3_SHARE_PATH) + strlen(pm3dir) + strlen(filename) + 1);
strcpy(path, PM3_SHARE_PATH); strcpy(path, PM3_SHARE_PATH);
strcat(path, pm3dir); strcat(path, pm3dir);
strcat(path, filename); strcat(path, filename);
strcat(path, suffix); if (fileExists(path)) {
if (fileExists(path)) free(filename);
return path; return path;
else } else {
free(path); free(path);
}
} }
free(filename);
return NULL; return NULL;
} }

View file

@ -161,6 +161,6 @@ int loadFileDICTIONARY(const char *preferredName, void *data, size_t *datalen, u
int convertOldMfuDump(uint8_t **dump, size_t *dumplen); int convertOldMfuDump(uint8_t **dump, size_t *dumplen);
int searchAndList(const char *pm3dir, const char *ext); int searchAndList(const char *pm3dir, const char *ext);
char *searchFile(const char *pm3dir, const char *ext, const char *filename); char *searchFile(const char *pm3dir, const char *suffix, const char *preferredName);
#endif // FILEUTILS_H #endif // FILEUTILS_H