aboutsummaryrefslogtreecommitdiffstats
path: root/transfugdrake.pm
diff options
context:
space:
mode:
authorChristian Belisle <cbelisle@mandriva.com>2002-01-13 20:23:17 +0000
committerChristian Belisle <cbelisle@mandriva.com>2002-01-13 20:23:17 +0000
commitdcd7553eb10ac930d3b6e8974c7c6adbe94b12be (patch)
tree38ec2ff7e96c83f4f794c036aacb921b1febff0a /transfugdrake.pm
parentd60d38c2fab8728ddb96d449af12aa0c93754947 (diff)
downloadtransfugdrake-dcd7553eb10ac930d3b6e8974c7c6adbe94b12be.tar
transfugdrake-dcd7553eb10ac930d3b6e8974c7c6adbe94b12be.tar.gz
transfugdrake-dcd7553eb10ac930d3b6e8974c7c6adbe94b12be.tar.bz2
transfugdrake-dcd7553eb10ac930d3b6e8974c7c6adbe94b12be.tar.xz
transfugdrake-dcd7553eb10ac930d3b6e8974c7c6adbe94b12be.zip
Now checks partition directly in /proc
Diffstat (limited to 'transfugdrake.pm')
-rw-r--r--transfugdrake.pm73
1 files changed, 43 insertions, 30 deletions
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;