• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/classes/general/tar_gz.php
  • Класс: CArchiver
  • Вызов: CArchiver::_readHeader
private function _readHeader($v_binary_data, &$v_header)
{
	if (strlen($v_binary_data) == 0)
	{
		$v_header['filename'] = '';
		return true;
	}

	if (strlen($v_binary_data) != 512)
	{
		$v_header['filename'] = '';
		$this->_arErrors[] = ["INV_BLOCK_SIZE", str_replace("#BLOCK_SIZE#", strlen($v_binary_data), GetMessage("MAIN_ARCHIVE_INV_BLOCK_SIZE"))];
		return false;
	}

	$v_checksum = 0;
	for ($i = 0; $i < 148; $i++)
	{
		$v_checksum += ord(substr($v_binary_data, $i, 1));
	}
	for ($i = 148; $i < 156; $i++)
	{
		$v_checksum += ord(' ');
	}
	for ($i = 156; $i < 512; $i++)
	{
		$v_checksum += ord(substr($v_binary_data, $i, 1));
	}

	//changed
	$v_data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor/a131prefix", $v_binary_data);

	$v_header['checksum'] = octdec(trim($v_data['checksum']));
	if ($v_header['checksum'] != $v_checksum)
	{
		$v_header['filename'] = '';

		if (($v_checksum == 256) && ($v_header['checksum'] == 0))
		{
			return true;
		}

		$this->_arErrors[] = ["INV_BLOCK_CHECK", GetMessage("MAIN_ARCHIVE_INV_BLOCK_CHECK1")];
		return false;
	}

	// ----- Extract the properties
	$v_header['filename'] = trim($v_data['prefix'] . "/" . $v_data['filename']);
	$v_header['mode'] = octdec(trim($v_data['mode']));
	$v_header['uid'] = octdec(trim($v_data['uid']));
	$v_header['gid'] = octdec(trim($v_data['gid']));
	$v_header['size'] = octdec(trim($v_data['size']));
	$v_header['mtime'] = octdec(trim($v_data['mtime']));
	if (($v_header['typeflag'] = $v_data['typeflag']) == "5")
	{
		$v_header['size'] = 0;
	}

	$v_header['filename'] = BitrixMainIOPath::normalize($v_header['filename']);

	return true;
}