aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/test.test27
-rw-r--r--toys/posix/test.c10
2 files changed, 31 insertions, 6 deletions
diff --git a/tests/test.test b/tests/test.test
index 7f574f08..1295be41 100644
--- a/tests/test.test
+++ b/tests/test.test
@@ -42,7 +42,32 @@ testing "! -e" 'type_test ! -e' "n" "" ""
rm f L s p
rmdir d
-# TODO: Test rwx gu t
+# test -rwx each bit position and failure
+touch walrus
+MASK=111
+for i in x w r k g u; do
+ [ $i == k ] && MASK=1000
+ # test everything off produces "off"
+ chmod 000 walrus
+ testcmd "-$i 0" "-$i walrus || echo yes" "yes\n" "" ""
+ chmod $((7777-$MASK)) walrus
+ testcmd "-$i inverted" "-$i walrus || echo yes" "yes\n" "" ""
+ MASK=$(($MASK<<1))
+done
+unset MASK
+# Test setuid setgid sticky enabled
+for i in uu+s gg+s k+t; do
+ chmod 000 walrus
+ chmod ${i:1}+s walrus
+ testcmd "-${i:0:1}" "-${i:0:1} walrus && echo yes" "yes\n" "" ""
+done
+# test each ugo+rwx bit position individually
+for i in 1 10 100; do for j in x w r; do
+ chmod $i walrus
+ testcmd "-$j $i" "-$j walrus && echo yes" "yes\n" "" ""
+ i=$((i<<1))
+done; done
+rm -f walrus
testcmd "" "'' || echo yes" "yes\n" "" ""
testcmd "" "a && echo yes" "yes\n" "" ""
diff --git a/toys/posix/test.c b/toys/posix/test.c
index cf6e1f50..d4bc1840 100644
--- a/toys/posix/test.c
+++ b/toys/posix/test.c
@@ -5,7 +5,7 @@
* See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html
USE_TEST(NEWTOY(test, 0, TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_NOHELP|TOYFLAG_MAYFORK))
-USE_TEST(OLDTOY([, test, TOYFLAG_NOFORK|TOYFLAG_NOHELP))
+USE_SH(OLDTOY([, test, TOYFLAG_NOFORK|TOYFLAG_NOHELP))
config TEST
bool "test"
@@ -20,7 +20,7 @@ config TEST
-b block device -f regular file -p fifo -u setuid bit
-c char device -g setgid -r read bit -w write bit
-d directory -h symlink -S socket -x execute bit
- -e exists -L symlink -s nonzero size
+ -e exists -L symlink -s nonzero size -k sticky bit
STRING is:
-n nonzero size -z zero size (STRING by itself implies -n)
FD (integer file descriptor) is:
@@ -66,16 +66,16 @@ int do_test(char **args, int *count)
if (*count>=2 && *s == '-' && s[1] && !s[2]) {
*count = 2;
c = s[1];
- if (-1 != (i = stridx("hLbcdefgpSusxwr", c))) {
+ if (-1 != (i = stridx("hLbcdefgkpSusxwr", c))) {
struct stat st;
// stat or lstat, then handle rwx and s
if (-1 == ((i<2) ? lstat : stat)(args[1], &st)) return 0;
- if (i>=12) return !!(st.st_mode&(0x111<<(i-12)));
+ if (i>=13) return !!(st.st_mode&(0111<<(i-13)));
if (c == 's') return !!st.st_size; // otherwise 1<<32 == 0
// handle file type checking and SUID/SGID
- if ((i = (unsigned short []){80,80,48,16,32,0,64,2,8,96,4}[i]<<9)>=4096)
+ if ((i = ((char []){80,80,48,16,32,0,64,2,1,8,96,4}[i])<<9)>=4096)
return (st.st_mode&S_IFMT) == i;
else return (st.st_mode & i) == i;
} else if (c == 'z') return !*args[1];