From dcd7553eb10ac930d3b6e8974c7c6adbe94b12be Mon Sep 17 00:00:00 2001 From: Christian Belisle Date: Sun, 13 Jan 2002 20:23:17 +0000 Subject: Now checks partition directly in /proc --- transfugdrake.pm | 73 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 30 deletions(-) (limited to 'transfugdrake.pm') diff --git a/transfugdrake.pm b/transfugdrake.pm index eccec52..1027186 100644 --- a/transfugdrake.pm +++ b/transfugdrake.pm @@ -13,39 +13,41 @@ sub cat_ { local *F; open F, $_[0] or $_[1] ? die "cat of file $_[0] failed: $!\ # From pixel and gc sub typeFromMagic { my $f = shift; - local *F; sysopen F, $f, 0 or return; - my $tmp; + my @partitions_signatures = ( + # [ 0x8e, 0, "HM\1\0" ], + # [ 0x83, 0x438, "\x53\xEF" ], + #[ 0x183, 0x10034, "ReIsErFs" ], + #[ 0x183, 0x10034, "ReIsEr2Fs" ], + #[ 0x283, 0, 'XFSB', 0x200, 'XAGF', 0x400, 'XAGI' ], + #[ 0x383, 0x8000, 'JFS1' ], + #[ 0x82, 4086, "SWAP-SPACE" ], + #[ 0x82, 4086, "SWAPSPACE2" ], + [ 0x7, 0x1FE, "\x55\xAA", 0x3, "NTFS" ], + [ 0xc, 0x1FE, "\x55\xAA", 0x52, "FAT32" ], + arch() !~ /^sparc/ ? ( [ 0x6, 0x1FE, "\x55\xAA", 0x36, "FAT" ],) : (), + ); + + local *F; + sysopen F, $f, 0 or return; + M: foreach (@partitions_signatures) { my ($name, @l) = @$_; + while (@l) { my ($offset, $signature) = splice(@l, 0, 2); sysseek(F, $offset, 0) or next M; sysread(F, $tmp, length $signature); - $tmp eq $signature or next M; + if($tmp ne $signature) { next M; } } - return $name; + return $name; } return -1; } sub get_windows_partition { - my $in = $_; + my $in = $_[0]; - my @partitions_signatures = ( - [ 0x8e, 0, "HM\1\0" ], - [ 0x83, 0x438, "\x53\xEF" ], - [ 0x183, 0x10034, "ReIsErFs" ], - [ 0x183, 0x10034, "ReIsEr2Fs" ], - [ 0x283, 0, 'XFSB', 0x200, 'XAGF', 0x400, 'XAGI' ], - [ 0x383, 0x8000, 'JFS1' ], - [ 0x82, 4086, "SWAP-SPACE" ], - [ 0x82, 4086, "SWAPSPACE2" ], - [ 0x7, 0x1FE, "\x55\xAA", 0x3, "NTFS" ], - [ 0xc, 0x1FE, "\x55\xAA", 0x52, "FAT32" ], - arch() !~ /^sparc/ ? ( [ 0x6, 0x1FE, "\x55\xAA", 0x36, "FAT" ],) : (), - ); - my %type2name = ( 0x1 => 'DOS 12-bit FAT', 0x4 => 'DOS 16-bit FAT (up to 32M)', @@ -68,27 +70,34 @@ sub get_windows_partition { ); my (undef, undef, @parts) = cat_('/proc/partitions'); - my %fat_parts; + my @fat_parts; + my $i = 0; P: foreach (@parts) { my (undef, undef, $blocks, $dev) = split or next; - my %skip_conditions = ( + + my %skip_conditions = ( "Skipping <$dev> because too little blocks ($blocks)" => ($blocks <= 1), "Skipping <$dev> because doesn't end with a number (e.g. seems to not be a partition)" => ($dev !~ /\d$/), ); $skip_conditions{$_} and ($verbose and print(STDERR $_, "\n")), next P foreach keys %skip_conditions; my $type = typeFromMagic("/dev/$dev"); - if($type eq "NTFS" || $type eq "FAT32" || $type eq "FAT") { - # printf "$dev: type <0x%0x> (%s)\n", $type, $type2name{$type}; - $fat_parts->{$dev} = $type; + + if($type2name{$type} =~ /NTFS/ || $type2name{$type} =~ /FAT32/ || $type2name{$type} =~ /FAT/) { + printf "$dev: type <0x%0x> (%s)\n", $type, $type2name{$type}; + $fat_parts[$i] = "$dev ($type2name{$type})"; + $i++; } } - return $in->ask_from_list_(_("Select your windows partition"), - _("Please specify your windows partition from the following list"), - [ %fat_parts ], - $fat_parts->{$dev}) - or quit_global($in, 0); + my $win_part = $in->ask_from_list_(_("Select your windows partition"), + _("Please specify your windows partition from the following list"), + [ @fat_parts ], + $fat_parts[0]) + or quit_global($in, 0); + if($fat_parts[1] eq "") { $in->ask_warn(_("Your Windows Partition"), _("$fat_parts[0] is your Windows partition")); } + + return $win_part; } sub get_windows_version { @@ -97,8 +106,12 @@ sub get_windows_version { sub get_windows_config { my %config; - $config->{'partitions'} = get_windows_partition(); + my $in = $_[0]; + + $config->{'partitions'} = get_windows_partition($in); + print $config->{'partitions'} . '\n'; } sub get_linux_config { } +1; -- cgit v1.2.1