diff options
Diffstat (limited to 'modules/id3/getid3/module.archive.tar.php')
-rw-r--r-- | modules/id3/getid3/module.archive.tar.php | 42 |
1 files changed, 14 insertions, 28 deletions
diff --git a/modules/id3/getid3/module.archive.tar.php b/modules/id3/getid3/module.archive.tar.php index df2753f2..61aff401 100644 --- a/modules/id3/getid3/module.archive.tar.php +++ b/modules/id3/getid3/module.archive.tar.php @@ -18,35 +18,25 @@ class getid3_tar { function getid3_tar(&$fd, &$ThisFileInfo) { $ThisFileInfo['fileformat'] = 'tar'; + $ThisFileInfo['tar']['files'] = array(); - @fseek($fd, 0); - $filebuffer = @fread($fd, $ThisFileInfo['filesize']); - return $this->read_tar($filebuffer, $ThisFileInfo); - } - - // Reads the tar-file - function read_tar(&$filebuffer, &$ThisFileInfo) { - - $header_length = 512; $unpack_header = 'a100fname/a8mode/a8uid/a8gid/a12size/a12mtime/a8chksum/a1typflag/a100lnkname/a6magic/a2ver/a32uname/a32gname/a8devmaj/a8devmin/a155/prefix'; - $null_512k = str_repeat("\0", 512); // end-of-file marker - $ThisFileInfo['tar']['files'] = array(); + @fseek($fd, 0); + while (!feof($fd)) { + $buffer = fread($fd, 512); - while(strlen($filebuffer) != 0) { - $buffer = substr($filebuffer, 0, $header_length); - $filebuffer = substr($filebuffer, strlen($buffer)); // check the block $checksum = 0; for ($i = 0; $i < 148; $i++) { - $checksum += ord(substr($buffer, $i, 1)); + $checksum += ord($buffer{$i}); } for ($i = 148; $i < 156; $i++) { $checksum += ord(' '); } for ($i = 156; $i < 512; $i++) { - $checksum += ord(substr($buffer, $i, 1)); + $checksum += ord($buffer{$i}); } $attr = unpack($unpack_header, $buffer); $name = trim(@$attr['fname']); @@ -65,8 +55,8 @@ class getid3_tar { $devmaj = octdec(trim(@$attr['devmaj'])); $devmin = octdec(trim(@$attr['devmin'])); $prefix = trim(@$attr['prefix']); - // EOF Found if (($checksum == 256) && ($chksum == 0)) { + // EOF Found break; } if ($prefix) { @@ -75,22 +65,18 @@ class getid3_tar { if ((preg_match('#/$#', $name)) && !$name) { $typeflag = 5; } - // If it's the end of the tar-file... if ($buffer == $null_512k) { + // it's the end of the tar-file... break; } - // Read the next chunk - $data = substr($filebuffer, 0, $size); - $filebuffer = substr($filebuffer, strlen($data)); - if (strlen($data) != $size) { - $ThisFileInfo['error'][] = 'Read error on tar file'; - return false; - } + + // Read to the next chunk + fseek($fd, $size, SEEK_CUR); + $diff = $size % 512; if ($diff != 0) { // Padding, throw away - $buff = substr($filebuffer, 0, (512 - $diff)); - $filebuffer = substr($filebuffer, strlen($buff)); + fseek($fd, (512 - $diff), SEEK_CUR); } // Protect against tar-files with garbage at the end if ($name == '') { @@ -122,7 +108,7 @@ class getid3_tar { // Parses the file mode to file permissions function display_perms($mode) { // Determine Type - if ($mode & 0x1000) $type='p'; // FIFO pipe + if ($mode & 0x1000) $type='p'; // FIFO pipe elseif ($mode & 0x2000) $type='c'; // Character special elseif ($mode & 0x4000) $type='d'; // Directory elseif ($mode & 0x6000) $type='b'; // Block special |