diff options
Diffstat (limited to 'lib/fileutils.c')
-rw-r--r-- | lib/fileutils.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/fileutils.c b/lib/fileutils.c index 92b474cef..3d4553179 100644 --- a/lib/fileutils.c +++ b/lib/fileutils.c @@ -81,3 +81,39 @@ int main(void) return EXIT_FAILURE; } #endif + + +int mkdir_p(const char *path, mode_t mode) +{ + char *p, *dir; + int rc = 0; + + if (!path || !*path) + return -EINVAL; + + dir = p = strdup(path); + if (!dir) + return -ENOMEM; + + if (*p == '/') + p++; + + while (p && *p) { + char *e = strchr(p, '/'); + if (e) + *e = '\0'; + if (*p) { + rc = mkdir(dir, mode); + if (rc && errno != EEXIST) + break; + rc = 0; + } + if (!e) + break; + *e = '/'; + p = e + 1; + } + + free(dir); + return rc; +} |