diff options
| author | Nathan Scott <nathans@sgi.com> | 2003-07-21 03:56:40 +0000 |
|---|---|---|
| committer | Nathan Scott <nathans@sgi.com> | 2003-07-21 03:56:40 +0000 |
| commit | ff170d22ca9ae0b1c362e33a4ab2fbd85ca79b86 (patch) | |
| tree | 1dc25ab85853d3f48a76756502b950f9739e7f2e /test | |
| parent | 63f3fb80cd6410a10c4e76dc66b16d6d8dd07c88 (diff) | |
| download | attr-ff170d22ca9ae0b1c362e33a4ab2fbd85ca79b86.tar.gz | |
attr updates from Andreas - emphasis on improved handling of special characters, and creates an little library for helper functions
Diffstat (limited to 'test')
| -rw-r--r-- | test/attr.test | 469 | ||||
| -rw-r--r-- | test/run | 193 |
2 files changed, 418 insertions, 244 deletions
diff --git a/test/attr.test b/test/attr.test index 91c6874..d777518 100644 --- a/test/attr.test +++ b/test/attr.test @@ -1,204 +1,265 @@ -! -! Tests for extended attributes on ext2/ext3 file systems. The initial -! size checks and the file size checks are ext2/ext3 specific. The -! other setfattr/getfattr operations are designed to cover all special -! cases in the ext27ext3 kernel patches, but they should work on other -! filesystems as well. -! -! Execute this test using the `run' script in this directory: -! -! $ run attr.text -! -! === try various valid and invalid names -$ touch f -$ setfattr -n user -v value f -setfattr: f: Operation not supported -$ setfattr -n user. -v value f -setfattr: f: Invalid argument -$ setfattr -n user.name f -$ getfattr -d f -# file: f -user.name - -$ setfattr -n user.n -v value f -$ rm f -! === size checks, for an ext2/ext3 file system with a block size of 1K -$ touch f -$ setfattr -n user.name -v 968+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ f -$ setfattr -n user.name -v 969++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ f -setfattr: f: No space left on device -$ rm f -! -! Editing values -! -$ touch f -$ setfattr -n user.vvvvvvvvvvvv -v vvvvvvvvvvvv f -$ setfattr -n user.wwwwwwww -v wwwwwwww f -$ setfattr -n user.xxxx -v xxxx f -$ getfattr -d f -# file: f -user.vvvvvvvvvvvv="vvvvvvvvvvvv" -user.wwwwwwww="wwwwwwww" -user.xxxx="xxxx" - -$ setfattr -n user.wwwwwwww -v wwww f -$ getfattr -d f -# file: f -user.vvvvvvvvvvvv="vvvvvvvvvvvv" -user.wwwwwwww="wwww" -user.xxxx="xxxx" - -$ setfattr -n user.xxxx -v xxxxxxxx f -$ getfattr -d f -# file: f -user.vvvvvvvvvvvv="vvvvvvvvvvvv" -user.wwwwwwww="wwww" -user.xxxx="xxxxxxxx" - -$ rm f -! -! Value encodings -! -$ touch f -$ setfattr -n user.name -v 0xbabe f -$ setfattr -n user.name2 -v 0s3q2+7w== f -$ setfattr -n user.name3 -v 0xdeface f -$ getfattr -d -e hex f -# file: f -user.name=0xbabe -user.name2=0xdeadbeef -user.name3=0xdeface - -$ getfattr -d -e base64 f -# file: f -user.name=0sur4= -user.name2=0s3q2+7w== -user.name3=0s3vrO - -$ getfattr -d -e text f -# file: f -user.name="º¾" -user.name2="Þ¾ï" -user.name3="ÞúÎ" - -$ rm f -! -! Everything with one file -! -$ touch f -$ setfattr -n user.novalue f -$ setfattr -n user.somename -v somevalue f -$ setfattr -n user.somename -v somevalue f -$ setfattr -n user.longername -v longervalue f -$ setfattr -n user.short -v value f -$ setfattr -n user.novalue-yet f -$ ls -s f - 1 f -$ getfattr -d f -# file: f -user.longername="longervalue" -user.novalue -user.novalue-yet -user.short="value" -user.somename="somevalue" - -$ setfattr -n user.novalue-yet -v avalue-now f -$ getfattr -d f -# file: f -user.longername="longervalue" -user.novalue -user.novalue-yet="avalue-now" -user.short="value" -user.somename="somevalue" - -$ setfattr -x user.noname f -setfattr: f: No such attribute -$ setfattr -x user.somename f -$ setfattr -x user.short f -$ getfattr -d f -# file: f -user.longername="longervalue" -user.novalue -user.novalue-yet="avalue-now" - -$ setfattr -x user.longername f -$ setfattr -x user.novalue f -$ setfattr -x user.novalue-yet f -$ getfattr -d f -$ ls -s f - 0 f -$ rm f -! -! Test extended attribute block sharing -! -$ touch f g h -$ setfattr -n user.novalue f g h -$ ls -s f g h - 1 f - 1 g - 1 h -$ setfattr -n user.name -v value f -$ ls -s f g h - 1 f - 1 g - 1 h -$ getfattr -d f g h -# file: f -user.name="value" -user.novalue - -# file: g -user.novalue - -# file: h -user.novalue - -$ setfattr -n user.name -v value g -$ ls -s f g h - 1 f - 1 g - 1 h -$ setfattr -x user.novalue h -$ ls -s f g h - 1 f - 1 g - 0 h -$ getfattr -d f g h -# file: f -user.name="value" -user.novalue - -# file: g -user.name="value" -user.novalue - -$ setfattr -n user.name -v other-value g -$ setfattr -n user.name -v value g -$ setfattr -x user.name f g -$ setfattr -x user.novalue f g -$ ls -s f g h - 0 f - 0 g - 0 h -$ rm f g h -! -! Attributes of symlinks vs. the files pointed to -! -$ touch f -$ ln -s f l -$ setfattr -n user.filename -v f l -$ setfattr -n user.filename -v l l -$ setfattr -h -n user.filename -v l l -setfattr: l: Operation not permitted -$ getfattr -d f l -# file: f -user.filename="l" - -# file: l -user.filename="l" - -! Some POSIX ACL tests... -$ setfattr -n system.posix_acl_access -v 0sAgAAAAEABgD/////AgAGAAEAAAAEAAQA/////xAABgD/////IAAEAP////8= f -$ setfattr -n system.posix_acl_accessFOO -v 0sAgAAAAEABgD/////AgAGAAEAAAAEAAQA/////xAABgD/////IAAEAP////8= f -setfattr: f: Invalid argument -$ rm f l +Tests for extended attributes on ext2/ext3 file systems. The initial +size checks and the file size checks are ext2/ext3 specific. The +other setfattr/getfattr operations are designed to cover all special +cases in the ext27ext3 kernel patches, but they should work on other +filesystems as well. + +Execute this test using the `run' script in this directory: + + run attr.text + +Try various valid and invalid names + + $ touch f + $ setfattr -n user -v value f + > setfattr: f: Operation not supported + + $ setfattr -n user. -v value f + > setfattr: f: Invalid argument + + $ setfattr -n user.name f + $ getfattr -d f + > # file: f + > user.name + > + + $ setfattr -n user.n -v value f + $ rm f + +Size checks, for an ext2/ext3 file system with a block size of 4K + + $ touch f + $ setfattr -n user.name -v 4040+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ f + $ setfattr -n user.name -v 4041++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ f + > setfattr: f: No space left on device + + $ rm f + +Editing values + + $ touch f + $ setfattr -n user.vvvvvvvvvvvv -v vvvvvvvvvvvv f + $ setfattr -n user.wwwwwwww -v wwwwwwww f + $ setfattr -n user.xxxx -v xxxx f + $ getfattr -d f + > # file: f + > user.vvvvvvvvvvvv="vvvvvvvvvvvv" + > user.wwwwwwww="wwwwwwww" + > user.xxxx="xxxx" + > + + $ setfattr -n user.wwwwwwww -v wwww f + $ getfattr -d f + > # file: f + > user.vvvvvvvvvvvv="vvvvvvvvvvvv" + > user.wwwwwwww="wwww" + > user.xxxx="xxxx" + > + + $ setfattr -n user.xxxx -v xxxxxxxx f + $ getfattr -d f + > # file: f + > user.vvvvvvvvvvvv="vvvvvvvvvvvv" + > user.wwwwwwww="wwww" + > user.xxxx="xxxxxxxx" + > + + $ rm f + +Value encodings + + $ touch f + $ setfattr -n user.name -v 0xbabe f + $ setfattr -n user.name2 -v 0s3q2+7w== f + $ setfattr -n user.name3 -v 0xdeface f + $ getfattr -d -e hex f + > # file: f + > user.name=0xbabe + > user.name2=0xdeadbeef + > user.name3=0xdeface + > + + $ getfattr -d -e base64 f + > # file: f + > user.name=0sur4= + > user.name2=0s3q2+7w== + > user.name3=0s3vrO + > + + $ getfattr -d -e text f + > # file: f + > user.name="º¾" + > user.name2="Þ¾ï" + > user.name3="ÞúÎ" + > + + $ rm f + +Everything with one file + + $ touch f + $ setfattr -n user.novalue f + $ setfattr -n user.somename -v somevalue f + $ setfattr -n user.somename -v somevalue f + $ setfattr -n user.longername -v longervalue f + $ setfattr -n user.short -v value f + $ setfattr -n user.novalue-yet f + $ ls -s f + > 4 f + + $ getfattr -d f + > # file: f + > user.longername="longervalue" + > user.novalue + > user.novalue-yet + > user.short="value" + > user.somename="somevalue" + > + + $ setfattr -n user.novalue-yet -v avalue-now f + $ getfattr -d f + > # file: f + > user.longername="longervalue" + > user.novalue + > user.novalue-yet="avalue-now" + > user.short="value" + > user.somename="somevalue" + > + + $ setfattr -x user.noname f + > setfattr: f: No such attribute + + $ setfattr -x user.somename f + $ setfattr -x user.short f + $ getfattr -d f + > # file: f + > user.longername="longervalue" + > user.novalue + > user.novalue-yet="avalue-now" + > + + $ setfattr -x user.longername f + $ setfattr -x user.novalue f + $ setfattr -x user.novalue-yet f + $ getfattr -d f + $ ls -s f + > 0 f + + $ rm f + +Test extended attribute block sharing + + $ touch f g h + $ setfattr -n user.novalue f g h + $ ls -s f g h + > 4 f + > 4 g + > 4 h + + $ setfattr -n user.name -v value f + $ ls -s f g h + > 4 f + > 4 g + > 4 h + + $ getfattr -d f g h + > # file: f + > user.name="value" + > user.novalue + > + > # file: g + > user.novalue + > + > # file: h + > user.novalue + > + + $ setfattr -n user.name -v value g + $ ls -s f g h + > 4 f + > 4 g + > 4 h + + $ setfattr -x user.novalue h + $ ls -s f g h + > 4 f + > 4 g + > 0 h + + $ getfattr -d f g h + > # file: f + > user.name="value" + > user.novalue + > + > # file: g + > user.name="value" + > user.novalue + > + + $ setfattr -n user.name -v other-value g + $ setfattr -n user.name -v value g + $ setfattr -x user.name f g + $ setfattr -x user.novalue f g + $ ls -s f g h + > 0 f + > 0 g + > 0 h + + $ rm f g h + +Attributes of symlinks vs. the files pointed to + + $ touch f + $ ln -s f l + $ setfattr -n user.filename -v f l + $ setfattr -n user.filename -v l l + $ setfattr -h -n user.filename -v l l + > setfattr: l: Operation not permitted + + $ getfattr -d f l + > # file: f + > user.filename="l" + > + > # file: l + > user.filename="l" + > + + $ rm f + +Tests for file name that contain special characters + + $ touch "f " + $ setfattr -n user.name -v value "f " + $ getfattr -d "f " + > # file: f\040 + > user.name="value" + > + + $ rm "f " + +Tests for attribute names that contains special characters + + $ touch f + $ setfattr -n "user.sp ace" -v value f + $ setfattr -n "user.special\\007" -v value f + $ getfattr f + > # file: f + > user.sp\040ace + > user.special\007 + > + + $ getfattr -d f + > # file: f + > user.sp\040ace="value" + > user.special\007="value" + > + + $ setfattr -x "user.sp ace" f + $ setfattr -n "user.sp ace" -v value f + $ setfattr -x "user.sp\\040ace" f + $ setfattr -x "user.special\\007" f + $ rm f + +Some POSIX ACL tests... + + $ touch f @@ -1,11 +1,23 @@ -#!/usr/bin/perl +#!/usr/bin/perl -w -U + +# +# Possible improvements: +# +# - distinguish stdout and stderr output +# - add environment variable like assignments +# - run up to a specific line +# - resume at a specific line +# use strict; use FileHandle; -use POSIX qw(geteuid getegid isatty); +use Getopt::Std; +use POSIX qw(isatty setuid); +use vars qw($opt_v); + +no warnings qw(taint); -my $owner = getpwuid(geteuid()); -my $group = getgrgid(getegid()); +getopts('v'); my ($OK, $FAILED) = ("ok", "failed"); if (isatty(fileno(STDOUT))) { @@ -13,19 +25,61 @@ if (isatty(fileno(STDOUT))) { $FAILED = "\033[31m\033[1m" . $FAILED . "\033[m"; } +sub exec_test($$); + my ($prog, $in, $out) = ([], [], []); -my $line = 0; +my $line_number = 0; my $prog_line; -my ($tests, $failed); +my ($tests, $failed) = (0,0); for (;;) { - my $script = <>; $line++; - $script =~ s/\@OWNER\@/$owner/g; - $script =~ s/\@GROUP\@/$group/g; - next if (defined($script) && $script =~ /^!/); - if (!defined($script) || $script =~ s/^\$ ?//) { - if (@$prog) { - #print "[$prog_line] \$ ", join(' ', @$prog), " -- "; + my $line = <>; $line_number++; + if (defined $line) { + # Substitute %VAR and %{VAR} with environment variables. + $line =~ s[%(?:(\w+)|\{(\w+)\})][$ENV{"$1$2"}]eg; + } + if (defined $line) { + if ($line =~ s/^\s*< ?//) { + push @$in, $line; + } elsif ($line =~ s/^\s*> ?//) { + push @$out, $line; + } else { + process_test($prog, $prog_line, $in, $out); + + $prog = []; + $prog_line = 0; + } + if ($line =~ s/^\s*\$ ?//) { + $line =~ s/\s+#.*//; # remove comments here... + $prog = [ map { s/\\(.)/$1/g; $_ } split /(?<!\\)\s+/, $line ]; + $prog_line = $line_number; + $in = []; + $out = []; + } + } else { + process_test($prog, $prog_line, $in, $out); + last; + } +} + +my $status = sprintf("%d commands (%d passed, %d failed)", + $tests, $tests-$failed, $failed); +if (isatty(fileno(STDOUT))) { + if ($failed) { + $status = "\033[31m\033[1m" . $status . "\033[m"; + } else { + $status = "\033[32m" . $status . "\033[m"; + } +} +print $status, "\n"; +exit $failed ? 1 : 0; + + +sub process_test($$$$) { + my ($prog, $prog_line, $in, $out) = @_; + + return unless @$prog; + my $p = [ @$prog ]; print "[$prog_line] \$ ", join(' ', map { s/\s/\\$&/g; $_ } @$p), " -- "; @@ -36,9 +90,6 @@ for (;;) { if (!defined($out->[$n]) || !defined($result->[$n]) || $out->[$n] ne $result->[$n]) { $good = 0; - #chomp $out->[$n]; - #chomp $result->[$n]; - #print "$out->[$n] != $result->[$n]"; } } $tests++; @@ -50,37 +101,88 @@ for (;;) { chomp $l; my $r = defined($result->[$n]) ? $result->[$n] : "~"; chomp $r; - print sprintf("%-37s | %-39s\n", $l, $r); + print sprintf("%-37s %s %-39s\n", $l, $l eq $r ? "|" : "?", $r); } + } elsif ($opt_v) { + print join('', @$result); } +} + + +sub su($) { + my ($user) = @_; + + $user ||= "root"; + + my ($login, $pass, $uid, $gid) = getpwnam($user) + or return [ "su: user $user does not exist\n" ]; + my @groups = (); + my $fh = new FileHandle("/etc/group") + or return [ "opening /etc/group: $!\n" ]; + while (<$fh>) { + chomp; + my ($group, $passwd, $gid, $users) = split /:/; + foreach my $u (split /,/, $users) { + push @groups, $gid + if ($user eq $u); } - #$prog = [ split /\s+/, $script ] if $script; - $prog = [ map { s/\\(.)/$1/g; $_ } split /(?<!\\)\s+/, $script ] if $script; - $prog_line = $line; - $in = []; - $out = []; - } elsif ($script =~ s/^> ?//) { - push @$in, $script; - } else { - push @$out, $script; } - last unless defined($script); + $fh->close; + + my $groups = join(" ", ($gid, $gid, @groups)); + #print STDERR "[[$groups]]\n"; + $! = 0; # reset errno + $> = 0; + $( = $gid; + $) = $groups; + if ($!) { + return [ "su: $!\n" ]; + } + if ($uid != 0) { + $> = $uid; + #$< = $uid; + if ($!) { + return [ "su: $prog->[1]: $!\n" ]; + } + } + #print STDERR "[($>,$<)($(,$))]"; + return []; } -my $status = sprintf("%d commands (%d passed, %d failed)", - $tests, $tests-$failed, $failed); -if (isatty(fileno(STDOUT))) { - if ($failed) { - $status = "\033[31m\033[1m" . $status . "\033[m"; - } else { - $status = "\033[32m" . $status . "\033[m"; - } + + +sub sg($) { + my ($group) = @_; + + my $gid = getgrnam($group) + or return [ "sg: group $group does not exist\n" ]; + my %groups = map { $_ eq $gid ? () : ($_ => 1) } (split /\s/, $)); + + #print STDERR "<<", join("/", keys %groups), ">>\n"; + my $groups = join(" ", ($gid, $gid, keys %groups)); + #print STDERR "[[$groups]]\n"; + $! = 0; # reset errno + if ($> != 0) { + my $uid = $>; + $> = 0; + $( = $gid; + $) = $groups; + $> = $uid; + } else { + $( = $gid; + $) = $groups; + } + if ($!) { + return [ "sg: $!\n" ]; + } + print STDERR "[($>,$<)($(,$))]"; + return []; } -print $status, "\n"; -exit $failed ? 1 : 0; + sub exec_test($$) { my ($prog, $in) = @_; local (*IN, *IN_DUP, *IN2, *OUT_DUP, *OUT, *OUT2); + my $needs_shell = (join('', @$prog) =~ /[][|<>"'`\$\*\?]/); if ($prog->[0] eq "umask") { umask oct $prog->[1]; @@ -90,6 +192,10 @@ sub exec_test($$) { return [ "chdir: $prog->[1]: $!\n" ]; } return []; + } elsif ($prog->[0] eq "su") { + return su($prog->[1]); + } elsif ($prog->[0] eq "sg") { + return sg($prog->[1]); } pipe *IN2, *OUT @@ -134,11 +240,15 @@ sub exec_test($$) { my $result = []; while (<IN>) { #print "< $_"; + if ($needs_shell) { + s#^/bin/sh: line \d+: ##; + } push @$result, $_; } return $result; } else { # Client + $< = $>; close IN or die "Can't close read end for input pipe: $!"; close OUT @@ -151,9 +261,12 @@ sub exec_test($$) { open STDERR, ">&STDOUT" or die "Can't join STDOUT and STDERR: $!"; - #print ERR_DUP "<", join(' ', @$prog), ">\n"; - exec @$prog; - print ERR_DUP $prog->[0], ": $!\n"; + if ($needs_shell) { + exec ('/bin/sh', '-c', join(" ", @$prog)); + } else { + exec @$prog; + } + print STDERR $prog->[0], ": $!\n"; exit; } } |
