diff options
Diffstat (limited to 'old/transfugdrake.pm')
-rw-r--r-- | old/transfugdrake.pm | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/old/transfugdrake.pm b/old/transfugdrake.pm new file mode 100644 index 0000000..b14ec36 --- /dev/null +++ b/old/transfugdrake.pm @@ -0,0 +1,164 @@ +package transfugdrake; + +use common; + +# From pixel and gc +sub arch() { + my $t = `uname -m`; + chomp $t; + $t; +} + +# From pixel and gc +sub cat_ { local *F; open F, $_[0] or $_[1] ? die "cat of file $_[0] failed: $!\n" : return; my @l = <F>; wantarray ? @l : join '', @l } + +# From pixel and gc +sub typeFromMagic { + my $f = shift; + 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); + if($tmp ne $signature) { next M; } + } + return $name; + } + return -1; +} + +sub get_windows_partition { + my $in = $_[0]; + + my %type2name = ( + 0x1 => 'DOS 12-bit FAT', + 0x4 => 'DOS 16-bit FAT (up to 32M)', + 0x5 => 'DOS 3.3+ Extended Partition', + 0x6 => 'DOS FAT16', + 0x7 => 'NTFS (or HPFS)', + 0xb => 'Win98 FAT32', + 0xc => 'Win98 FAT32, LBA-mapped', + 0xe => 'Win95: DOS 16-bit FAT, LBA-mapped', + 0xf => 'Win95: Extended partition, LBA-mapped', + 0x82 => 'Linux Swap', + 0x83 => 'Ext2', + 0x183 => 'ReiserFS', + 0x283 => 'XFS', + 0x383 => 'JFS', + 0x85 => 'Linux extended partition', + 0x87 => 'NTFS volume set', + 0x8e => 'Linux LVM', + -1 => 'unknown' + ); + + my (undef, undef, @parts) = cat_('/proc/partitions'); + my @fat_parts; + my $i = 0; + my $devname = ""; + my @ls_array; + my @tmp_array; + my $fstype; + + P: foreach (@parts) { + my (undef, undef, $blocks, $dev) = split or next; + + 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($type2name{$type} =~ /NTFS/ || $type2name{$type} =~ /FAT32/ || $type2name{$type} =~ /FAT/) { + $devname = `cd /dev/; ls -l | grep '$dev' ; cd -`; + @ls_array = split(' ', $devname); + $fat_parts[$i] = "/dev/$ls_array[8] ($type2name{$type})"; + $i++; + } + } + + if($fat_parts[0] eq "") { $in->ask_warn(N("No Windows Partition"), N("No Windows Partition found")); quit_global($in, 0); } + $::Wizard_no_previous = 1; + my $win_part = $in->ask_from_list_(N("Select your windows partition"), + N("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(N("Your Windows Partition"), N("$fat_parts[0] is found as your Windows partition")); } + + if($win_part =~ /NTFS/) { $fstype = "ntfs"; } + elsif($win_part =~ /FAT32/) {$fstype = "msdos"; } + elsif($win_part =~ /FAT/) {$fstype = "msdos"; } + + @tmp_array = split(' ', $win_part); + $win_part = $tmp_array[0]; + return ($win_part, $fstype); +} + +sub mount_partition { + my $fstype = $_[0]; + my $win_partition = $_[1]; + my $mountpoint = "/mnt/transfug"; + my @mounts; + my $mounted = 0; + my @tmp; + + (@mounts) = cat_('/proc/mounts'); + + foreach (@mounts) { + @tmp = split(' ', $_); + if($tmp[0] eq $win_partition) { + $mounted = 1; + $mountpoint = $tmp[1]; + } + } + + if(!$mounted) { + mkdir($mountpoint); + + print "mount -t $fstype $win_partition $mountpoint\n"; + if(`mount -t $fstype $win_partition $mountpoint`) { print "Error\n:"; } + } + + return $mountpoint; +} + +sub get_windows_config { + my %config; + my $in = $_[0]; + + # Get the windows partition + ($config->{partition}, $config->{fstype}) = get_windows_partition($in); + + # Mount it + $config->{mountpoint} = mount_partition($config->{fstype}, $config->{partition}); + + # Find where the documents are + # If possible, get some registry config + return ($config->{partition}, $config->{fstype}, $config->{mountpoint}); +} + +sub get_linux_config { +} + +1; |