diff options
| -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 ; +} |
