Annotation of embedaddon/php/ext/phar/tests/tar/files/corrupt_tarmaker.php.inc, revision 1.1.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>