diff --git a/src/openalpr/support/filesystem.cpp b/src/openalpr/support/filesystem.cpp index 593f7fe..fc64c2f 100644 --- a/src/openalpr/support/filesystem.cpp +++ b/src/openalpr/support/filesystem.cpp @@ -141,4 +141,58 @@ namespace alpr return filename.substr(0, lastindex); } + + static int makeDir(const char *path, mode_t mode) + { + struct stat st; + int status = 0; + + if (stat(path, &st) != 0) + { + /* Directory does not exist. EEXIST for race condition */ + if (mkdir(path, mode) != 0 && errno != EEXIST) + status = -1; + } + else if (!S_ISDIR(st.st_mode)) + { + errno = ENOTDIR; + status = -1; + } + + return(status); + } + + /** + ** makePath - ensure all directories in path exist + ** Algorithm takes the pessimistic view and works top-down to ensure + ** each directory in path exists, rather than optimistically creating + ** the last element and working backwards. + */ + bool makePath(const char* path, mode_t mode) + { + + char *pp; + char *sp; + int status; + char *copypath = strdup(path); + + status = 0; + pp = copypath; + while (status == 0 && (sp = strchr(pp, '/')) != 0) + { + if (sp != pp) + { + /* Neither root nor double slash in path */ + *sp = '\0'; + status = makeDir(copypath, mode); + *sp = '/'; + } + pp = sp + 1; + } + if (status == 0) + status = makeDir(path, mode); + free(copypath); + return (status); + + } } \ No newline at end of file diff --git a/src/openalpr/support/filesystem.h b/src/openalpr/support/filesystem.h index 0aaaac3..1916f4d 100644 --- a/src/openalpr/support/filesystem.h +++ b/src/openalpr/support/filesystem.h @@ -11,12 +11,14 @@ #include #endif +#include #include #include #include #include #include #include +#include namespace alpr { @@ -36,6 +38,7 @@ namespace alpr bool stringCompare( const std::string &left, const std::string &right ); + bool makePath(const char* path, mode_t mode); } #endif // FILESYSTEM_H