(List (= scope= flags=0 words=[] bindings=[('FAILCOUNT', {[LIT_CHARS 0]})]) (= scope= flags=0 words=[] bindings=[('SKIPPED_COMMANDS', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('SKIP', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('SHOWPASS', {[LIT_CHARS PASS]})]) (= scope= flags=0 words=[] bindings=[('SHOWFAIL', {[LIT_CHARS FAIL]})]) (= scope= flags=0 words=[] bindings=[('SHOWSKIP', {[LIT_CHARS SKIP]})]) (If (Com {[LIT_CHARS tty]} {[LIT_CHARS -s]} < (DescriptorRedirectNode target={[LIT_CHARS 1]} 0), > ) (List (= scope= flags=0 words=[] bindings=[('SHOWPASS', {[DQ [ComSub (Com {[LIT_CHARS echo]} {[LIT_CHARS -e]} {[DQ [\ LIT_ESCAPED_CHAR "\\0"][LIT_CHARS "33[1;32m"][VarSub SHOWPASS][\ LIT_ESCAPED_CHAR "\\0"][LIT_CHARS "33[0m"]]})]]})]) (= scope= flags=0 words=[] bindings=[('SHOWFAIL', {[DQ [ComSub (Com {[LIT_CHARS echo]} {[LIT_CHARS -e]} {[DQ [\ LIT_ESCAPED_CHAR "\\0"][LIT_CHARS "33[1;31m"][VarSub SHOWFAIL][\ LIT_ESCAPED_CHAR "\\0"][LIT_CHARS "33[0m"]]})]]})]) (= scope= flags=0 words=[] bindings=[('SHOWSKIP', {[DQ [ComSub (Com {[LIT_CHARS echo]} {[LIT_CHARS -e]} {[DQ [\ LIT_ESCAPED_CHAR "\\0"][LIT_CHARS "33[1;33m"][VarSub SHOWSKIP][\ LIT_ESCAPED_CHAR "\\0"][LIT_CHARS "33[0m"]]})]]})]) ) ) (FunctionDef optional [] (List (= scope= flags=0 words=[] bindings=[('option', {[ComSub (Pipeline (Com {[LIT_CHARS echo]} {[DQ [VarSub OPTIONFLAGS]]}) (Com {[LIT_CHARS egrep]} {[DQ [LIT_CHARS "(^|:)"][VarSub 1][LIT_CHARS "(:|"][\ LIT_ESCAPED_CHAR "\\$"][LIT_CHARS ")"]]}) )]})]) (If (AndOr OP_OR_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -z]} {[DQ [VarSub 1]]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_OR_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -z]} {[DQ [VarSub OPTIONFLAGS]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_DBRACKET_LIKE "["]} {[VarSub option transform_ops=[(#len)]]} {[LIT_CHARS -ne]} {[LIT_CHARS 0]} {[LIT_DBRACKET_LIKE "]"]} ) ) ) (List (= scope= flags=0 words=[] bindings=[('SKIP', {[DQ ]})]) (Com {[LIT_CHARS return]} ) ) ) (= scope= flags=0 words=[] bindings=[('SKIP', {[LIT_CHARS 1]})]) ) ) (FunctionDef testing [] (List (= scope= flags=0 words=[] bindings=[('test_desc', {[DQ [VarSub CMDNAME][LIT_CHARS " "][VarSub 1]]})]) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -z]} {[DQ [VarSub 1]]} {[LIT_DBRACKET_LIKE "]"]} ) (= scope= flags=0 words=[] bindings=[('test_desc', {[VarSub 2]})]) ) (If (Com {[LIT_DBRACKET_LIKE "["]} {[VarSub #]} {[LIT_CHARS -ne]} {[LIT_CHARS 5]} {[LIT_DBRACKET_LIKE "]"]} ) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Test "][VarSub test_desc][LIT_CHARS " has the wrong number of arguments ("][VarSub #][LIT_CHARS " "][VarSub *][LIT_CHARS ")"]]} < (DescriptorRedirectNode target={[LIT_CHARS 2]} &"> 1), > ) (Com {[LIT_CHARS exit]} ) ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub DEBUG]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS set]} {[LIT_CHARS -x]} ) ) (If (AndOr OP_OR_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub SKIP]]} {[LIT_DBRACKET_LIKE "]"]} ) (Subshell (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub SKIP_HOST]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub TEST_HOST]]} {[LIT_DBRACKET_LIKE "]"]} ) ) ) ) (List (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_OTHER "!"]} {[LIT_CHARS -z]} {[DQ [VarSub VERBOSE]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS echo]} {[DQ [VarSub SHOWSKIP][LIT_CHARS ": "][VarSub test_desc]]} ) ) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]} ) ) ) (Com {[LIT_CHARS echo]} {[LIT_CHARS -ne]} {[DQ [VarSub 3]]} < (FilenameRedirectNode filename={[LIT_CHARS expected]} "> 1), > ) (Com {[LIT_CHARS echo]} {[LIT_CHARS -ne]} {[DQ [VarSub 4]]} < (FilenameRedirectNode filename={[LIT_CHARS input]} "> 1), > ) (Pipeline (Com {[LIT_CHARS echo]} {[LIT_CHARS -ne]} {[DQ [VarSub 5]]} ) (Com {[LIT_CHARS eval]} {[DQ [VarSub 2]]} < (FilenameRedirectNode filename={[LIT_CHARS actual]} "> 1), > ) ) (= scope= flags=0 words=[] bindings=[('status', {[VarSub ?]})]) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[VarSub status]} {[LIT_CHARS -gt]} {[LIT_CHARS 128]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[VarSub status]} {[LIT_CHARS -lt]} {[LIT_CHARS 255]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "exited with signal (or returned "][VarSub status][LIT_CHARS ")"]]} < (FilenameRedirectNode filename={[LIT_CHARS actual]} >"> 1), > ) ) ) (Com {[LIT_CHARS cmp]} {[LIT_CHARS expected]} {[LIT_CHARS actual]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), (DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2), > ) (If (Com {[LIT_DBRACKET_LIKE "["]} {[VarSub ?]} {[LIT_CHARS -ne]} {[LIT_CHARS 0]} {[LIT_DBRACKET_LIKE "]"]} ) (List (= scope= flags=0 words=[] bindings=[('FAILCOUNT', {[ArithSub {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[VarSub FAILCOUNT]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}}]})]) (Com {[LIT_CHARS echo]} {[DQ [VarSub SHOWFAIL][LIT_CHARS ": "][VarSub test_desc]]} ) (If (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub VERBOSE]]} {[LIT_DBRACKET_LIKE "]"]} ) (List (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_OTHER "!"]} {[LIT_CHARS -z]} {[DQ [VarSub 4]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "echo -ne "][\ LIT_ESCAPED_CHAR "\\\""][VarSub 4][\ LIT_ESCAPED_CHAR "\\\""][LIT_CHARS " > input"]]} ) ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "echo -ne '"][VarSub 5][LIT_CHARS "' | "][VarSub 2]]} ) (Com {[LIT_CHARS diff]} {[LIT_CHARS -au]} {[LIT_CHARS expected]} {[LIT_CHARS actual]} ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub VERBOSE]]} {[LIT_DBRACKET_LIKE "=="]} {[LIT_CHARS fail]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) ) ) ) (ElseTrue) (Com {[LIT_CHARS echo]} {[DQ [VarSub SHOWPASS][LIT_CHARS ": "][VarSub test_desc]]} ) ) (Com {[LIT_CHARS rm]} {[LIT_CHARS -f]} {[LIT_CHARS input]} {[LIT_CHARS expected]} {[LIT_CHARS actual]} ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub DEBUG]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS set]} {[LIT_OTHER "+"] [LIT_CHARS x]} ) ) (Com {[LIT_CHARS return]} {[LIT_CHARS 0]} ) ) ) (FunctionDef mkchroot [] (List (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[VarSub #]} {[LIT_CHARS -lt]} {[LIT_CHARS 2]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS return]} ) ) (Com {[LIT_CHARS echo]} {[LIT_CHARS -n]} {[LIT_CHARS .]} ) (= scope= flags=0 words=[] bindings=[('dest', {[VarSub 1]})]) (Com {[LIT_CHARS shift]} ) (For i [{[DQ [VarSub @]]}]) (List (AndOr OP_OR_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub i transform_ops=[Slice {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}]]]} {[LIT_DBRACKET_LIKE "=="]} {[DQ [LIT_CHARS /]]} {[LIT_DBRACKET_LIKE "]"]} ) (= scope= flags=0 words=[] bindings=[('i', {[ComSub (Com {[LIT_CHARS which]} {[VarSub i]})]})]) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -f]} {[DQ [VarSub dest][LIT_CHARS /][VarSub i]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS continue]} ) ) (If (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -e]} {[DQ [VarSub i]]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('d', {[ComSub (Pipeline (Com {[LIT_CHARS echo]} {[DQ [VarSub i]]}) (Com {[LIT_CHARS grep]} {[LIT_CHARS -o]} {[SQ ]}) )]})]) (AndOr OP_AND_IF (Com {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[DQ [VarSub dest][LIT_CHARS /][VarSub d]]} ) (AndOr OP_AND_IF (Com {[LIT_CHARS cat]} {[DQ [VarSub i]]} < (FilenameRedirectNode filename={[DQ [VarSub dest][LIT_CHARS /][VarSub i]]} "> 1), > ) (Com {[LIT_CHARS chmod]} {[LIT_OTHER "+"] [LIT_CHARS x]} {[DQ [VarSub dest][LIT_CHARS /][VarSub i]]} ) ) ) ) (ElseTrue) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Not found: "][VarSub i]]} ) ) (Com {[LIT_CHARS mkchroot]} {[DQ [VarSub dest]]} {[ComSub (Pipeline (Com {[LIT_CHARS ldd]} {[DQ [VarSub i]]}) (Com {[LIT_CHARS egrep]} {[LIT_CHARS -o]} {[SQ ]}) )]} ) ) ) ) ) (FunctionDef dochroot [] (List (Com {[LIT_CHARS mkdir]} {[LIT_CHARS tmpdir4chroot]} ) (Com {[LIT_CHARS mount]} {[LIT_CHARS -t]} {[LIT_CHARS ramfs]} {[LIT_CHARS tmpdir4chroot]} {[LIT_CHARS tmpdir4chroot]} ) (Com {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[LIT_CHARS tmpdir4chroot/] [LIT_LBRACE "{"] [LIT_CHARS etc] [LIT_COMMA ","] [LIT_CHARS sys] [LIT_COMMA ","] [LIT_CHARS proc] [LIT_COMMA ","] [LIT_CHARS tmp] [LIT_COMMA ","] [LIT_CHARS dev] [LIT_RBRACE "}"]} ) (Com {[LIT_CHARS cp]} {[LIT_CHARS -L]} {[LIT_CHARS testing.sh]} {[LIT_CHARS tmpdir4chroot]} ) (Com {[LIT_CHARS echo]} {[LIT_CHARS -n]} {[DQ [LIT_CHARS "Setup chroot"]]} ) (Com {[LIT_CHARS mkchroot]} {[LIT_CHARS tmpdir4chroot]} {[VarSub *]} ) (Com {[LIT_CHARS echo]} ) (Com {[LIT_CHARS mknod]} {[LIT_CHARS tmpdir4chroot/dev/tty]} {[LIT_CHARS c]} {[LIT_CHARS 5]} {[LIT_CHARS 0]} ) (Com {[LIT_CHARS mknod]} {[LIT_CHARS tmpdir4chroot/dev/null]} {[LIT_CHARS c]} {[LIT_CHARS 1]} {[LIT_CHARS 3]} ) (Com {[LIT_CHARS mknod]} {[LIT_CHARS tmpdir4chroot/dev/zero]} {[LIT_CHARS c]} {[LIT_CHARS 1]} {[LIT_CHARS 5]} ) (Com {[LIT_CHARS cat]} < (FilenameRedirectNode filename={[LIT_CHARS tmpdir4chroot/test.sh]} "> 1), > ) (Com {[LIT_CHARS chmod]} {[LIT_OTHER "+"] [LIT_CHARS x]} {[LIT_CHARS tmpdir4chroot/test.sh]} ) (Com {[LIT_CHARS chroot]} {[LIT_CHARS tmpdir4chroot]} {[LIT_CHARS /test.sh]} ) (Com {[LIT_CHARS umount]} {[LIT_CHARS -l]} {[LIT_CHARS tmpdir4chroot]} ) (Com {[LIT_CHARS rmdir]} {[LIT_CHARS tmpdir4chroot]} ) ) ) (FunctionDef skip_if_not_root [] (If (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [ComSub (Com {[LIT_CHARS id]} {[LIT_CHARS -u]})]]} {[LIT_CHARS -ne]} {[LIT_CHARS 0]} {[LIT_DBRACKET_LIKE "]"]} ) (List (Com {[LIT_CHARS echo]} {[DQ [VarSub SHOWSKIP][LIT_CHARS ": "][VarSub CMDNAME][LIT_CHARS " (not root)"]]} ) (= scope= flags=0 words=[] bindings=[('SKIPPED_COMMANDS', {[DQ [VarSub SKIPPED_COMMANDS][LIT_CHARS " "][VarSub CMDNAME]]})]) (Com {[LIT_CHARS continue]} ) ) ) ) )