ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Urlader/urlader-genpack
Revision: 1.2
Committed: Wed Jan 4 09:35:09 2012 UTC (12 years, 4 months ago) by root
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +0 -0 lines
State: FILE REMOVED
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 #!/opt/bin/perl
2    
3     use Compress::LZF;
4    
5     my $verbose = 1;
6    
7     my $exe_id = shift;
8     my $exe_ver = shift;
9     my $dir = shift;
10    
11     my $size;
12     my $max;
13    
14     sub ent {
15     my ($type, $flags, $name, $data) = @_;
16    
17     warn "add record type $type, path $name\n" if $verbose >= 2;
18    
19     my $ent = pack "CCnN Z* a*",
20     $type,
21     $flags,
22     (length $name),
23     (length $data),
24     $name,
25     $data;
26    
27     print $ent;
28    
29     $size += length $ent;
30     }
31    
32     sub scandir {
33     my ($path, $pfx) = @_;
34    
35     $pfx =~ s%^/%%;
36    
37     opendir my $fh, $path
38     or die "$path: $!";
39    
40     for my $file (sort readdir $fh) {
41     next if $file eq "." || $file eq "..";
42    
43     lstat "$path/$file"
44     or die "$path/$file: $!";
45    
46     if (-d _) {
47     ent 4, 0, "$pfx$file";
48     &scandir ("$path/$file", "$pfx$file/");
49     } elsif (-f _) {
50     my $len = -s _;
51    
52     $max = $len if $max < $len;
53    
54     open my $fh2, "<", "$path/$file"
55     or die "$path/$file: $!";
56    
57     $len == sysread $fh2, my $data, $len
58     or die "$path/$file: read error";
59    
60     my $flags = (-x _) ? 0x10 : 0;
61    
62     my $comp = Compress::LZF::compress $data;
63     $comp =~ s/^(?:[\x00-\x7f]|[\x80-\xff]+)//; # remove length prefix
64    
65     if ($len > 1 + length $comp) {
66     $flags |= 0x01;
67     $data = $comp;
68     }
69    
70     ent 5, $flags, "$pfx$file", $data;
71     } else {
72     warn "$path/$file: unsupported filetype, skipping.\n";
73     }
74     }
75     }
76    
77     ent 1, 0, $exe_id, "$exe_ver\x00";
78    
79     shift, ent 2, 0, $1, "$2\x00"
80     while $ARGV[0] =~ /^([^=]+)=(.*)$/s;
81    
82     ent 3, 0, shift
83     while @ARGV;
84    
85     scandir $dir, "";
86    
87     ent 0, 0;
88    
89     print pack "NN a12",
90     $max,
91     $size + 20, # sizeof this pack, sorry...
92     "SCHMORPPACK0";
93    
94     printf STDERR "%d bytes written, biggest single file is %d bytes.\n", $size, $max
95     if $verbose;