blob: 41ebf1b839ce331688f9f973739d97d1a7e92b04 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#!/usr/bin/perl
use diagnostics;
use strict;
use lib qw(/usr/lib/libDrakX);
use common;
use resize_fat::main;
local *log::l = sub { print join(' ', @_), "\n" };
@ARGV = qw(/mnt/iso/w +0);
@ARGV == 2 or die "usage: fatresize <device> <size>\n <size> = 100 means `resize to 100Mb'\n <size> = +10 means `keep 10Mb of free space'\n";
my $fs = new resize_fat::main(common::basename($ARGV[0]), $ARGV[0]);
resize_fat::main::resize($fs, $ARGV[1]);
|
>41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package resize_fat::io; # $Id$
use diagnostics;
use strict;
use resize_fat::fat;
use c;
1;
sub read($$$) {
my ($fs, $pos, $size) = @_;
my $buf = "\0" x $size;
sysseek $fs->{fd}, $pos, 0 or die "seeking to byte #$pos failed on device $fs->{fs_name}";
sysread $fs->{fd}, $buf, $size or die "reading at byte #$pos failed on device $fs->{fs_name}";
$buf;
}
sub write($$$$) {
my ($fs, $pos, $_size, $buf) = @_;
sysseek $fs->{fd}, $pos, 0 or die "seeking to byte #$pos failed on device $fs->{fs_name}";
syswrite $fs->{fd}, $buf or die "writing at byte #$pos failed on device $fs->{fs_name}";
}
sub read_cluster($$) {
my ($fs, $cluster) = @_;
my $buf;
my $pos = $fs->{cluster_offset} / 512 + $cluster * ($fs->{cluster_size} / 512);
c::lseek_sector(fileno $fs->{fd}, $pos, 0) or die "seeking to sector #$pos failed on device $fs->{fs_name}";
sysread $fs->{fd}, $buf, $fs->{cluster_size} or die "reading at sector #$pos failed on device $fs->{fs_name}";
$buf;
}
sub write_cluster($$$) {
my ($fs, $cluster, $buf) = @_;
my $pos = $fs->{cluster_offset} / 512 + $cluster * ($fs->{cluster_size} / 512);
c::lseek_sector(fileno $fs->{fd}, $pos, 0) or die "seeking to sector #$pos failed on device $fs->{fs_name}";
syswrite $fs->{fd}, $buf or die "writing at sector #$pos failed on device $fs->{fs_name}";
}
sub read_file($$) {
my ($fs, $cluster) = @_;
my $buf = '';
for (; !resize_fat::fat::is_eof($cluster); $cluster = resize_fat::fat::next($fs, $cluster)) {
$cluster == 0 and die "Bad FAT: unterminated chain\n";
$buf .= read_cluster($fs, $cluster);
}
$buf;
}
sub open {
my ($fs) = @_;
sysopen $fs->{fd}, $fs->{fs_name}, 2 or
sysopen $fs->{fd}, $fs->{fs_name}, 0 or die "error opening device $fs->{fs_name} for writing\n";
}