diff --git a/Yard.pm b/Yard.pm index 6f28006..19054f1 100644 --- a/Yard.pm +++ b/Yard.pm @@ -43,7 +43,7 @@ use FileHandle; use Cwd; # I am not even sure if this is being used here now use English; # I think this can be ditched for portability use File::Find; # used by check_root_fs -# use Error; # missing temporarily +use Error; my (%Included, %replaced_by, %links_to, %is_module, %hardlinked, %strippable, %lib_needed_by, @Libs); @@ -739,29 +739,48 @@ sub space_check { ######################## ##### Create filesystem ######################## -#@@sync(); -#@@sys("dd if=/dev/zero of=$::device bs=1k count=$::fs_size"); -#@@sync(); + sub create_filesystem { + my ($filename,$fs_size,$fs_type, $inode_size, $mnt) = @_; + my $device = "$mnt/$filename"; + my $mount_point = "$mnt/loopback"; + my $file; my $error; - ##info(0, "Creating ${::fs_size}K ext2 file system on $::device\n"); - if (-f $::device) { + sync(); + sys("dd if=/dev/zero of=$device bs=1k count=$fs_size"); + sync(); + + info(0, "Creating $fs_size K ext2 file system on $device\n"); + + if (-f $device) { ##### If device is a plain file, it means we're using some loopback ##### device. Use -F switch in mke2fs so it won't complain. ## Options here can be changed. - sys("mke2fs -F -m 0 -b 1024 $::device $::fs_size"); + ## Originally, this was -b 1024 switched with the inode approach. + if (sys("mke2fs -F -m 0 -i $inode_size $device $fs_size") !~ + /^0$/ ) { + $error = error("Can not make $fs_type filesystem"); + return "ERROR" if $error && $error eq "ERROR"; + } } else { - sys("mke2fs -m 0 -b 1024 $::device $::fs_size"); + if (sys("mke2fs -F -m 0 -i $inode_size $device $fs_size") !~ + /^0$/ ) { + $error = error("Can not make $fs_type filesystem"); + return "ERROR" if $error && $error eq "ERROR"; + } } - &mount_device; + if (!-d $mount_point) { + return "ERROR" if errmk(sys("mkdir $mount_point")) == 2; + } + mount_device($device,$mount_point); ##### lost+found on a ramdisk is pointless - sys("rm -rf $::mount_point/lost+found"); + sys("rm -rf $mount_point/lost+found"); sync(); @@ -780,7 +799,7 @@ sub create_filesystem { my($link_target) = $links_to{$file}; my($abs_file) = make_link_absolute($file, $link_target); if (-d $abs_file) { - my($floppy_file) = $::mount_point . $abs_file; + my($floppy_file) = $mount_point . $abs_file; my($newdir); foreach $newdir (mkpath($floppy_file)) { info(1, "\tCreating $newdir as a link target for $file\n"); @@ -798,7 +817,7 @@ sub create_filesystem { my($target); if (defined($target = $links_to{$file})) { - my($floppy_file) = $::mount_point . $file; + my($floppy_file) = $mount_point . $file; mkpath(dirname($floppy_file)); info(1, "\tLink\t$floppy_file -> $target\n"); symlink($target, $floppy_file) or @@ -807,7 +826,7 @@ sub create_filesystem { delete $Included{$file}; # Get rid of it so next pass doesn't copit } elsif (-d $file) { - my($floppy_file) = $::mount_point . $file; + my($floppy_file) = $mount_point . $file; my($newdir); foreach $newdir (mkpath($floppy_file)) { info(1, "\tCreate\t$newdir\n"); @@ -819,12 +838,12 @@ sub create_filesystem { ##### Tricky stuff is over with, now copy the remaining files. - info(0, "\nCopying files to $::device\n"); + info(0, "\nCopying files to $device\n"); my(%copied); while (($file) = each %Included) { - my($floppy_file) = $::mount_point . $file; + my($floppy_file) = $mount_point . $file; my($replacement); if (defined($replacement = $replaced_by{$file})) { @@ -864,7 +883,7 @@ sub create_filesystem { mkpath($floppy_file); } elsif ($file eq '/dev/null' and - $floppy_file ne "$::mount_point/dev/null") { # I hate this + $floppy_file ne "$mount_point/dev/null") { # I hate this info(1, "Creating empty file $floppy_file\n"); mkpath(dirname($floppy_file)); sys("touch $floppy_file"); @@ -886,13 +905,13 @@ sub create_filesystem { info(0, "Re-generating /etc/ld.so.cache on root fs.\n"); info(1, "Ignore warnings about missing directories\n"); - sys("ldconfig -v -r $::mount_point"); + sys("ldconfig -v -r $mount_point"); } - info(0, "\nDone with $PROGRAM_NAME. $Warnings warnings.\n", - "$::device is still mounted on $::mount_point\n"); + ## Probably will want to umount here - exit( $Warnings>0 ? -1 : 0); + info(0, "\nDone with $PROGRAM_NAME. $Warnings warnings.\n", + "$device is still mounted on $mount_point\n"); } # end sub create_filesystem @@ -958,7 +977,7 @@ sub cf_die { info(0, "$contents_file($cf_line): $line\n"); foreach (@msgs) { info(0, "\t$_\n"); } my $output = join("\n",@msgs); - &::error_window("gBootRoot: ERROR: ", $output); + error_window("gBootRoot: ERROR: ", $output); return "ERROR"; } @@ -977,7 +996,9 @@ sub cf_warn { sub copy_strip_file { # Obviously create_filesytem's @_ will have to be modified 4 the last 4 - # check for off or on, not undef + # check for off or on, not undef + my () = @_; + my($from, $to, $strip_objfiles, $strip_lib, $strip_bin, $strip_module) = @_; my $error; @@ -1053,7 +1074,7 @@ sub error { print LOGFILE "Error: ", @_; info(0, "Error: ", @_); - &::error_window("gBootRoot: ERROR: ", @_); + error_window("gBootRoot: ERROR: ", @_); return "ERROR"; } @@ -1425,19 +1446,25 @@ sub yard_glob { sub mount_device { + + my ($device,$mount_point) = @_; my($options); - if (-f $::device) { + + if (-f $device) { $options = "-o loop "; } else { $options = ""; } - sys("mount $options -t ext2 $::device $::mount_point"); + errmk(sys("mount $options -t ext2 $device $mount_point")); } ##### Called by make_root_fs to do basic checks on choice of $::device. sub check_device { + + my $fs_size; # @_ + if (!-e $::device) { error("Device $::device does not exist\n"); @@ -1466,9 +1493,9 @@ sub check_device { my($max) = get_device_size_K($::device); if (defined($max)) { - if ($max < $::fs_size) { + if ($max < $fs_size) { info 0, "You've declared file system size (fs_size) to be ", - "$::fs_size K\n", + "$fs_size K\n", "but Linux says $::device may only hold $max K\n"; if ($::device =~ m|^/dev/ram|) { info 0, "(Increase ramdisk size"; @@ -1480,7 +1507,7 @@ sub check_device { } else { info 0, "Warning: Yard can't determine the real size of ", "$::device.\n", - "Assuming it's $::fs_size as declared.\n", + "Assuming it's $fs_size as declared.\n", "I hope you're not lying.\n"; }