Added makepath function to support

This commit is contained in:
Matt Hill
2014-12-18 21:24:41 -05:00
parent 88a052cb1b
commit 3af631db23
2 changed files with 57 additions and 0 deletions

View File

@@ -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);
}
}