package transfugdrake; # 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 = ; 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++; } } 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 found as your Windows partition")); } if($win_part eq "") { $in->ask_warn(_("No Windows Partition"), _("No Windows Partition found")); quit_global($in, 0); } 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/windows"; 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) { if(-e $mountpoint) { $mountpoint .= '2'; } 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;