rendered paste body<?php
// arc.php
//
// by drx, based on xose's notes
// <hacking-cult.org>
$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 - \n<b>1</b> - never compress\n<b>3</b> - 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"<b>".$i.": $dn/$file ($parent)</b>\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 "<pre>";
//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<count($entries);$i++) fwrite($fp, pack("CxnNNN", $entries[$i]["folder"], $entries[$i]["fn"], ($entries[$i]["folder"])?$entries[$i]["parent_data"]:($entries[$i]["parent_data"]+$datastart), $entries[$i]["length"], $entries[$i]["ulength"]));
fwrite($fp,$fndata);
fwrite($fp,$data);
?>