All pastes #502067 Raw Edit

Stuff

public text v1 · immutable
·published 2007-05-22 10:23 UTC
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);

?>