$dir = $argv[1]; $arc = $argv[2]; $method = $argv[3]; $method = ($method) ? $method : 3; if (!$dir || !$arc) {echo "arc.php\n\nby drx, thanks to xose for most of the format breakdown\nhacking-cult.org\n\nusage: arc.php?dir=DIR&arc=OUTPUT&method=METHOD\n\nDIR - directory to be compressed\nOUTPUT - output .arc file\nMETHOD - \n1 - never compress\n3 - force compression (default)";die();} $i = 0; $fni = 1; $fndata = "\0"; $datai = 0; $data = ""; $entries = array(); function do_dir($dn, $parent) { global $i, $entries, $fni, $fndata, $datai, $data, $method; $dp = opendir($dn); while ($file = readdir($dp)) { if ($file != '.' && $file != '..') { $i++; $fnpos = $fni; $fndata .= $file."\0"; $fni += strlen($file)+1; if (is_dir($dn."/".$file)) { $entries[] = array("folder" => 1, "fn" => $fnpos, "parent_data" => $parent, "length" => 0000, "ulength" => 0); $l = count($entries); echo"".$i.": $dn/$file ($parent)\n"; do_dir($dn."/".$file, $i); $entries[$l-1]["length"] = $i+1; } else { for (;($datai&0x1f);$datai++) $data .= "\0"; $datapos = $datai; $cmp = 0; if ($method == 3) $cmp = 1; $filedata = fread(fopen("$dn/$file","r"),filesize("$dn/$file")); if ($cmp) {$ulength=strlen($filedata);$filedata=gzcompress($filedata,6);$length=strlen($filedata);} else {$length = strlen($filedata);$ulength=0;} $data .= $filedata; $datai += strlen($filedata); $entries[] = array("folder" => 0, "fn" => $fnpos, "parent_data" => $datapos, "length" => $length, "ulength" => $ulength); echo $i.": ".$dn."/".$file . "\n"; } } } } do_dir($dir, 0); //echo "
";

//print_r($entries);

$fp = fopen("./".$arc, "wb");

$fnlen=count($entries)*0x10+0x10;
for (;($fnlen&0x1f);$fnlen++);
$fnlen += strlen($fndata);
$datastart = $fnlen;
for (;($datastart&0x1f);$datastart++) $fndata .= "\0";
$datastart += 0x20;

fwrite($fp, pack("N*", 0x55AA382D, 0x20, $fnlen, $datastart,0,0,0,0)); //the header

array_unshift($entries, array("folder" => 1, "fn" => 0, "parent_data" => 0, "length" => $i+1, "ulength" => 0));

for ($i=0;$i