%PDF- %PDF-
Direktori : /www/varak.net/nextcloud.varak.net/3rdparty/deepdiver1975/tarstreamer/src/ |
Current File : //www/varak.net/nextcloud.varak.net/3rdparty/deepdiver1975/tarstreamer/src/TarHeader.php |
<?php namespace ownCloud\TarStreamer; class TarHeader { private $name = ''; private $mode = '777'; private $uid = '0'; private $gid = '0'; private $size; private $mtime = ''; private $typeflag; private $linkname = ''; private $magic = 'ustar'; private $version = '00'; private $uname = ''; private $gname = ''; private $devmajor = ''; private $devminor = ''; private $prefix = ''; private $reserved = ''; public function setName($name) { $this->name = $name; return $this; } public function setSize($size) { $this->size = $size; return $this; } public function setMtime($mtime) { $this->mtime = $mtime; return $this; } public function setTypeflag($typeflag) { $this->typeflag = $typeflag; return $this; } public function setPrefix($prefix) { $this->prefix = $prefix; return $this; } public function getHeader() { $fields = [ ['a100', substr($this->name, 0, 100)], ['a8', str_pad($this->mode, 7, '0', STR_PAD_LEFT)], ['a8', decoct((int) str_pad($this->uid, 7, '0', STR_PAD_LEFT))], ['a8', decoct((int) str_pad($this->gid, 7, '0', STR_PAD_LEFT))], ['a12', str_pad(decoct((int)$this->size), 11, '0', STR_PAD_LEFT)], ['a12', str_pad(decoct((int)$this->mtime), 11, '0', STR_PAD_LEFT)], // We calculate checksum later ['a8', ''], ['a1', $this->typeflag], ['a100', $this->linkname], ['a6', $this->magic], ['a2', $this->version], ['a32', $this->uname], ['a32', $this->gname], ['a8', $this->devmajor], ['a8', $this->devminor], ['a155', substr($this->prefix, 0, 155)], ['a12', $this->reserved], ]; // pack fields and calculate "total" length $header = $this->packFields($fields); // Compute header checksum $checksum = str_pad(decoct($this->computeUnsignedChecksum($header)), 6, "0", STR_PAD_LEFT); for ($i = 0; $i < 6; $i++) { $header[(148 + $i)] = substr($checksum, $i, 1); } $header[154] = \chr(0); $header[155] = \chr(32); return $header; } /** * Create a format string and argument list for pack(), then call pack() and return the result. * * @param array $fields key being the format string and value being the data to pack * @return string binary packed data returned from pack() */ protected function packFields($fields) { list($fmt, $args) = ['', []]; // populate format string and argument list foreach ($fields as $field) { $fmt .= $field[0]; $args[] = $field[1]; } // prepend format string to argument list array_unshift($args, $fmt); // build output string from header and compressed data return \call_user_func_array('pack', $args); } /** * Generate unsigned checksum of header * * @param string $header * @return float|int unsigned checksum */ protected function computeUnsignedChecksum($header) { $unsignedChecksum = 0; for ($i = 0; $i < 512; $i++) { $unsignedChecksum += \ord($header[$i]); } for ($i = 0; $i < 8; $i++) { $unsignedChecksum -= \ord($header[148 + $i]); } $unsignedChecksum += \ord(" ") * 8; return $unsignedChecksum; } }