Annotation of embedaddon/php/ext/phar/tests/tar/files/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 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)
                     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'] & 0x4000) {
                     60:             $type = 5;        // Directory
                     61:         } else if ($stat['mode'] & 0x8000) {
                     62:             $type = 0;        // Regular
                     63:         } else if ($stat['mode'] & 0xA000) {
                     64:             $type = 1;        // Link
                     65:             $link = @readlink($current);
                     66:         } else {
                     67:             $type = 9;        // Unknown
                     68:         }
                     69: 
                     70:         $filePrefix = '';
                     71:         if (strlen($path) > 255) {
                     72:             throw new Exception(
                     73:                 "$path is too long, must be 255 characters or less"
                     74:             );
                     75:         } else if (strlen($path) > 100) {
                     76:             $filePrefix = substr($path, 0, strlen($path)-100);
                     77:             $path = substr($path, -100);
                     78:         }
                     79: 
                     80:         $block = pack('a100a8a8a8a12A12',
                     81:                 $path,
                     82:                 decoct($stat['mode']),
                     83:                 sprintf('%6s ',decoct($stat['uid'])),
                     84:                 sprintf('%6s ',decoct($stat['gid'])),
                     85:                 sprintf('%11s ',decoct($stat['size'])),
                     86:                 sprintf('%11s ',decoct($stat['mtime']))
                     87:             );
                     88: 
                     89:         $blockend = pack('a1a100a6a2a32a32a8a8a155a12',
                     90:             $type,
                     91:             $link,
                     92:             'ustar',
                     93:             '00',
                     94:             'Pyrus',
                     95:             'Pyrus',
                     96:             '',
                     97:             '',
                     98:             $filePrefix,
                     99:             '');
                    100: 
                    101:         $checkheader = array_merge(str_split($block), str_split($blockend));
                    102:         if (!function_exists('_pear2tarchecksum')) {
                    103:             function _pear2tarchecksum($a, $b) {return $a + ord($b);}
                    104:         }
                    105:         $checksum = 256; // 8 * ord(' ');
                    106:         $checksum += array_reduce($checkheader, '_pear2tarchecksum');
                    107: 
                    108:         $checksum = pack('a8', sprintf('%6s ', decoct($checksum)));
                    109: 
                    110:         fwrite($this->tmp, (binary)$block . $checksum . $blockend, 512);
                    111:         if (is_resource($fileOrStream)) {
                    112:             stream_copy_to_stream($fileOrStream, $this->tmp);
                    113:             if ($stat['size'] % 512) {
                    114:                 fwrite($this->tmp, (binary)str_repeat("\0", 512 - $stat['size'] % 512));
                    115:             }
                    116:         } else {
                    117:             fwrite($this->tmp, (binary)$fileOrStream);
                    118:             if (strlen($fileOrStream) % 512) {
                    119:                 fwrite($this->tmp, (binary)str_repeat("\0", 512 - strlen($fileOrStream) % 512));
                    120:             }
                    121:         }
                    122:     }
                    123: 
                    124:     /**
                    125:      * Initialize the package creator
                    126:      */
                    127:     function init()
                    128:     {
                    129:         switch ($this->compress) {
                    130:             case 'zlib' :
                    131:                 $this->tmp = gzopen($this->path, 'wb');
                    132:                 break;
                    133:             case 'bz2' :
                    134:                 $this->tmp = bzopen($this->path, 'w');
                    135:                 break;
                    136:             case 'none' :
                    137:                 $this->tmp = fopen($this->path, 'wb');
                    138:                 break;
                    139:             default :
                    140:                 throw new Exception(
                    141:                     'unknown compression type ' . $this->compress);
                    142:         }
                    143:     }
                    144: 
                    145:     /**
                    146:      * Create an internal directory, creating parent directories as needed
                    147:      * 
                    148:      * @param string $dir
                    149:      */
                    150:     function mkdir($dir)
                    151:     {
                    152:         $this->addFile($dir, "", array(
                    153:                     'mode' => 0x4000 + 0644,
                    154:                     'uid' => 0,
                    155:                     'gid' => 0,
                    156:                     'size' => 0,
                    157:                     'mtime' => time(),
                    158:                 ));
                    159:     }
                    160: 
                    161:     /**
                    162:      * Finish saving the package
                    163:      */
                    164:     function close()
                    165:     {
                    166:         fwrite($this->tmp, pack('a1024', ''));
                    167:         fclose($this->tmp);
                    168:     }
                    169: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>