diff options
| -rw-r--r-- | package/deps.mak | 3 | ||||
| -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 |
6 files changed, 50 insertions, 33 deletions
diff --git a/package/deps.mak b/package/deps.mak index d7c00e2..8628a5b 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -178,7 +178,8 @@ 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/mkdirp.o src/libposixplz/mkdirp.lo: src/libposixplz/mkdirp.c src/include/skalibs/posixplz.h +src/libposixplz/mkdirp2.o src/libposixplz/mkdirp2.lo: src/libposixplz/mkdirp2.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/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 ; } } } |
