diff options
Diffstat (limited to 'src/utils/pintos-mkdisk')
| -rw-r--r-- | src/utils/pintos-mkdisk | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/utils/pintos-mkdisk b/src/utils/pintos-mkdisk new file mode 100644 index 0000000..662b2e5 --- /dev/null +++ b/src/utils/pintos-mkdisk @@ -0,0 +1,37 @@ +#! /usr/bin/perl + +use strict; +use warnings; +use POSIX; +use Getopt::Long; +use Fcntl 'SEEK_SET'; + +GetOptions ("h|help" => sub { usage (0); }) + or exit 1; +usage (1) if @ARGV != 2; + +my ($disk, $mb) = @ARGV; +die "$disk: already exists\n" if -e $disk; +die "\"$mb\" is not a valid size in megabytes\n" + if $mb <= 0 || $mb > 1024 || $mb !~ /^\d+(\.\d+)?|\.\d+/; + +my ($cyl_cnt) = ceil ($mb * 2); +my ($cyl_bytes) = 512 * 16 * 63; +my ($bytes) = $cyl_bytes * $cyl_cnt; + +open (DISK, '>', $disk) or die "$disk: create: $!\n"; +sysseek (DISK, $bytes - 1, SEEK_SET) or die "$disk: seek: $!\n"; +syswrite (DISK, "\0", 1) == 1 or die "$disk: write: $!\n"; +close (DISK) or die "$disk: close: $!\n"; + +sub usage { + print <<'EOF'; +pintos-mkdisk, a utility for creating Pintos virtual disks +Usage: pintos DISKFILE MB +where DISKFILE is the file to use for the disk + and MB is the disk size in (approximate) megabytes. +Options: + -h, --help Display this help message. +EOF + exit (@_); +} |
