diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-06-18 13:39:02 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska@appnovation.com> | 2025-06-18 13:39:02 +0000 |
| commit | a8899ea71d8539d9032ed14e2342a95f3b33f42c (patch) | |
| tree | f57e8ad683cf089af838bc2cf15d7c281b2972d5 /src/libposixplz | |
| parent | 1cd52389792cb6ca9919112110e22565d5f46d6a (diff) | |
| download | skalibs-a8899ea71d8539d9032ed14e2342a95f3b33f42c.tar.gz | |
Add mkdirp
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/libposixplz')
| -rw-r--r-- | src/libposixplz/mkdirp.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/libposixplz/mkdirp.c b/src/libposixplz/mkdirp.c new file mode 100644 index 0000000..921d8e3 --- /dev/null +++ b/src/libposixplz/mkdirp.c @@ -0,0 +1,34 @@ +/* ISC license. */ + +#include <skalibs/bsdsnowflake.h> + +#include <string.h> +#include <errno.h> + +#include <skalibs/stat.h> +#include <skalibs/posixplz.h> + +static int domkdir (char const *s, mode_t mode) +{ + return !mkdir(s, mode) || errno == EEXIST ; +} + +int mkdirp (char *s, mode_t mode) +{ + mode_t m = umask(0) ; + size_t len = strlen(s) ; + size_t i = 2 ; + for (; i < len ; i++) if (s[i] == '/') + { + s[i] = 0 ; + if (!domkdir(s, 02755)) goto err ; + s[i] = '/' ; + } + if (!domkdir(s, mode)) goto err ; + umask(m) ; + return 0 ; + + err: + umask(m) ; + return -1 ; +} |
