662b2e57d7eebccdac6ab1173702a8148a25af2a
[pintos-anon] / src / utils / pintos-mkdisk
1 #! /usr/bin/perl
2
3 use strict;
4 use warnings;
5 use POSIX;
6 use Getopt::Long;
7 use Fcntl 'SEEK_SET';
8
9 GetOptions ("h|help" => sub { usage (0); })
10   or exit 1;
11 usage (1) if @ARGV != 2;
12
13 my ($disk, $mb) = @ARGV;
14 die "$disk: already exists\n" if -e $disk;
15 die "\"$mb\" is not a valid size in megabytes\n"
16   if $mb <= 0 || $mb > 1024 || $mb !~ /^\d+(\.\d+)?|\.\d+/;
17
18 my ($cyl_cnt) = ceil ($mb * 2);
19 my ($cyl_bytes) = 512 * 16 * 63;
20 my ($bytes) = $cyl_bytes * $cyl_cnt;
21
22 open (DISK, '>', $disk) or die "$disk: create: $!\n";
23 sysseek (DISK, $bytes - 1, SEEK_SET) or die "$disk: seek: $!\n";
24 syswrite (DISK, "\0", 1) == 1 or die "$disk: write: $!\n";
25 close (DISK) or die "$disk: close: $!\n";
26
27 sub usage {
28     print <<'EOF';
29 pintos-mkdisk, a utility for creating Pintos virtual disks
30 Usage: pintos DISKFILE MB
31 where DISKFILE is the file to use for the disk
32   and MB is the disk size in (approximate) megabytes.
33 Options:
34   -h, --help        Display this help message.
35 EOF
36     exit (@_);
37 }