aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpetershh <petershh@disroot.org>2022-08-03 00:02:08 +0300
committerPeter <santurysim@gmail.com>2022-08-03 00:37:07 +0300
commit3482b63c7ecc76ef0e3409c013f9464f15d1b279 (patch)
treec39550e482c4b2c5e42362b8ce9d3203cad37185
parent83fe4566cdc49db506a0b84a0f1df01b03a14979 (diff)
downloadshh-portable-utils-3482b63c7ecc76ef0e3409c013f9464f15d1b279.tar.xz
chmod: do not pass genalloc to functions when not needed
-rw-r--r--src/shh-portable-utils/change_mode.c29
-rw-r--r--src/shh-portable-utils/chmod.c35
-rw-r--r--src/shh-portable-utils/parse_mode_symbolic.c2
-rw-r--r--src/shh-portable-utils/shhfuncs.h2
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);