#! /usr/bin/perl -w use strict; use Getopt::Long; use POSIX; my ($pintos) = "pintos"; my ($os_disk) = "../../src/userprog/build/os.dsk"; my ($fs_disk); my ($test); GetOptions ("os-disk=s" => \$os_disk, "fs-disk=s" => \$fs_disk, "test=s" => \$test, "help" => sub { usage (0) }) or die "option parsing failed; use --help for help\n"; if (!defined ($test)) { die "test name expected; use --help for help\n" if @ARGV != 1; $test = shift @ARGV; } elsif (@ARGV != 0) { die "can't have non-option arg with --test\n"; } $fs_disk = "$test.dsk" if !defined $fs_disk; if (! -e $os_disk) { print STDERR "$os_disk: stat: $!\n"; print STDERR "perhaps you should `make' in ../../src/userprog?\n"; exit 1; } our ($formatted) = 0; unlink $fs_disk; xsystem (0, "$pintos make-disk '$fs_disk' 2"); put_file ("$test"); put_file ("sample.txt") if grep ($_ eq $test, qw (open-normal open-boundary open-twice close-normal close-twice read-normal read-bad-ptr read-boundary read-zero write-normal write-bad-ptr write-boundary write-zero multi-child-fd)); put_file ("child-simple") if grep ($_ eq $test, qw (exec-once exec-multiple join-simple join-twice)); put_file ("child-arg") if $test eq 'exec-arg'; put_file ("child-close") if $test eq 'multi-child-fd'; put_file ("child-bad") if $test eq 'join-killed'; sub put_file { my ($fn) = @_; my ($cmd) = "$pintos -v --os-disk='$os_disk' --fs-disk='$fs_disk' put"; $cmd .= " -f", $formatted = 1 if !$formatted; $cmd .= " '$fn'"; xsystem (1, $cmd); } sub xsystem { my ($expect, $cmd) = @_; print "$cmd\n"; WIFEXITED ($code) && WEXITSTATUS ($code) == $expect or die "command failed\n"; }