Annotation of embedaddon/php/ext/phar/tests/tar/files/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 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>