From a8899ea71d8539d9032ed14e2342a95f3b33f42c Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Wed, 18 Jun 2025 13:39:02 +0000 Subject: Add mkdirp Signed-off-by: Laurent Bercot --- src/include/skalibs/posixplz.h | 1 + src/libposixplz/mkdirp.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 src/libposixplz/mkdirp.c (limited to 'src') 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 + +#include +#include + +#include +#include + +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 ; +} -- cgit v1.3.1