Annotation of embedaddon/php/ext/phar/tests/tar/files/corrupt_tarmaker.php.inc, revision 1.1
1.1 ! misho 1: <?php
! 2: // stolen from PEAR2_Pyrus_Developer_Creator_Tar by Greg Beaver, the original author, for use in unit tests
! 3: class corrupt_tarmaker
! 4: {
! 5: /**
! 6: * Path to archive file
! 7: *
! 8: * @var string
! 9: */
! 10: protected $archive;
! 11: /**
! 12: * Temporary stream used for creating the archive
! 13: *
! 14: * @var stream
! 15: */
! 16: protected $tmp;
! 17: protected $path;
! 18: protected $compress;
! 19: function __construct($path, $compress = 'zlib')
! 20: {
! 21: $this->compress = $compress;
! 22: if ($compress === 'bz2' && !function_exists('bzopen')) {
! 23: throw new PEAR2_Pyrus_Developer_Creator_Exception(
! 24: 'bzip2 extension not available');
! 25: }
! 26: if ($compress === 'zlib' && !function_exists('gzopen')) {
! 27: throw new PEAR2_Pyrus_Developer_Creator_Exception(
! 28: 'zlib extension not available');
! 29: }
! 30: $this->path = $path;
! 31: }
! 32:
! 33: /**
! 34: * save a file inside this package
! 35: *
! 36: * This code is modified from Vincent Lascaux's File_Archive
! 37: * package, which is licensed under the LGPL license.
! 38: * @param string relative path within the package
! 39: * @param string|resource file contents or open file handle
! 40: */
! 41: function addFile($path, $fileOrStream, $stat = null, $corrupt = null)
! 42: {
! 43: clearstatcache();
! 44: if ($stat === null) {
! 45: if (is_resource($fileOrStream)) {
! 46: $stat = fstat($fileOrStream);
! 47: } else {
! 48: $stat = array(
! 49: 'mode' => 0x8000 + 0644,
! 50: 'uid' => 0,
! 51: 'gid' => 0,
! 52: 'size' => strlen($fileOrStream),
! 53: 'mtime' => time(),
! 54: );
! 55: }
! 56: }
! 57:
! 58: $link = null;
! 59: if ($stat['mode'] & 0xA000 && $corrupt === 'symlink') {
! 60: $type = 2; // Symbolic Link
! 61: $link = $fileOrStream;
! 62: $stat['size'] = 0;
! 63: $fileOrStream = '';
! 64: } else if ($stat['mode'] & 0xA000) {
! 65: $type = 1; // Link
! 66: $link = $fileOrStream;
! 67: $stat['size'] = 0;
! 68: $fileOrStream = '';
! 69: } else if ($stat['mode'] & 0x4000) {
! 70: $type = 5; // Directory
! 71: } else if ($stat['mode'] & 0x8000) {
! 72: $type = 0; // Regular
! 73: } else {
! 74: $type = 9; // Unknown
! 75: }
! 76:
! 77: $filePrefix = '';
! 78: if (strlen($path) > 255) {
! 79: throw new Exception(
! 80: "$path is too long, must be 255 characters or less"
! 81: );
! 82: } else if (strlen($path) > 100) {
! 83: $filePrefix = substr($path, 0, strlen($path)-100);
! 84: $path = substr($path, -100);
! 85: }
! 86:
! 87: $block = pack('a100a8a8a8a12A12',
! 88: $path,
! 89: decoct($stat['mode']),
! 90: sprintf('%6s ',decoct($stat['uid'])),
! 91: sprintf('%6s ',decoct($stat['gid'])),
! 92: sprintf('%11s ',decoct($stat['size'])),
! 93: sprintf('%11s ',decoct($stat['mtime']))
! 94: );
! 95:
! 96: $blockend = pack('a1a100a6a2a32a32a8a8a155a12',
! 97: $type,
! 98: $link,
! 99: 'ustar',
! 100: '00',
! 101: 'Pyrus',
! 102: 'Pyrus',
! 103: '',
! 104: '',
! 105: $filePrefix,
! 106: '');
! 107:
! 108: $checkheader = array_merge(str_split($block), str_split($blockend));
! 109: if (!function_exists('_pear2tarchecksum')) {
! 110: function _pear2tarchecksum($a, $b) {return $a + ord($b);}
! 111: }
! 112: $checksum = 256; // 8 * ord(' ');
! 113: $checksum += array_reduce($checkheader, '_pear2tarchecksum');
! 114:
! 115: if ($corrupt === 'checksum') $checksum++;
! 116: $checksum = pack('a8', sprintf('%6s ', decoct($checksum)));
! 117:
! 118: fwrite($this->tmp, $block . $checksum . $blockend, 512);
! 119: if (is_resource($fileOrStream)) {
! 120: stream_copy_to_stream($fileOrStream, $this->tmp);
! 121: if ($stat['size'] % 512) {
! 122: fwrite($this->tmp, str_repeat("\0", 512 - $stat['size'] % 512));
! 123: }
! 124: } else {
! 125: fwrite($this->tmp, $fileOrStream);
! 126: if (strlen($fileOrStream) && !isset($link) && strlen($fileOrStream) % 512) {
! 127: fwrite($this->tmp, str_repeat("\0", 512 - strlen($fileOrStream) % 512));
! 128: }
! 129: }
! 130: }
! 131:
! 132: /**
! 133: * Initialize the package creator
! 134: */
! 135: function init()
! 136: {
! 137: switch ($this->compress) {
! 138: case 'zlib' :
! 139: $this->tmp = gzopen($this->path, 'wb');
! 140: break;
! 141: case 'bz2' :
! 142: $this->tmp = bzopen($this->path, 'w');
! 143: break;
! 144: case 'none' :
! 145: $this->tmp = fopen($this->path, 'wb');
! 146: break;
! 147: default :
! 148: throw new Exception(
! 149: 'unknown compression type ' . $this->compress);
! 150: }
! 151: }
! 152:
! 153: /**
! 154: * Create an internal directory, creating parent directories as needed
! 155: *
! 156: * @param string $dir
! 157: */
! 158: function mkdir($dir)
! 159: {
! 160: $this->addFile($dir, "", array(
! 161: 'mode' => 0x4000 + 0644,
! 162: 'uid' => 0,
! 163: 'gid' => 0,
! 164: 'size' => 0,
! 165: 'mtime' => time(),
! 166: ));
! 167: }
! 168:
! 169: /**
! 170: * Finish saving the package
! 171: */
! 172: function close()
! 173: {
! 174: fwrite($this->tmp, pack('a1024', ''));
! 175: fclose($this->tmp);
! 176: }
! 177: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>