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 | |
| parent | 1cd52389792cb6ca9919112110e22565d5f46d6a (diff) | |
| download | skalibs-a8899ea71d8539d9032ed14e2342a95f3b33f42c.tar.gz | |
Add mkdirp
Signed-off-by: Laurent Bercot <ska@appnovation.com>
| -rw-r--r-- | package/deps.mak | 1 | ||||
| -rw-r--r-- | src/include/skalibs/posixplz.h | 1 | ||||
| -rw-r--r-- | src/libposixplz/mkdirp.c | 34 |
3 files changed, 36 insertions, 0 deletions
diff --git a/package/deps.mak b/package/deps.mak index a3b8641..d7c00e2 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -178,6 +178,7 @@ src/libposixplz/memmem.o src/libposixplz/memmem.lo: src/libposixplz/memmem.c src src/libposixplz/millisleep.o src/libposixplz/millisleep.lo: src/libposixplz/millisleep.c src/include/skalibs/posixplz.h src/libposixplz/mkbtemp.o src/libposixplz/mkbtemp.lo: src/libposixplz/mkbtemp.c src/include/skalibs/djbunix.h src/include/skalibs/posixplz.h src/libposixplz/mkctemp.o src/libposixplz/mkctemp.lo: src/libposixplz/mkctemp.c src/include/skalibs/djbunix.h src/include/skalibs/posixplz.h +src/libposixplz/mkdirp.o src/libposixplz/mkdirp.lo: src/libposixplz/mkdirp.c src/include/skalibs/bsdsnowflake.h src/include/skalibs/posixplz.h src/include/skalibs/stat.h src/libposixplz/mkfiletemp.o src/libposixplz/mkfiletemp.lo: src/libposixplz/mkfiletemp.c src/include/skalibs/posixplz.h src/include/skalibs/random.h src/libposixplz/mkhtemp.o src/libposixplz/mkhtemp.lo: src/libposixplz/mkhtemp.c src/include/skalibs/posixplz.h src/libposixplz/mklinktemp.o src/libposixplz/mklinktemp.lo: src/libposixplz/mklinktemp.c src/include/skalibs/djbunix.h src/libposixplz/posixplz-internal.h src/include/skalibs/posixplz.h diff --git a/src/include/skalibs/posixplz.h b/src/include/skalibs/posixplz.h index c7e8dd2..2f17f8a 100644 --- a/src/include/skalibs/posixplz.h +++ b/src/include/skalibs/posixplz.h @@ -41,6 +41,7 @@ extern pid_t fork_newpid (void) ; extern int touch (char const *) ; extern unsigned int millisleep (unsigned int) ; +extern int mkdirp (char *, mode_t) ; extern int mkfiletemp (char *, create_func_ref, mode_t, void *) ; extern int mklinktemp (char const *, char *, link_func_ref) ; extern int mkptemp (char *) ; 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 ; +} |
