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