diff options
-rw-r--r-- | tests/test.test | 27 | ||||
-rw-r--r-- | toys/posix/test.c | 10 |
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]; |