Move problem 1-2 (join) into project 2 as the "wait" system call.
[pintos-anon] / grading / userprog / prep-disk
1 #! /usr/bin/perl -w
2
3 use strict;
4 use Getopt::Long;
5 use POSIX;
6
7 my ($pintos) = "pintos";
8 my ($os_disk) = "../../src/userprog/build/os.dsk";
9 my ($fs_disk);
10 my ($test);
11
12 GetOptions ("os-disk=s" => \$os_disk,
13             "fs-disk=s" => \$fs_disk,
14             "test=s" => \$test,
15             "help" => sub { usage (0) })
16     or die "option parsing failed; use --help for help\n";
17
18 if (!defined ($test)) {
19     die "test name expected; use --help for help\n"
20         if @ARGV != 1;
21     $test = shift @ARGV;
22 } elsif (@ARGV != 0) {
23     die "can't have non-option arg with --test\n";
24 }
25
26 $fs_disk = "$test.dsk" if !defined $fs_disk;
27
28 if (! -e $os_disk) {
29     print STDERR "$os_disk: stat: $!\n";
30     print STDERR "perhaps you should `make' in ../../src/userprog?\n";
31     exit 1;
32 }
33
34 our ($formatted) = 0;
35
36 unlink $fs_disk;
37 xsystem ("$pintos make-disk '$fs_disk' 2");
38 put_file ("$test");
39 put_file ("sample.txt")
40     if grep ($_ eq $test,
41              qw (open-normal open-boundary open-twice
42                  close-normal close-twice
43                  read-normal read-bad-ptr read-boundary read-zero
44                  write-normal write-bad-ptr write-boundary write-zero
45                  multi-child-fd));
46 put_file ("child-simple")
47     if grep ($_ eq $test,
48              qw (exec-once exec-multiple
49                  wait-simple wait-twice));
50 put_file ("child-arg") if $test eq 'exec-arg';
51 put_file ("child-close") if $test eq 'multi-child-fd';
52 put_file ("child-bad") if $test eq 'wait-killed';
53
54 sub put_file {
55     my ($fn) = @_;
56     my ($cmd) = "$pintos -v --os-disk='$os_disk' --fs-disk='$fs_disk' put";
57     $cmd .= " -f", $formatted = 1 if !$formatted;
58     $cmd .= " '$fn'";
59     xsystem ($cmd);
60 }
61
62 sub xsystem {
63     my ($cmd) = @_;
64     print "$cmd\n";
65     system ($cmd) == 0 or die "command failed\n";
66 }