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 | |
| parent | a8899ea71d8539d9032ed14e2342a95f3b33f42c (diff) | |
| download | skalibs-d4895d80b1b1af9086b08f7c6cb12f274baf2ddc.tar.gz | |
Rework gol, add mkdirp2
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/include/skalibs/gol.h | 8 | ||||
| -rw-r--r-- | src/include/skalibs/posixplz.h | 3 | ||||
| -rw-r--r-- | src/libposixplz/mkdirp.c | 29 | ||||
| -rw-r--r-- | src/libposixplz/mkdirp2.c | 34 | ||||
| -rw-r--r-- | src/libstddjb/gol.c | 6 |
5 files changed, 48 insertions, 32 deletions
diff --git a/src/include/skalibs/gol.h b/src/include/skalibs/gol.h index ab687b2..0c42a35 100644 --- a/src/include/skalibs/gol.h +++ b/src/include/skalibs/gol.h @@ -12,10 +12,10 @@ typedef struct gol_bool_s gol_bool, *gol_bool_ref ; struct gol_bool_s { - uint64_t mask ; + uint64_t set ; + uint64_t clear ; char const *lo ; - uint8_t so : 7 ; - uint8_t set : 1 ; + uint8_t so ; } ; typedef struct gol_arg_s gol_arg, *gol_arg_ref ; @@ -23,7 +23,7 @@ struct gol_arg_s { char const *lo ; unsigned int i ; - uint8_t so : 7 ; + uint8_t so ; } ; extern int gol (char const *const *, gol_bool const *, unsigned int, gol_arg const *a, unsigned int, uint64_t *, char const **, int *) ; diff --git a/src/include/skalibs/posixplz.h b/src/include/skalibs/posixplz.h index 2f17f8a..558ccae 100644 --- a/src/include/skalibs/posixplz.h +++ b/src/include/skalibs/posixplz.h @@ -41,7 +41,8 @@ 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 mkdirp (char const *, mode_t) ; +extern int mkdirp2 (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 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 ; +} diff --git a/src/libstddjb/gol.c b/src/libstddjb/gol.c index 990cd73..93ebe79 100644 --- a/src/libstddjb/gol.c +++ b/src/libstddjb/gol.c @@ -28,7 +28,8 @@ int gol (char const *const *argv, gol_bool const *b, unsigned int bn, gol_arg co { for (; j < bn ; j++) if (!strcmp(argv[i] + 2, b[j].lo)) break ; if (j >= bn) return (*problem = -1, -1-i) ; - if (b[j].set) *br |= b[j].mask ; else *br &= ~b[j].mask ; + *br &= ~b[j].clear ; + *br |= b[j].set ; } } else @@ -46,7 +47,8 @@ int gol (char const *const *argv, gol_bool const *b, unsigned int bn, gol_arg co } for (j = 0 ; j < bn ; j++) if (*p == b[j].so) break ; if (j >= bn) return (*problem = p - argv[i], -1-i) ; - if (b[j].set) *br |= b[j].mask ; else *br &= ~b[j].mask ; + *br &= ~b[j].clear ; + *br |= b[j].set ; } } } |
