diff options
author | Karel Zak <kzak@redhat.com> | 2014-06-09 10:59:18 +0200 |
---|---|---|
committer | Karel Zak <kzak@redhat.com> | 2014-06-09 10:59:18 +0200 |
commit | 934530c7e831e6265142df14e08246dcb4952872 (patch) | |
tree | 95735583f191722e34a07f5ae783e8f8c02acb18 /lib/fileutils.c | |
parent | ce6d69ddac954475a40510286946b4bf1d2bb976 (diff) | |
download | util-linux-934530c7e831e6265142df14e08246dcb4952872.tar.gz |
lib/fileutils: add mkdir_p() from libmount
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; +} |