diff options
-rwxr-xr-x | tests/chattr.test | 155 | ||||
-rw-r--r-- | toys/other/lsattr.c | 1 |
2 files changed, 40 insertions, 116 deletions
diff --git a/tests/chattr.test b/tests/chattr.test index d7dec0bc..cefc84b9 100755 --- a/tests/chattr.test +++ b/tests/chattr.test @@ -28,131 +28,56 @@ _t="abcdefghijklmnopqrstuvwxyz" _empty="--------------------" -# 'i' -- immutable +# Check +i (immutable) works by trying to write to and remove the file. _i="----i---------------" -testing "[-/+]i FILE[write]" "$IN && touch testFile && +testing "immutable" "$IN && echo "$_t" > testFile && chattr +i testFile && lsattr testFile | clean && - date > testFile 2>/dev/null; chattr -i testFile; - rm -rf testFile; $OUT " "$_i testFile\n" "" "" -testing "[-/+]i FILE[re-write]" "$IN && touch testFile && - chattr +i testFile && date > testFile 2>/dev/null || - chattr -i testFile && date > testFile 2>/dev/null && - lsattr testFile | clean; rm -rf testFile 2>/dev/null; $OUT" \ - "$_empty testFile\n" "" "" -testing "[-/+]i FILE[append]" "$IN && date > testFile && - chattr +i testFile && date >> testFile 2>/dev/null || - lsattr testFile | clean && chattr -i testFile; rm -rf testFile; $OUT" \ - "$_i testFile\n" "" "" -testing "[-/+]i FILE[move]" "$IN && date > testFile && - chattr +i testFile && mv testFile testFile1 2>/dev/null || - lsattr testFile | clean && chattr -i testFile; rm -rf testFile; $OUT" \ - "$_i testFile\n" "" "" -testing "[-/+]i FILE[delete]" "$IN && touch testFile && chattr +i testFile && - rm -f testFile 2>/dev/null || lsattr testFile | clean && - chattr -i testFile; rm -rf testFile; $OUT" "$_i testFile\n" "" "" -testing "[-/+]i FILE[read]" "$IN && echo "$_t" > testFile && - chattr +i testFile && cat testFile && lsattr testFile | clean && - chattr -i testFile; rm -rf testFile; $OUT" "$_t\n$_i testFile\n" "" "" + date > testFile 2>/dev/null; rm testFile; chattr -i testFile; + cat testFile; rm -rf testFile; $OUT " "$_i testFile\n$_t\n" "" "" -# 'a' --- append-only +# Check +a (append-only) works by failing to write and succeeding in appending. _a="-----a--------------" -testing "[-/+]a FILE[write]" "$IN && echo "$_t" > testFile && - chattr +a testFile && echo $_t > testFile || lsattr testFile | clean && - chattr -a testFile; rm -rf testFile; $OUT" "$_a testFile\n" "" "" -testing "[-/+]a FILE[re-write]" "$IN && echo "$_t" > testFile && - chattr +a testFile && echo $_t > testFile || lsattr testFile | clean && - chattr -a testFile && echo $_t > testFile && cat testFile && - lsattr testFile | clean; rm -rf testFile; - $OUT" "$_a testFile\n$_t\n$_empty testFile\n" "" "" -testing "[-/+]a FILE[append]" "$IN && echo "$_t" > testFile && - chattr +a testFile && echo $_t >> testFile && cat testFile && - lsattr testFile | clean && chattr -a testFile; rm -rf testFile; $OUT" \ - "$_t\n$_t\n$_a testFile\n" "" "" -testing "[-/+]a FILE[move]" "$IN && echo "$_t" > testFile && - chattr +a testFile && mv testFile testFile1 || - lsattr testFile | clean && chattr -a testFile; rm -rf testFile; $OUT" \ - "$_a testFile\n" "" "" -testing "[-/+]a FILE[delete]" "$IN && echo "$_t" > testFile && - chattr +a testFile && rm -f testFile || lsattr testFile | clean && - chattr -a testFile; rm -rf testFile; $OUT" "$_a testFile\n" "" "" -testing "[-/+]a FILE[read]" "$IN && echo "$_t" > testFile && - chattr +a testFile && cat testFile && lsattr testFile | clean && - chattr -a testFile; rm -rf testFile; $OUT" "$_t\n$_a testFile\n" "" "" +testing "append-only" "$IN && echo "$_t" > testFile && + chattr +a testFile && + echo $_t >> testFile && + date > testFile || lsattr testFile | clean && + chattr -a testFile; cat testFile; rm -rf testFile; $OUT" \ + "$_a testFile\n$_t\n$_t\n" "" "" -for attr in "A" "a" "c" "D" "d" "i" "j" "s" "S" "t" "T" "u" -do - testing "[-/+]$attr FILE" "$IN && echo "$_t" > testFile && - chattr +$attr testFile && cat testFile && chattr -$attr testFile && - lsattr testFile | clean; rm -rf testFile; $OUT" "$_t\n$_empty testFile\n" "" "" +# For the rest, just toggle the bits back and forth (where supported). +# Note that some file system/kernel combinations do return success but +# silently ignore your request: +T on 4.19 f2fs, or +F on 5.2i ext4, +# for example, so we're deliberately a bit selective here. +for attr in "A" "c" "d" "e" "j" "P" "S" "s" "t" "u"; do + echo "$_t" > testFile && chattr +$attr testFile 2>/dev/null || SKIPNEXT=1 + # Check that $attr is in the lsattr output, then that - turns it back off. + testing "toggle $attr" "lsattr testFile | awk '{print \$1}' > attrs; + grep -q $attr attrs || cat attrs; cat testFile && chattr -$attr testFile && + lsattr testFile | clean; rm -rf testFile" "$_t\n$_empty testFile\n" "" "" done -for attr in "A" "a" "c" "D" "d" "i" "j" "s" "S" "t" "T" "u" -do - testing "-$attr FILE" "$IN && echo "$_t" > testFile && chattr -$attr testFile && - cat testFile && lsattr testFile | clean; rm -rf testFile; $OUT" "$_t\n$_empty testFile\n" "" "" -done +_aA="-----a-A------------" +testing "multiple bits" "$IN && touch testFile && + chattr +Aa testFile && lsattr testFile | clean && + chattr -Aa testFile && lsattr testFile | clean; + rm -rf testFile; $OUT" "$_aA testFile\n$_empty testFile\n" "" "" -testing "[-/+]AacDdijsStTu FILE" "$IN && echo "$_t" > testFile && - chattr +AacDdijsStTu testFile && cat testFile && chattr -AacDdijsStTu testFile && - lsattr testFile | clean; rm -rf testFile; $OUT" "$_t\n$_empty testFile\n" "" "" -testing "[-/+]AacDdijsStTu(random) FILE" \ - "$IN && echo "$_t" > testFile && - chattr +AacDdijsStTu testFile && cat testFile && chattr -A testFile && - chattr -a testFile && chattr -c testFile && chattr -D testFile && - chattr -d testFile && chattr -i testFile && chattr -j testFile && - chattr -s testFile && chattr -S testFile && chattr -t testFile && - chattr -T testFile && chattr -u testFile && lsattr testFile | clean && - chattr -AacDdijsStTu testFile; rm -rf testFile; $OUT" \ - "$_t\n$_empty testFile\n" "" "" -testing "[-/+]AacDdijsStTu FILE*" "$IN && - echo "$_t" > testFile && echo "$_t" > testFile1 && - echo "$_t" > testFile2 && echo "$_t" > testFile3 && - echo "$_t" > testFile4 && echo "$_t" > testFile5 && - echo "$_t" > testFile6 && echo "$_t" > testFile7 && - echo "$_t" > testFile8 && echo "$_t" > testFile9 && - echo "$_t" > testFile10 && echo "$_t" > testFile11 && - chattr +AacDdijsStTu testFile* && - cat testFile9 && chattr -AacDdijsStTu testFile* && - lsattr testFile* | clean; rm -rf testFile*; $OUT" \ - "$_t\n$_empty testFile\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n" "" "" +testing "multiple files" "$IN && touch fileA && touch fileB && + chattr +Aa fileA fileB && lsattr fileA fileB | clean && + chattr -Aa fileA fileB && lsattr fileA fileB | clean; + rm -rf testFile*; $OUT" \ + "$_aA fileA\n$_aA fileB\n$_empty fileA\n$_empty fileB\n" "" "" -# 'A' --- no-atime -_A="-------A------------" -# 's' --- secure erase -_s="s-------------------" -testing "[-/+]AacDdijsStTu(random) FILE*" \ - "$IN && echo "$_t" > testFile && - chattr +AacDdijsStTu testFile* && cat testFile && chattr -A testFile* && - chattr -a testFile* && chattr -c testFile* && chattr -D testFile* && - chattr -d testFile* && chattr -i testFile* && chattr -j testFile* && - chattr -s testFile* && chattr -S testFile* && chattr -t testFile* && - chattr -T testFile* && chattr -u testFile* && lsattr testFile | clean; - rm -rf testFile; $OUT" \ - "$_t\n$_empty testFile\n" "" "" -testing "[-/+]i FILE[write]" \ - "$IN && echo "$_t" > testFile && - chattr +i testFile && - echo \"$_t\" > testFile || lsattr testFile | clean && chattr -i testFile; - rm -rf testFile; $OUT" "$_i testFile\n" "" "" -testing "[-/+]A FILE[write]" \ - "$IN && echo "$_t" > testFile && chattr +A testFile && - echo \"$_t\" > testFile && lsattr testFile | clean && chattr -A testFile; - rm -rf testFile; $OUT" "$_A testFile\n" "" "" -testing "[-/+]s FILE[write]" \ - "$IN && echo "$_t" > testFile && chattr +s testFile && - echo \"$_t\" > testFile && lsattr testFile | clean && chattr -s testFile - rm -rf testFile; $OUT" "$_s testFile\n" "" "" -NOSPACE=1 testing "-v version FILE[write]" \ - "$IN && echo "$_t" > testFile && - chattr -v 1234 testFile && echo \"$_t\" > testFile && - lsattr -v testFile | clean; rm -rf testFile" \ - "_ $_empty testFile\n" "" "" +touch testFile; chattr -v 1234 testFile 2>/dev/null || SKIPNEXT=1 +testing "-v version" "lsattr -v testFile | awk '{print \$1}' && + chattr -v 4567 testFile && lsattr -v testFile | awk '{print \$1}'; + rm -rf testFile" "1234\n4567\n" "" "" -testing "-R [-/+]a FILE" "$IN && touch aa && chattr -R +A aa && - lsattr aa | clean && chattr -R -A aa; rm -rf aa; $OUT" "$_A aa\n" "" "" -testing "-R [-/+]a FILE.." "$IN && touch aa bb && - chattr -R +A aa bb && lsattr aa bb | clean && - chattr -R -A aa bb; rm -rf aa bb; $OUT" "$_A aa\n$_A bb\n" "" "" +mkdir -p a/b/c && touch a/b/c/fA a/b/c/fB +testing "-R" "chattr -R +a a && lsattr a/b/c/fA a/b/c/fB | clean && + chattr -R -a a && rm -rf a" \ + "$_a a/b/c/fA\n$_a a/b/c/fB\n" "" "" +rm -rf a # Clean up rm -rf testattr diff --git a/toys/other/lsattr.c b/toys/other/lsattr.c index 090ac318..cd236b9e 100644 --- a/toys/other/lsattr.c +++ b/toys/other/lsattr.c @@ -353,5 +353,4 @@ void chattr_main(void) if (!(TT.add || TT.rm || TT.set || FLAG(p) || FLAG(v))) error_exit("need '-p', '-v', '=', '-', or '+'"); for (; *argv; argv++) dirtree_read(*argv, update_attr); - toys.exitval = 0; //always set success at this point. } |