diff --git a/include/folder.h b/include/folder.h index 34b4618bf..484eff168 100644 --- a/include/folder.h +++ b/include/folder.h @@ -37,5 +37,6 @@ int folder_config_init (hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const char void folder_config_destroy (hashcat_ctx_t *hashcat_ctx); int hc_mkdir (const char *name, MAYBE_UNUSED const int mode); +int hc_mkdir_rec (const char *path, MAYBE_UNUSED const int mode); #endif // _FOLDER_H diff --git a/src/folder.c b/src/folder.c index 018e63cec..61917687d 100644 --- a/src/folder.c +++ b/src/folder.c @@ -9,6 +9,7 @@ #include "event.h" #include "shared.h" #include "folder.h" +#include #if defined (__APPLE__) #include "event.h" @@ -394,8 +395,8 @@ int folder_config_init (hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const char *ins shared_dir = hcstrdup (shared_folder); - hc_mkdir (profile_dir, 0700); - hc_mkdir (cache_dir, 0700); + hc_mkdir_rec (profile_dir, 0700); + hc_mkdir_rec (cache_dir, 0700); hc_mkdir (session_dir, 0700); } else @@ -567,3 +568,28 @@ int hc_mkdir (const char *name, MAYBE_UNUSED const int mode) return mkdir (name, mode); #endif } + +int hc_mkdir_rec (const char *path, MAYBE_UNUSED const int mode) +{ + char *subpath, *fullpath; + + fullpath = hcstrdup (path); + subpath = dirname (fullpath); + if (strlen (subpath) > 1) + { + if (hc_mkdir_rec (subpath, mode) == -1) { + return -1; + }; + } + + if (hc_mkdir (path, mode) == -1) + { + if (errno != EEXIST) + { + return -1; + } + } + + hcfree (fullpath); + return 0; +}