diff options
author | petershh <petershh@disroot.org> | 2022-08-03 00:02:08 +0300 |
---|---|---|
committer | Peter <santurysim@gmail.com> | 2022-08-03 00:37:07 +0300 |
commit | 3482b63c7ecc76ef0e3409c013f9464f15d1b279 (patch) | |
tree | c39550e482c4b2c5e42362b8ce9d3203cad37185 | |
parent | 83fe4566cdc49db506a0b84a0f1df01b03a14979 (diff) | |
download | shh-portable-utils-3482b63c7ecc76ef0e3409c013f9464f15d1b279.tar.xz |
chmod: do not pass genalloc to functions when not needed
-rw-r--r-- | src/shh-portable-utils/change_mode.c | 29 | ||||
-rw-r--r-- | src/shh-portable-utils/chmod.c | 35 | ||||
-rw-r--r-- | src/shh-portable-utils/parse_mode_symbolic.c | 2 | ||||
-rw-r--r-- | src/shh-portable-utils/shhfuncs.h | 2 |
4 files changed, 37 insertions, 31 deletions
diff --git a/src/shh-portable-utils/change_mode.c b/src/shh-portable-utils/change_mode.c index a2ad934..cc919c4 100644 --- a/src/shh-portable-utils/change_mode.c +++ b/src/shh-portable-utils/change_mode.c @@ -1,6 +1,5 @@ #include <sys/stat.h> -#include <skalibs/genalloc.h> #include <skalibs/strerr2.h> #include "shhfuncs.h" @@ -10,26 +9,25 @@ * implementation (https://core.suckless.org/sbase), so let's credit them here. */ -mode_t change_mode(mode_t initial_mode, genalloc *directives, mode_t mask) +mode_t change_mode(mode_t initial_mode, chmod_directive *directives, + size_t directives_len, mode_t mask) { mode_t cur_mode, who, perm, clear; - chmod_directive const *s = genalloc_s(chmod_directive, directives); - size_t len = genalloc_len(chmod_directive, directives); cur_mode = initial_mode; - for (size_t i = 0; i < len; i++) { - if (s[i].who) { - who = s[i].who; - clear = s[i].who; + for (size_t i = 0; i < directives_len; i++) { + if (directives[i].who) { + who = directives[i].who; + clear = directives[i].who; } else { who = ~mask; clear = S_ISALL; } - perm = s[i].perm; + perm = directives[i].perm; - if (s[i].permcopy & 1) { + if (directives[i].permcopy & 1) { if (cur_mode & S_IRUSR) perm |= S_IRUSR | S_IRGRP | S_IROTH; if (cur_mode & S_IWUSR) @@ -37,7 +35,7 @@ mode_t change_mode(mode_t initial_mode, genalloc *directives, mode_t mask) if (cur_mode & S_IXUSR) perm |= S_IXUSR | S_IXGRP | S_IXOTH; } - if (s[i].permcopy & 2) { + if (directives[i].permcopy & 2) { if (cur_mode & S_IRGRP) perm |= S_IRUSR | S_IRGRP | S_IROTH; if (cur_mode & S_IWGRP) @@ -45,7 +43,7 @@ mode_t change_mode(mode_t initial_mode, genalloc *directives, mode_t mask) if (cur_mode & S_IXGRP) perm |= S_IXUSR | S_IXGRP | S_IXOTH; } - if (s[i].permcopy & 4) { + if (directives[i].permcopy & 4) { if (cur_mode & S_IROTH) perm |= S_IRUSR | S_IRGRP | S_IROTH; if (cur_mode & S_IWOTH) @@ -54,11 +52,12 @@ mode_t change_mode(mode_t initial_mode, genalloc *directives, mode_t mask) perm |= S_IXUSR | S_IXGRP | S_IXOTH; } - if (s[i].dir_x && (S_ISDIR(cur_mode) - || (cur_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))) + if (directives[i].dir_x && (S_ISDIR(cur_mode) + || (cur_mode + & (S_IXUSR | S_IXGRP | S_IXOTH)))) perm |= S_IXUSR | S_IXGRP | S_IXOTH; - switch (s[i].action) { + switch (directives[i].action) { case '=': cur_mode &= ~clear; case '+': diff --git a/src/shh-portable-utils/chmod.c b/src/shh-portable-utils/chmod.c index 48a2305..acf58e3 100644 --- a/src/shh-portable-utils/chmod.c +++ b/src/shh-portable-utils/chmod.c @@ -1,3 +1,4 @@ +#include <errno.h> #include <string.h> #include <fcntl.h> @@ -16,9 +17,9 @@ #define USAGE "chmod [-R] mode file..." -int traverse_dir(stralloc*, mode_t, genalloc*, mode_t); +int traverse_dir(stralloc*, mode_t, chmod_directive*, size_t, mode_t); -int doit(char const*, mode_t, mode_t, genalloc*, mode_t); +int doit(char const*, mode_t, mode_t, chmod_directive*, size_t, mode_t); int main(int argc, char const *const *argv) { @@ -27,6 +28,8 @@ int main(int argc, char const *const *argv) mode_t mode = 0; int recurse = 0; int failure = 0; + chmod_directive *d; + size_t len; stralloc s = STRALLOC_ZERO; genalloc directives = GENALLOC_ZERO; subgetopt l = SUBGETOPT_ZERO; @@ -60,12 +63,15 @@ int main(int argc, char const *const *argv) if (errno == EINVAL) strerr_diefu2sys(100, "invalid mode: ", argv[0]); else - strerr_diefu1sys(111, "parse mode") + strerr_diefu1sys(111, "parse mode"); } if (!genalloc_len(chmod_directive, &directives)) strerr_dieusage(100, USAGE); } + d = genalloc_s(chmod_directive, &directives); + len = genalloc_len(chmod_directive, &directives); + for (char const *const *filename = argv + 1; *filename; filename++) { if (stat(*filename, &st)) { strerr_warnwu2sys("stat ", *filename); @@ -88,11 +94,10 @@ int main(int argc, char const *const *argv) s.s[s.len - 2] = '\0'; s.len--; } - failure = failure || traverse_dir(&s, mode, &directives, - mask); + failure = failure || traverse_dir(&s, mode, d, len, mask); } else { - failure = failure || doit(*filename, st.st_mode, mode, &directives, + failure = failure || doit(*filename, st.st_mode, mode, d, len, mask); } } @@ -100,13 +105,13 @@ int main(int argc, char const *const *argv) } int doit(char const *file, mode_t st_mode, mode_t mode, - genalloc *directives, mode_t mask) + chmod_directive *directives, size_t directives_len, mode_t mask) { mode_t target_mode; - if (!genalloc_len(chmod_directive, directives)) + if (!directives_len) target_mode = mode; else - target_mode = change_mode(st_mode, directives, mask); + target_mode = change_mode(st_mode, directives, directives_len, mask); if (chmod(file, target_mode) == -1) { strerr_warnwu2sys("change mode of ", file); return 1; @@ -114,8 +119,8 @@ int doit(char const *file, mode_t st_mode, mode_t mode, return 0; } -int traverse_dir(stralloc *dirname, mode_t mode, genalloc *directives, - mode_t mask) +int traverse_dir(stralloc *dirname, mode_t mode, chmod_directive *directives, + size_t directives_len, mode_t mask) { int failure = 0; size_t filename_len; @@ -140,15 +145,17 @@ int traverse_dir(stralloc *dirname, mode_t mode, genalloc *directives, strerr_warnwu2sys("stat ", dirname->s); failure = 1; } else if (S_ISDIR(st.st_mode)) - failure = failure || traverse_dir(dirname, mode, directives, mask); + failure = failure || traverse_dir(dirname, mode, directives, + directives_len, mask); else { failure = failure || doit(dirname->s, st.st_mode, mode, directives, - mask); + directives_len, mask); } dirname->len -= filename_len + 1; dirname->s[dirname->len - 1] = '\0'; } - failure = failure || doit(dirname->s, st.st_mode, mode, directives, mask); + failure = failure || doit(dirname->s, st.st_mode, mode, directives, + directives_len, mask); closedir(dir); return failure; } diff --git a/src/shh-portable-utils/parse_mode_symbolic.c b/src/shh-portable-utils/parse_mode_symbolic.c index 96cb94a..c5a5a5c 100644 --- a/src/shh-portable-utils/parse_mode_symbolic.c +++ b/src/shh-portable-utils/parse_mode_symbolic.c @@ -91,7 +91,7 @@ int parse_mode_symbolic(char const *raw, genalloc *directives) else if (*p == '\0') return 0; else { - errno = EIVAL; + errno = EINVAL; return -1; } diff --git a/src/shh-portable-utils/shhfuncs.h b/src/shh-portable-utils/shhfuncs.h index 263e41f..9cc21dd 100644 --- a/src/shh-portable-utils/shhfuncs.h +++ b/src/shh-portable-utils/shhfuncs.h @@ -20,7 +20,7 @@ typedef struct chmod_directive_s chmod_directive; int parse_mode_octal(char const*, mode_t*); int parse_mode_symbolic(char const*, genalloc*); -mode_t change_mode(mode_t, genalloc*, mode_t); +mode_t change_mode(mode_t, chmod_directive*, size_t, mode_t); size_t byte_notin(char const *s, size_t n, char const *sep, size_t len); |