diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-06-30 14:40:55 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska@appnovation.com> | 2025-06-30 14:40:55 +0000 |
| commit | d4895d80b1b1af9086b08f7c6cb12f274baf2ddc (patch) | |
| tree | c72e654017464cb32bdf5ab6f2fca9876e935d3b /src/libposixplz | |
| parent | a8899ea71d8539d9032ed14e2342a95f3b33f42c (diff) | |
| download | skalibs-d4895d80b1b1af9086b08f7c6cb12f274baf2ddc.tar.gz | |
Rework gol, add mkdirp2
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/libposixplz')
| -rw-r--r-- | src/libposixplz/mkdirp.c | 29 | ||||
| -rw-r--r-- | src/libposixplz/mkdirp2.c | 34 |
2 files changed, 38 insertions, 25 deletions
diff --git a/src/libposixplz/mkdirp.c b/src/libposixplz/mkdirp.c index 921d8e3..bdec66d 100644 --- a/src/libposixplz/mkdirp.c +++ b/src/libposixplz/mkdirp.c @@ -1,34 +1,13 @@ /* 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) +int mkdirp (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 ; + char tmp[len+1] ; + memcpy(tmp, s, len+1) ; + return mkdirp2(tmp, mode) ; } diff --git a/src/libposixplz/mkdirp2.c b/src/libposixplz/mkdirp2.c new file mode 100644 index 0000000..ca81da5 --- /dev/null +++ b/src/libposixplz/mkdirp2.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 mkdirp2 (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 ; +} |
