• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 char *extract_header = "#!/usr/bin/perl\n"
2 	"#use strict;\n"
3 	"use IO::Handle;\n"
4 	"\n"
5 	"my $debug=0;\n"
6 	"\n"
7 	"sub verify ($$)\n"
8 	"{\n"
9 	"	my ($filename, $hash) = @_;\n"
10 	"	my ($testhash);\n"
11 	"\n"
12 	"	if (system(\"which md5sum > /dev/null 2>&1\")) {\n"
13 	"		die \"This firmware requires the md5sum command - see http://www.gnu.org/software/coreutils/\\n\";\n"
14 	"	}\n"
15 	"\n"
16 	"	open(CMD, \"md5sum \".$filename.\"|\");\n"
17 	"	$testhash = <CMD>;\n"
18 	"	$testhash =~ /([a-zA-Z0-9]*)/;\n"
19 	"	$testhash = $1;\n"
20 	"	close CMD;\n"
21 	"		die \"Hash of extracted file does not match (found $testhash, expected $hash!\\n\" if ($testhash ne $hash);\n"
22 	"}\n"
23 	"\n"
24 	"sub get_hunk ($$)\n"
25 	"{\n"
26 	"	my ($offset, $length) = @_;\n"
27 	"	my ($chunklength, $buf, $rcount, $out);\n"
28 	"\n"
29 	"	sysseek(INFILE, $offset, SEEK_SET);\n"
30 	"	while ($length > 0) {\n"
31 	"	# Calc chunk size\n"
32 	"		$chunklength = 2048;\n"
33 	"		$chunklength = $length if ($chunklength > $length);\n"
34 	"\n"
35 	"		$rcount = sysread(INFILE, $buf, $chunklength);\n"
36 	"		die \"Ran out of data\\n\" if ($rcount != $chunklength);\n"
37 	"		$out .= $buf;\n"
38 	"		$length -= $rcount;\n"
39 	"	}\n"
40 	"	return $out;\n"
41 	"}\n"
42 	"\n"
43 	"sub write_le16($)\n"
44 	"{\n"
45 	"	my $val = shift;\n"
46 	"	my $msb = ($val >> 8) &0xff;\n"
47 	"	my $lsb = $val & 0xff;\n"
48 	"\n"
49 	"	syswrite(OUTFILE, chr($lsb).chr($msb));\n"
50 	"}\n"
51 	"\n"
52 	"sub write_le32($)\n"
53 	"{\n"
54 	"	my $val = shift;\n"
55 	"	my $l3 = ($val >> 24) & 0xff;\n"
56 	"	my $l2 = ($val >> 16) & 0xff;\n"
57 	"	my $l1 = ($val >> 8)  & 0xff;\n"
58 	"	my $l0 = $val         & 0xff;\n"
59 	"\n"
60 	"	syswrite(OUTFILE, chr($l0).chr($l1).chr($l2).chr($l3));\n"
61 	"}\n"
62 	"\n"
63 	"sub write_le64($$)\n"
64 	"{\n"
65 	"	my $msb_val = shift;\n"
66 	"	my $lsb_val = shift;\n"
67 	"	my $l7 = ($msb_val >> 24) & 0xff;\n"
68 	"	my $l6 = ($msb_val >> 16) & 0xff;\n"
69 	"	my $l5 = ($msb_val >> 8)  & 0xff;\n"
70 	"	my $l4 = $msb_val         & 0xff;\n\n"
71 	"	my $l3 = ($lsb_val >> 24) & 0xff;\n"
72 	"	my $l2 = ($lsb_val >> 16) & 0xff;\n"
73 	"	my $l1 = ($lsb_val >> 8)  & 0xff;\n"
74 	"	my $l0 = $lsb_val         & 0xff;\n"
75 	"\n"
76 	"	syswrite(OUTFILE,\n"
77 	"		 chr($l0).chr($l1).chr($l2).chr($l3).\n"
78 	"		 chr($l4).chr($l5).chr($l6).chr($l7));\n"
79 	"}\n"
80 	"\n"
81 	"sub write_hunk($$)\n"
82 	"{\n"
83 	"	my ($offset, $length) = @_;\n"
84 	"	my $out = get_hunk($offset, $length);\n"
85 	"\n"
86 	"	printf \"(len %d) \",$length if ($debug);\n"
87 	"\n"
88 	"	for (my $i=0;$i<$length;$i++) {\n"
89 	"		printf \"%02x \",ord(substr($out,$i,1)) if ($debug);\n"
90 	"	}\n"
91 	"	printf \"\\n\" if ($debug);\n"
92 	"\n"
93 	"	syswrite(OUTFILE, $out);\n"
94 	"}\n"
95 	"\n"
96 	"sub write_hunk_fix_endian($$)\n"
97 	"{\n"
98 	"	my ($offset, $length) = @_;\n"
99 	"	my $out = get_hunk($offset, $length);\n"
100 	"\n"
101 	"	printf \"(len_fix %d) \",$length if ($debug);\n"
102 	"\n"
103 	"	for (my $i=0;$i<$length;$i++) {\n"
104 	"		printf \"%02x \",ord(substr($out,$i,1)) if ($debug);\n"
105 	"	}\n"
106 	"	printf \"\\n\" if ($debug);\n"
107 	"\n"
108 	"	$i=0;\n"
109 	"	while ($i<$length) {\n"
110 	"		my $size = ord(substr($out,$i,1))*256+ord(substr($out,$i+1,1));\n"
111 	"		syswrite(OUTFILE, substr($out,$i+1,1));\n"
112 	"		syswrite(OUTFILE, substr($out,$i,1));\n"
113 	"		$i+=2;\n"
114 	"		if ($size>0 && $size <0x8000) {\n"
115 	"			for (my $j=0;$j<$size;$j++) {\n"
116 	"				syswrite(OUTFILE, substr($out,$j+$i,1));\n"
117 	"			}\n"
118 	"			$i+=$size;\n"
119 	"		}\n"
120 	"	}\n"
121 	"}\n"
122 	"\n"
123 	"sub main_firmware($$$$)\n"
124 	"{\n"
125 	"	my $out;\n"
126 	"	my $j=0;\n"
127 	"	my $outfile = shift;\n"
128 	"	my $name    = shift;\n"
129 	"	my $version = shift;\n"
130 	"	my $nr_desc = shift;\n"
131 	"\n"
132 	"	for ($j = length($name); $j <32; $j++) {\n"
133 	"		$name = $name.chr(0);\n"
134 	"}\n\n"
135 	"	open OUTFILE, \">$outfile\";\n"
136 	"	syswrite(OUTFILE, $name);\n"
137 	"	write_le16($version);\n"
138 	"	write_le16($nr_desc);\n";
139 
140 char *write_hunk = "\twrite_hunk(%d, %d);\n";
141 char *write_hunk_fix_endian = "\twrite_hunk_fix_endian(%d, %d);\n";
142 
143 // Parameters: file windows filename, hash, outfile, version, name
144 char *end_extract = "}\n\nsub extract_firmware {\n"
145 	"	my $sourcefile = \"%s\";\n"
146 	"	my $hash = \"%s\";\n"
147 	"	my $outfile = \"%s\";\n"
148 	"	my $name = \"%s\";\n"
149 	"	my $version = %d;\n"
150 	"	my $nr_desc = %d;\n"
151 	"	my $out;\n"
152 	"\n"
153 	"	verify($sourcefile, $hash);\n"
154 	"\n"
155 	"	open INFILE, \"<$sourcefile\";\n"
156 	"	main_firmware($outfile, $name, $version, $nr_desc);\n"
157 	"	close INFILE;\n"
158 	"}\n"
159 	"\n"
160 	"extract_firmware;\n"
161 	"printf \"Firmwares generated.\\n\";\n";
162