errorCode() public method

--------------------------------------------------------------------------------
public errorCode ( )
 protected function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)
 {
     $v_result = 1;
     // Read the file header
     if (($v_result = $this->privReadFileHeader($v_header)) != 1) {
         return $v_result;
     }
     // Check that the file header is coherent with $p_entry info
     if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
         // TBC
     }
     // Look for all path to remove
     if ($p_remove_all_path == true) {
         // Look for folder entry that not need to be extracted
         if (($p_entry['external'] & 0x10) == 0x10) {
             $p_entry['status'] = "filtered";
             return $v_result;
         }
         // Get the basename of the path
         $p_entry['filename'] = basename($p_entry['filename']);
     } else {
         if ($p_remove_path != '') {
             // Look for path to remove
             if (self::UtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) {
                 // Change the file status
                 $p_entry['status'] = 'filtered';
                 // Return
                 return $v_result;
             }
             $p_remove_path_size = strlen($p_remove_path);
             if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) {
                 // Remove the path
                 $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size);
             }
         }
     }
     // Add the path
     if ($p_path != '') {
         $p_entry['filename'] = $p_path . "/" . $p_entry['filename'];
     }
     // Check a base_dir_restriction
     if (isset($p_options[self::OPT_EXTRACT_DIR_RESTRICTION])) {
         $v_inclusion = self::UtilPathInclusion($p_options[self::OPT_EXTRACT_DIR_RESTRICTION], $p_entry['filename']);
         if ($v_inclusion == 0) {
             $this->privErrorLog(self::ERR_DIRECTORY_RESTRICTION, 'Filename \'' . $p_entry['filename'] . '\' is outside ' . self::OPT_EXTRACT_DIR_RESTRICTION);
             return self::errorCode();
         }
     }
     // Look for pre-extract callback
     if (isset($p_options[self::CB_PRE_EXTRACT])) {
         // Generate a local information
         $v_local_header = array();
         $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
         // Call the callback
         // Here I do not use call_user_func() because I need to send a reference to the header.
         //            eval('$v_result = '.$p_options[self::CB_PRE_EXTRACT].'(self::CB_PRE_EXTRACT, $v_local_header);');
         $v_result = $p_options[self::CB_PRE_EXTRACT](self::CB_PRE_EXTRACT, $v_local_header);
         if ($v_result == 0) {
             // Change the file status
             $p_entry['status'] = 'skipped';
             $v_result = 1;
         }
         // Look for abort result
         if ($v_result == 2) {
             // This status is internal and will be changed in 'skipped'
             $p_entry['status'] = 'aborted';
             $v_result = self::ERR_USER_ABORTED;
         }
         // Update the informations
         // Only some fields can be modified
         $p_entry['filename'] = $v_local_header['filename'];
     }
     // Look if extraction should be done
     if ($p_entry['status'] == 'ok') {
         // Look for specific actions while the file exist
         if (file_exists($p_entry['filename'])) {
             // Look if file is a directory
             if (is_dir($p_entry['filename'])) {
                 // Change the file status
                 $p_entry['status'] = 'already_a_directory';
                 // Look for self::OPT_STOP_ON_ERROR
                 // For historical reason first PclZip implementation does not stop
                 // when this kind of error occurs.
                 if (isset($p_options[self::OPT_STOP_ON_ERROR]) && $p_options[self::OPT_STOP_ON_ERROR] === true) {
                     $this->privErrorLog(self::ERR_ALREADY_A_DIRECTORY, 'Filename \'' . $p_entry['filename'] . '\' is already used by an existing directory');
                     return PclZip::errorCode();
                 }
             } else {
                 if (!is_writeable($p_entry['filename'])) {
                     // Look if file is write protected
                     // Change the file status
                     $p_entry['status'] = "write_protected";
                     // Look for self::OPT_STOP_ON_ERROR
                     // For historical reason first PclZip implementation does not stop
                     // when this kind of error occurs.
                     if (isset($p_options[self::OPT_STOP_ON_ERROR]) && $p_options[self::OPT_STOP_ON_ERROR] === true) {
                         $this->privErrorLog(self::ERR_WRITE_OPEN_FAIL, 'Filename \'' . $p_entry['filename'] . '\' exists and is write protected');
                         return PclZip::errorCode();
                     }
                 } else {
                     if (filemtime($p_entry['filename']) > $p_entry['mtime']) {
                         // Look if the extracted file is older
                         // Change the file status
                         if (isset($p_options[self::OPT_REPLACE_NEWER]) && $p_options[self::OPT_REPLACE_NEWER] === true) {
                             // do nothing
                         } else {
                             $p_entry['status'] = 'newer_exist';
                             // Look for self::OPT_STOP_ON_ERROR
                             // For historical reason first PclZip implementation does not stop
                             // when this kind of error occurs.
                             if (isset($p_options[self::OPT_STOP_ON_ERROR]) && $p_options[self::OPT_STOP_ON_ERROR] === true) {
                                 $this->privErrorLog(self::ERR_WRITE_OPEN_FAIL, 'Newer version of \'' . $p_entry['filename'] . '\' exists and option PCLZIP_OPT_REPLACE_NEWER is not selected');
                                 return self::errorCode();
                             }
                         }
                     } else {
                     }
                 }
             }
         } else {
             // Check the directory availability and create it if necessary
             if (($p_entry['external'] & 0x10) == 0x10 || substr($p_entry['filename'], -1) == '/') {
                 $v_dir_to_check = $p_entry['filename'];
             } else {
                 if (!strstr($p_entry['filename'], "/")) {
                     $v_dir_to_check = "";
                 } else {
                     $v_dir_to_check = dirname($p_entry['filename']);
                 }
             }
             if (($v_result = $this->privDirCheck($v_dir_to_check, ($p_entry['external'] & 0x10) == 0x10)) != 1) {
                 // Change the file status
                 $p_entry['status'] = 'path_creation_fail';
                 //return $v_result;
                 $v_result = 1;
             }
         }
     }
     // Look if extraction should be done
     if ($p_entry['status'] == 'ok') {
         // Do the extraction (if not a folder)
         if (!(($p_entry['external'] & 0x10) == 0x10)) {
             // Look for not compressed file
             if ($p_entry['compression'] == 0) {
                 // Opening destination file
                 if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {
                     // Change the file status
                     $p_entry['status'] = 'write_error';
                     return $v_result;
                 }
                 // Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks
                 $v_size = $p_entry['compressed_size'];
                 while ($v_size != 0) {
                     $v_read_size = $v_size < self::READ_BLOCK_SIZE ? $v_size : self::READ_BLOCK_SIZE;
                     $v_buffer = @fread($this->zip_fd, $v_read_size);
                     //                        $v_binary_data = pack('a'.$v_read_size, $v_buffer);
                     //                        @fwrite($v_dest_file, $v_binary_data, $v_read_size);
                     @fwrite($v_dest_file, $v_buffer, $v_read_size);
                     $v_size -= $v_read_size;
                 }
                 // Closing the destination file
                 fclose($v_dest_file);
                 // Change the file mtime
                 touch($p_entry['filename'], $p_entry['mtime']);
             } else {
                 // TBC
                 // Need to be finished
                 if (($p_entry['flag'] & 1) == 1) {
                     $this->privErrorLog(self::ERR_UNSUPPORTED_ENCRYPTION, 'File \'' . $p_entry['filename'] . '\' is encrypted. Encrypted files are not supported.');
                     return self::errorCode();
                 }
                 // Look for using temporary file to unzip
                 if (!isset($p_options[self::OPT_TEMP_FILE_OFF]) && (isset($p_options[self::OPT_TEMP_FILE_ON]) || isset($p_options[self::OPT_TEMP_FILE_THRESHOLD]) && $p_options[self::OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) {
                     $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options);
                     if ($v_result < self::ERR_NO_ERROR) {
                         return $v_result;
                     }
                 } else {
                     // Look for extract in memory
                     // Read the compressed file in a buffer (one shot)
                     $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
                     // Decompress the file
                     $v_file_content = @gzinflate($v_buffer);
                     unset($v_buffer);
                     if ($v_file_content === false) {
                         // Change the file status
                         // TBC
                         $p_entry['status'] = "error";
                         return $v_result;
                     }
                     // Opening destination file
                     if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {
                         // Change the file status
                         $p_entry['status'] = "write_error";
                         return $v_result;
                     }
                     // Write the uncompressed data
                     @fwrite($v_dest_file, $v_file_content, $p_entry['size']);
                     unset($v_file_content);
                     // Closing the destination file
                     @fclose($v_dest_file);
                 }
                 // Change the file mtime
                 @touch($p_entry['filename'], $p_entry['mtime']);
             }
             // Look for chmod option
             if (isset($p_options[self::OPT_SET_CHMOD])) {
                 // Change the mode of the file
                 @chmod($p_entry['filename'], $p_options[self::OPT_SET_CHMOD]);
             }
         }
     }
     // Change abort status
     if ($p_entry['status'] == "aborted") {
         $p_entry['status'] = "skipped";
     } elseif (isset($p_options[self::CB_POST_EXTRACT])) {
         // Look for post-extract callback
         // Generate a local information
         $v_local_header = array();
         $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
         // Call the callback
         // Here I do not use call_user_func() because I need to send a reference to the header.
         //            eval('$v_result = '.$p_options[self::CB_POST_EXTRACT].'(self::CB_POST_EXTRACT, $v_local_header);');
         $v_result = $p_options[self::CB_POST_EXTRACT](self::CB_POST_EXTRACT, $v_local_header);
         // Look for abort result
         if ($v_result == 2) {
             $v_result = self::ERR_USER_ABORTED;
         }
     }
     return $v_result;
 }
示例#2
0
文件: install.php 项目: antiherro/smm
 function privDuplicate($p_archive_filename)
 {
     $v_result = 1;
     if (!is_file($p_archive_filename)) {
         $v_result = 1;
         return $v_result;
     }
     if (($v_result = $this->privOpenFd('wb')) != 1) {
         return $v_result;
     }
     if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) {
         $this->privCloseFd();
         PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \'' . $p_archive_filename . '\' in binary write mode');
         return PclZip::errorCode();
     }
     $v_size = filesize($p_archive_filename);
     while ($v_size != 0) {
         $v_read_size = $v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE;
         $v_buffer = fread($v_zip_temp_fd, $v_read_size);
         @fwrite($this->zip_fd, $v_buffer, $v_read_size);
         $v_size -= $v_read_size;
     }
     $this->privCloseFd();
     @fclose($v_zip_temp_fd);
     return $v_result;
 }
示例#3
0
 /**
  *	add_directory_to_zip()
  *
  *	Adds a directory to a new or existing (TODO: not yet available) ZIP file.
  *
  *	$zip_file					string						Full path & filename of ZIP file to create.
  *	$add_directory				string						Full directory to add to zip file.
  *	$compression				boolean						True to enable ZIP compression,
  *															(if possible with available zip methods)
  *	$excludes					array(strings)				Array of strings of paths/files to exclude from zipping,
  *															(if possible with available zip methods).
  *	$temporary_zip_directory	string						Optional. Full directory path to directory to temporarily place ZIP
  *															file while creating. Uses same directory if omitted.
  *	$force_compatibility_mode	boolean						True: only use PCLZip. False: try exec first if available,
  *															and fallback to lesser methods as required.
  *
  *	@return													true on success, false otherwise
  *
  */
 function add_directory_to_zip($zip_file, $add_directory, $compression, $excludes = array(), $temporary_zip_directory = '', $force_compatibility_mode = false)
 {
     if ($force_compatibility_mode === true) {
         $zip_methods = array('pclzip');
         pb_backupbuddy::status('message', __('Forced compatibility mode (PCLZip) based on settings. This is slower and less reliable.', 'it-l10n-backupbuddy'));
     } else {
         $zip_methods = $this->_zip_methods;
         pb_backupbuddy::status('details', __('Using all available zip methods in preferred order.', 'it-l10n-backupbuddy'));
     }
     $append = false;
     // Possible future option to allow appending if file exists.
     // Normalize $temporary_zip_directory to format: /xxx/yyy/zzz/.
     $temporary_zip_directory = rtrim($temporary_zip_directory, '/\\') . '/';
     if (!empty($temporary_zip_directory)) {
         if (!file_exists($temporary_zip_directory)) {
             // Create temp dir if it does not exist.
             mkdir($temporary_zip_directory);
         }
     }
     if (is_array($excludes)) {
         $excludes_text = implode(',', $excludes);
     } else {
         $excludes_text = '(in file: `' . $excludes . '`)';
     }
     pb_backupbuddy::status('details', __('Creating ZIP file', 'it-l10n-backupbuddy') . ' `' . $zip_file . '`. ' . __('Adding directory', 'it-l10n-backupbuddy') . ' `' . $add_directory . '`. ' . __('Compression', 'it-l10n-backupbuddy') . ': ' . $compression . '; ' . __('Excludes', 'it-l10n-backupbuddy') . ': ' . $excludes_text);
     unset($excludes_text);
     if (in_array('exec', $zip_methods)) {
         pb_backupbuddy::status('details', __('Using exec() method for ZIP.', 'it-l10n-backupbuddy'));
         $command = 'zip -q -r';
         if ($compression !== true) {
             $command .= ' -0';
             pb_backupbuddy::status('details', __('Exec compression disabled based on settings.', 'it-l10n-backupbuddy'));
         }
         if (file_exists($zip_file)) {
             if ($append === true) {
                 pb_backupbuddy::status('details', __('ZIP file exists. Appending based on options.', 'it-l10n-backupbuddy'));
                 $command .= ' -g';
             } else {
                 pb_backupbuddy::status('details', __('ZIP file exists. Deleting & writing based on options.', 'it-l10n-backupbuddy'));
                 unlink($zip_file);
             }
         }
         //$command .= " -r";
         // Set temporary directory to store ZIP while it's being generated.
         if (!empty($temporary_zip_directory)) {
             $command .= " -b '{$temporary_zip_directory}'";
         }
         $command .= " '{$zip_file}' .";
         // -i '*'"; // Not needed. Zip defaults to doing this. Removed July 10, 2012 for v3.0.41.
         // Handle exclusions by placing them in an exclusion text file.
         $exclusion_file = $temporary_zip_directory . 'exclusions.txt';
         $this->_render_exclusions_file($exclusion_file, $excludes);
         pb_backupbuddy::status('details', 'Using exclusion file `' . $exclusion_file . '`.');
         $command .= ' -x@' . "'{$exclusion_file}'";
         $command .= ' 2>&1';
         //  2>&1 redirects STDERR to STDOUT
         $working_dir = getcwd();
         chdir($add_directory);
         // Change directory to the path we are adding.
         if ($this->_execpath != '') {
             pb_backupbuddy::status('details', __('Using custom exec() path: ', 'it-l10n-backupbuddy') . $this->_execpath);
         }
         // Run ZIP command.
         if (stristr(PHP_OS, 'WIN') && !stristr(PHP_OS, 'DARWIN')) {
             // Running Windows. (not darwin)
             if (file_exists(ABSPATH . 'zip.exe')) {
                 pb_backupbuddy::status('message', __('Attempting to use provided Windows zip.exe.', 'it-l10n-backupbuddy'));
                 $command = str_replace('\'', '"', $command);
                 // Windows wants double quotes
                 $command = ABSPATH . $command;
             }
             pb_backupbuddy::status('details', __('Exec command (Windows)', 'it-l10n-backupbuddy') . ': ' . $command);
             list($exec_output, $exec_exit_code) = $this->_commandbuddy->execute($this->_execpath . $command);
         } else {
             // Allow exec warnings not in Windows
             pb_backupbuddy::status('details', __('Exec command (Linux)', 'it-l10n-backupbuddy') . ': ' . $command);
             list($exec_output, $exec_exit_code) = $this->_commandbuddy->execute($this->_execpath . $command);
         }
         // Cleanup exclusions file if it exists.
         if (file_exists($temporary_zip_directory . 'exclusions.txt')) {
             @unlink($temporary_zip_directory . 'exclusions.txt');
         }
         sleep(1);
         // We may not have a zip file or we may have one but there was error/warning when producing it
         // Note: In event of warnings we could still get a zip file if the script terminates whilst zip command still running
         if (!file_exists($zip_file) || $exec_exit_code != 0) {
             // Log the failure
             pb_backupbuddy::status('message', __('Full speed mode did not complete. Trying compatibility mode next.', 'it-l10n-backupbuddy'));
             // Check whether a zip file was actually produced in the backups directory (as opposed to the temp zip directory)
             if (!file_exists($zip_file)) {
                 pb_backupbuddy::status('details', __('Exec command ran but ZIP file did not exist.', 'it-l10n-backupbuddy'));
             }
             // We did get a zip file but cannot truest it so must delete it
             if (file_exists($zip_file)) {
                 pb_backupbuddy::status('details', __('Cleaning up damaged ZIP file. Issue #3489328998.', 'it-l10n-backupbuddy'));
                 unlink($zip_file);
             }
             // Need to clean up any temporary zip directory
             if (file_exists($temporary_zip_directory)) {
                 pb_backupbuddy::status('details', __('Cleaning up incomplete temporary ZIP file. Issue #343894.', 'it-l10n-backupbuddy'));
                 if (!$this->delete_directory_recursive($temporary_zip_directory)) {
                     pb_backupbuddy::status('details', __('Unable to delete temporary zip directory', 'it-l10n-backupbuddy'));
                 }
             }
         } else {
             // We got a zip file and no errors/warnings so good to go
             pb_backupbuddy::status('message', __('Full speed mode completed & generated ZIP file.', 'it-l10n-backupbuddy'));
             if (!$this->delete_directory_recursive($temporary_zip_directory)) {
                 pb_backupbuddy::status('details', __('Unable to delete temporary zip directory', 'it-l10n-backupbuddy'));
             }
             return true;
         }
         chdir($working_dir);
         unset($command);
         unset($exclude);
         unset($excluding_additional);
         pb_backupbuddy::status('details', __('Exec command did not succeed. Falling back.', 'it-l10n-backupbuddy'));
     }
     if (in_array('pclzip', $zip_methods)) {
         pb_backupbuddy::status('message', __('Using Compatibility Mode for ZIP. This is slower and less reliable.', 'it-l10n-backupbuddy'));
         pb_backupbuddy::status('message', __('If your backup times out in compatibility mode try disabled zip compression.', 'it-l10n-backupbuddy'));
         pb_backupbuddy::status('message', __('WARNING: Directory/file exclusion unavailable in Compatibility Mode. Even existing old backups will be backed up.', 'it-l10n-backupbuddy'));
         require_once ABSPATH . 'wp-admin/includes/class-pclzip.php';
         // Determine zip file name / path.
         if (!empty($temporary_zip_directory)) {
             $pclzip_file = $temporary_zip_directory . basename($zip_file);
         } else {
             $pclzip_file = $zip_file;
         }
         if (!file_exists(dirname($pclzip_file))) {
             pb_backupbuddy::status('details', 'Creating PCLZip file directory `' . dirname($pclzip_file) . '`.');
             mkdir(dirname($pclzip_file));
         }
         // Instantiate PclZip Object.
         pb_backupbuddy::status('details', 'PclZip zip filename: `' . $pclzip_file . '`.');
         $pclzip = new PclZip($pclzip_file);
         if ($compression !== true) {
             pb_backupbuddy::status('details', __('PCLZip compression disabled based on settings.', 'it-l10n-backupbuddy'));
             $arguments = array($add_directory, PCLZIP_OPT_NO_COMPRESSION, PCLZIP_OPT_REMOVE_PATH, $add_directory);
         } else {
             pb_backupbuddy::status('details', __('PCLZip compression enabled based on settings.', 'it-l10n-backupbuddy'));
             $arguments = array($add_directory, PCLZIP_OPT_REMOVE_PATH, $add_directory);
         }
         $mode = 'create';
         if (file_exists($zip_file) && $append === true) {
             pb_backupbuddy::status('details', __('ZIP file exists. Appending based on options.', 'it-l10n-backupbuddy'));
             $mode = 'append';
         }
         if ($mode == 'append') {
             pb_backupbuddy::status('details', __('Appending to ZIP file via PCLZip.', 'it-l10n-backupbuddy'));
             $retval = call_user_func_array(array(&$pclzip, 'add'), $arguments);
         } else {
             // create
             pb_backupbuddy::status('details', __('Creating ZIP file via PCLZip', 'it-l10n-backupbuddy') . ':' . implode(';', $arguments));
             //error_log( 'pclzip args: ' . print_r( $arguments, true ) . "\n" );
             $retval = call_user_func_array(array(&$pclzip, 'create'), $arguments);
         }
         // Move the zip file if we were creating it in a temporary directory
         if (!empty($temporary_zip_directory)) {
             if (file_exists($temporary_zip_directory . basename($zip_file))) {
                 pb_backupbuddy::status('details', __('Renaming PCLZip File...', 'it-l10n-backupbuddy'));
                 rename($temporary_zip_directory . basename($zip_file), $zip_file);
                 if (file_exists($zip_file)) {
                     pb_backupbuddy::status('details', __('Renaming PCLZip success.', 'it-l10n-backupbuddy'));
                 } else {
                     pb_backupbuddy::status('details', __('Renaming PCLZip failure.', 'it-l10n-backupbuddy'));
                 }
             } else {
                 pb_backupbuddy::status('details', __('Temporary PCLZip archive file expected but not found. Please verify permissions on the ZIP archive directory.', 'it-l10n-backupbuddy'));
             }
         }
         // Work out whether we have a problem or not
         if (is_array($retval)) {
             // It's an array so a good result
             $exitcode = 0;
         } else {
             // Not an array so a bad error code
             $exitcode = $pclzip->errorCode();
         }
         // Convenience for handling different scanarios
         $result = false;
         // See if we can figure out what happened - note that $exitcode could be non-zero for a warning or error
         // There may be no zip file at all if there was a problem creating it or it may be left in the temp
         // directory if it couldn't be moved
         if (!file_exists($zip_file) || $exitcode != 0) {
             // If we had a non-zero exit code then should report it (file may or may not be created)
             if ($exitcode != 0) {
                 pb_backupbuddy::status('details', __('Zip process exit code: ', 'it-l10n-backupbuddy') . $exitcode);
             }
             // Report whether or not the zip file was created
             if (!file_exists($zip_file)) {
                 pb_backupbuddy::status('details', __('Zip Archive file not created - check process exit code.', 'it-l10n-backupbuddy'));
             } else {
                 pb_backupbuddy::status('details', __('Zip Archive file created but will be removed - check process exit code.', 'it-l10n-backupbuddy'));
                 @unlink($zip_file);
             }
             // Put the error information into an array for consistency
             $zip_output[] = $pclzip->errorInfo(true);
             // Now we don't move it (because either it doesn't exist or may be incomplete) but we'll show any error/wartning output
             if (!empty($zip_output)) {
                 // Assume we don't have a lot of lines for now - could be risky assumption!
                 foreach ($zip_output as $line) {
                     pb_backupbuddy::status('details', __('Zip process reported: ', 'it-l10n-backupbuddy') . $line);
                 }
                 // Extra details for particular error
                 if (false !== strpos($pclzip->errorInfo(true), 'PCLZIP_ERR_READ_OPEN_FAIL')) {
                     pb_backupbuddy::status('details', __('PCLZIP_ERR_READ_OPEN_FAIL details: This error indicates that fopen failed (returned false) when trying to open the file in the mode specified. This is almost always due to permissions.', 'it-l10n-backupbuddy'));
                 }
             }
             // One way or another we failed
             $result = false;
         } else {
             // Got file with no error or warnings at all so it should be good to go
             if (file_exists($zip_file)) {
                 pb_backupbuddy::status('details', __('Zip Archive file moved to local archive directory.', 'it-l10n-backupbuddy'));
                 pb_backupbuddy::status('message', __('Zip Archive file successfully created with no errors or warnings.', 'it-l10n-backupbuddy'));
                 $result = true;
             } else {
                 pb_backupbuddy::status('details', __('Zip Archive file could not be moved to local archive directory.', 'it-l10n-backupbuddy'));
                 $result = false;
             }
         }
         if (!empty($temporary_zip_directory)) {
             // Cleanup the temporary directory that will have all detritus and maybe incomplete zip file
             pb_backupbuddy::status('details', __('Removing temporary directory.', 'it-l10n-backupbuddy'));
             if (!$this->delete_directory_recursive($temporary_zip_directory)) {
                 pb_backupbuddy::status('details', __('Temporary directory could not be deleted: ', 'it-l10n-backupbuddy') . $temporary_zip_directory);
             }
         }
         if ($result) {
             return $result;
         }
     }
     // If we made it this far then something didnt result in a success.
     return false;
 }
示例#4
0
 /**
  * do the work
  * @throws BuildException
  */
 public function main()
 {
     if ($this->zipFile === null) {
         throw new BuildException("zipFile attribute must be set!", $this->getLocation());
     }
     if ($this->zipFile->exists() && $this->zipFile->isDirectory()) {
         throw new BuildException("zipFile is a directory!", $this->getLocation());
     }
     if ($this->zipFile->exists() && !$this->zipFile->canWrite()) {
         throw new BuildException("Can not write to the specified zipFile!", $this->getLocation());
     }
     // shouldn't need to clone, since the entries in filesets
     // themselves won't be modified -- only elements will be added
     $savedFileSets = $this->filesets;
     try {
         if (empty($this->filesets)) {
             throw new BuildException("You must supply some nested filesets.", $this->getLocation());
         }
         $this->log("Building ZIP: " . $this->zipFile->__toString(), Project::MSG_INFO);
         $zip = new PclZip($this->zipFile->getAbsolutePath());
         if ($zip->errorCode() != 1) {
             throw new Exception("PclZip::open() failed: " . $zip->errorInfo());
         }
         foreach ($this->filesets as $fs) {
             $files = $fs->getFiles($this->project, $this->includeEmpty);
             $fsBasedir = null != $this->baseDir ? $this->baseDir : $fs->getDir($this->project);
             $filesToZip = array();
             for ($i = 0, $fcount = count($files); $i < $fcount; $i++) {
                 $f = new PhingFile($fsBasedir, $files[$i]);
                 //$filesToZip[] = realpath($f->getPath());
                 $fileAbsolutePath = $f->getPath();
                 $fileDir = rtrim(dirname($fileAbsolutePath), '/\\');
                 $fileBase = basename($fileAbsolutePath);
                 if (substr($fileDir, -4) == '.svn') {
                     continue;
                 }
                 if ($fileBase == '.svn') {
                     continue;
                 }
                 if (substr(rtrim($fileAbsolutePath, '/\\'), -4) == '.svn') {
                     continue;
                 }
                 if ($fileBase == '.gitignore') {
                     continue;
                 }
                 if (strtolower($fileBase) == '.ds_store') {
                     continue;
                 }
                 if ($fileBase == 'Thumbs.db') {
                     continue;
                 }
                 //echo "\t\t$fileAbsolutePath\n";
                 $filesToZip[] = $f->getPath();
             }
             /*
             $zip->add($filesToZip,
             	PCLZIP_OPT_ADD_PATH, is_null($this->prefix) ? '' : $this->prefix ,
             	PCLZIP_OPT_REMOVE_PATH, realpath($fsBasedir->getPath()) );
             */
             $zip->add($filesToZip, PCLZIP_OPT_ADD_PATH, is_null($this->prefix) ? '' : $this->prefix, PCLZIP_OPT_REMOVE_PATH, $fsBasedir->getPath());
         }
     } catch (IOException $ioe) {
         $msg = "Problem creating ZIP: " . $ioe->getMessage();
         $this->filesets = $savedFileSets;
         throw new BuildException($msg, $ioe, $this->getLocation());
     }
     $this->filesets = $savedFileSets;
 }
示例#5
0
 function _compressFiles($name)
 {
     require_once MAX_PATH . '/lib/pclzip/pclzip.lib.php';
     define('OS_WINDOWS', substr(PHP_OS, 0, 3) == 'WIN' ? 1 : 0);
     $target = $this->outputDir . $name . '.zip';
     $oZip = new PclZip($target);
     $result = $oZip->create($this->aFileList, PCLZIP_OPT_REMOVE_PATH, $this->basePath);
     if ($oZip->errorCode()) {
         $this->aErrors[] = 'compression error: ' . $oZip->errorName(true);
         return false;
     }
     if (!$result || !count($result)) {
         $this->aErrors[] = 'no files were compressed';
         return false;
     }
     //$aContents = $oZip->listContent();
     $error = !file_exists($target);
     if (!$error) {
         foreach ($result as $i => $aInfo) {
             if ($aInfo['status'] != 'ok') {
                 switch ($aInfo['status']) {
                     case 'filename_too_long':
                     case 'write_error':
                     case 'read_error':
                     case 'invalid_header':
                         $this->aErrors[] = 'Error: ' . $aInfo['status'] . ' : ' . $aInfo['filename'];
                         $error = true;
                         break;
                     case 'filtered':
                     case 'skipped':
                     default:
                         break;
                 }
             }
         }
     }
     return $error ? false : $target;
 }
示例#6
0
 /**
  *	create()
  *	
  *	A function that creates an archive file
  *	
  *	The $excludes will be a list or relative path excludes if the $listmaker object is NULL otehrwise
  *	will be absolute path excludes and relative path excludes can be had from the $listmaker object
  *	
  *	@param		string	$zip			Full path & filename of ZIP Archive file to create
  *	@param		string	$dir			Full path of directory to add to ZIP Archive file
  *	@param		bool	$compression	True to enable compression of files added to ZIP Archive file
  *	@parame		array	$excludes		List of either absolute path exclusions or relative exclusions
  *	@param		string	$tempdir		Full path of directory for temporary usage
  *	@param		object	$listmaker		The object from which we can get an inclusions list
  *	@return		bool					True if the creation was successful, false otherwise
  *
  */
 public function create($zip, $dir, $compression, $excludes, $tempdir, $listmaker = NULL)
 {
     $exitcode = 0;
     $zip_output = array();
     $temp_zip = '';
     $excluding_additional = false;
     $exclude_count = 0;
     $exclusions = array();
     // The basedir must have a trailing directory separator
     $basedir = rtrim(trim($dir), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
     $this->status('message', __('Using Compatibility Mode.', 'it-l10n-backupbuddy'));
     $this->status('message', __('If your backup times out in Compatibility Mode try disabling zip compression in Settings.', 'it-l10n-backupbuddy'));
     require_once ABSPATH . 'wp-admin/includes/class-pclzip.php';
     if (empty($tempdir) || !file_exists($tempdir)) {
         $this->status('details', __('Temporary working directory must be available.', 'it-l10n-backupbuddy'));
         return false;
     }
     // Decide whether we are offering exclusions or not
     // Note that unlike proc and zip we always use inclusion if available to offer exclusion capability for pclzip
     if (is_object($listmaker)) {
         // Need to get the relative exclusions so we can log what is being excluded...
         $exclusions = $listmaker->get_relative_excludes($basedir);
         // Build the exclusion list - first the relative directories
         if (count($exclusions) > 0) {
             $this->status('details', __('Calculating directories to exclude from backup.', 'it-l10n-backupbuddy'));
             foreach ($exclusions as $exclude) {
                 if (!strstr($exclude, 'backupbuddy_backups')) {
                     // Set variable to show we are excluding additional directories besides backup dir.
                     $excluding_additional = true;
                 }
                 $this->status('details', __('Excluding', 'it-l10n-backupbuddy') . ': ' . $exclude);
                 $exclude_count++;
             }
         }
         if ($excluding_additional === true) {
             $this->status('message', __('Excluding archives directory and additional directories defined in settings.', 'it-l10n-backupbuddy') . ' ' . $exclude_count . ' ' . __('total', 'it-l10n-backupbuddy') . '.');
         } else {
             $this->status('message', __('Only excluding archives directory based on settings.', 'it-l10n-backupbuddy') . ' ' . $exclude_count . ' ' . __('total', 'it-l10n-backupbuddy') . '.');
         }
         // Now get the list from the top node
         $the_list = $listmaker->get_terminals();
         // Retain this for reference for now
         file_put_contents(dirname($tempdir) . DIRECTORY_SEPARATOR . self::ZIP_CONTENT_FILE_NAME, print_r($the_list, true));
     } else {
         // We don't have the inclusion list so we are not offering exclusions
         $this->status('message', __('WARNING: Directory/file exclusion unavailable in Compatibility Mode. Even existing old backups will be backed up.', 'it-l10n-backupbuddy'));
         $the_list = array($dir);
     }
     // Get started with out zip object
     // Put our final zip file in the temporary directory - it will be moved later
     $temp_zip = $tempdir . basename($zip);
     $pclzip = new PclZip($temp_zip);
     if ($compression !== true) {
         $this->status('details', __('Compression disabled based on settings.', 'it-l10n-backupbuddy'));
         $arguments = array($the_list, PCLZIP_OPT_NO_COMPRESSION, PCLZIP_OPT_REMOVE_PATH, $dir);
     } else {
         $arguments = array($the_list, PCLZIP_OPT_REMOVE_PATH, $dir);
     }
     if (file_exists($zip)) {
         $this->status('details', __('Existing ZIP Archive file will be replaced.', 'it-l10n-backupbuddy'));
         unlink($zip);
     }
     // Now actually create the zip archive file
     $this->status('details', $this->get_method_tag() . __(' commmand arguments', 'it-l10n-backupbuddy') . ': ' . implode(';', $arguments));
     $retval = call_user_func_array(array(&$pclzip, 'create'), $arguments);
     // Work out whether we have a problem or not
     if (is_array($retval)) {
         // It's an array so a good result
         $exitcode = 0;
     } else {
         // Not an array so a bad error code
         $exitcode = $pclzip->errorCode();
     }
     // Convenience for handling different scanarios
     $result = false;
     // See if we can figure out what happened - note that $exitcode could be non-zero for a warning or error
     if (!file_exists($temp_zip) || $exitcode != 0) {
         // If we had a non-zero exit code then should report it (file may or may not be created)
         if ($exitcode != 0) {
             $this->status('details', __('Zip process exit code: ', 'it-l10n-backupbuddy') . $exitcode);
         }
         // Report whether or not the zip file was created
         if (!file_exists($temp_zip)) {
             $this->status('details', __('Zip Archive file not created - check process exit code.', 'it-l10n-backupbuddy'));
         } else {
             $this->status('details', __('Zip Archive file created - check process exit code.', 'it-l10n-backupbuddy'));
         }
         // Put the error information into an array for consistency
         $zip_output[] = $pclzip->errorInfo(true);
         // Now we don't move it (because either it doesn't exist or may be incomplete) but we'll show any error/wartning output
         if (!empty($zip_output)) {
             // Assume we don't have a lot of lines for now - could be risky assumption!
             foreach ($zip_output as $line) {
                 $this->status('details', __('Zip process reported: ', 'it-l10n-backupbuddy') . $line);
             }
         }
         $result = false;
     } else {
         // Got file with no error or warnings at all so just move it to the local archive
         $this->status('details', __('Moving Zip Archive file to local archive directory.', 'it-l10n-backupbuddy'));
         rename($temp_zip, $zip);
         if (file_exists($zip)) {
             $this->status('details', __('Zip Archive file moved to local archive directory.', 'it-l10n-backupbuddy'));
             $this->status('message', __('Zip Archive file successfully created with no errors or warnings.', 'it-l10n-backupbuddy'));
             $result = true;
         } else {
             $this->status('details', __('Zip Archive file could not be moved to local archive directory.', 'it-l10n-backupbuddy'));
             $result = false;
         }
     }
     // Cleanup the temporary directory that will have all detritus and maybe incomplete zip file
     $this->status('details', __('Removing temporary directory.', 'it-l10n-backupbuddy'));
     if (!$this->delete_directory_recursive($tempdir)) {
         $this->status('details', __('Temporary directory could not be deleted: ', 'it-l10n-backupbuddy') . $tempdir);
     }
     return $result;
 }
示例#7
0
 private function makezip_addfiles()
 {
     global $updraftplus;
     # Used to detect requests to bump the size
     $bump_index = false;
     $zipfile = $this->zip_basename . ($this->index == 0 ? '' : $this->index + 1) . '.zip.tmp';
     $maxzipbatch = $updraftplus->jobdata_get('maxzipbatch', 26214400);
     if ((int) $maxzipbatch < 1) {
         $maxzipbatch = 26214400;
     }
     // Short-circuit the null case, because we want to detect later if something useful happenned
     if (count($this->zipfiles_dirbatched) == 0 && count($this->zipfiles_batched) == 0) {
         return true;
     }
     # If on PclZip, then if possible short-circuit to a quicker method (makes a huge time difference - on a folder of 1500 small files, 2.6s instead of 76.6)
     # This assumes that makezip_addfiles() is only called once so that we know about all needed files (the new style)
     # This is rather conservative - because it assumes zero compression. But we can't know that in advance.
     if (0 == $this->index && 'UpdraftPlus_PclZip' == $this->use_zip_object && $this->makezip_recursive_batchedbytes < $this->zip_split_every && ($this->makezip_recursive_batchedbytes < 512 * 1024 * 1024 || defined('UPDRAFTPLUS_PCLZIP_FORCEALLINONE') && UPDRAFTPLUS_PCLZIP_FORCEALLINONE == true)) {
         $updraftplus->log("PclZip, and only one archive required - will attempt to do in single operation (data: " . round($this->makezip_recursive_batchedbytes / 1024, 1) . " Kb, split: " . round($this->zip_split_every / 1024, 1) . " Kb)");
         if (!class_exists('PclZip')) {
             require_once ABSPATH . '/wp-admin/includes/class-pclzip.php';
         }
         $zip = new PclZip($zipfile);
         $remove_path = $this->whichone == 'wpcore' ? untrailingslashit(ABSPATH) : WP_CONTENT_DIR;
         $add_path = false;
         // Remove prefixes
         $backupable_entities = $updraftplus->get_backupable_file_entities(true);
         if (isset($backupable_entities[$this->whichone])) {
             if ('plugins' == $this->whichone || 'themes' == $this->whichone || 'uploads' == $this->whichone) {
                 $remove_path = dirname($backupable_entities[$this->whichone]);
                 # To normalise instead of removing (which binzip doesn't support, so we don't do it), you'd remove the dirname() in the above line, and uncomment the below one.
                 #$add_path = $this->whichone;
             } else {
                 $remove_path = $backupable_entities[$this->whichone];
             }
         }
         if ($add_path) {
             $zipcode = $zip->create($this->source, PCLZIP_OPT_REMOVE_PATH, $remove_path, PCLZIP_OPT_ADD_PATH, $add_path);
         } else {
             $zipcode = $zip->create($this->source, PCLZIP_OPT_REMOVE_PATH, $remove_path);
         }
         if ($zipcode == 0) {
             $updraftplus->log("PclZip Error: " . $zip->errorInfo(true), 'warning');
             return $zip->errorCode();
         } else {
             return true;
         }
     }
     // 05-Mar-2013 - added a new check on the total data added; it appears that things fall over if too much data is contained in the cumulative total of files that were addFile'd without a close-open cycle; presumably data is being stored in memory. In the case in question, it was a batch of MP3 files of around 100Mb each - 25 of those equals 2.5Gb!
     $data_added_since_reopen = 0;
     # The following array is used only for error reporting if ZipArchive::close fails (since that method itself reports no error messages - we have to track manually what we were attempting to add)
     $files_zipadded_since_open = array();
     $zip = new $this->use_zip_object();
     if (file_exists($zipfile)) {
         $opencode = $zip->open($zipfile);
         $original_size = filesize($zipfile);
         clearstatcache();
     } else {
         $create_code = defined('ZIPARCHIVE::CREATE') ? ZIPARCHIVE::CREATE : 1;
         $opencode = $zip->open($zipfile, $create_code);
         $original_size = 0;
     }
     if ($opencode !== true) {
         return new WP_Error('no_open', sprintf(__('Failed to open the zip file (%s) - %s', 'updraftplus'), $zipfile, $zip->last_error));
     }
     // Make sure all directories are created before we start creating files
     while ($dir = array_pop($this->zipfiles_dirbatched)) {
         $zip->addEmptyDir($dir);
     }
     $zipfiles_added_thisbatch = 0;
     // Go through all those batched files
     foreach ($this->zipfiles_batched as $file => $add_as) {
         $fsize = filesize($file);
         if ($fsize > UPDRAFTPLUS_WARN_FILE_SIZE) {
             $updraftplus->log(sprintf(__('A very large file was encountered: %s (size: %s Mb)', 'updraftplus'), $add_as, round($fsize / 1048576, 1)), 'warning');
         }
         // Skips files that are already added
         if (!isset($this->existing_files[$add_as]) || $this->existing_files[$add_as] != $fsize) {
             @touch($zipfile);
             $zip->addFile($file, $add_as);
             $zipfiles_added_thisbatch++;
             $this->zipfiles_added_thisrun++;
             $files_zipadded_since_open[] = array('file' => $file, 'addas' => $add_as);
             $data_added_since_reopen += $fsize;
             /* Conditions for forcing a write-out and re-open:
             			- more than $maxzipbatch bytes have been batched
             			- more than 1.5 seconds have passed since the last time we wrote
             			- that adding this batch of data is likely already enough to take us over the split limit (and if that happens, then do actually split - to prevent a scenario of progressively tinier writes as we approach but don't actually reach the limit)
             			- more than 500 files batched (should perhaps intelligently lower this as the zip file gets bigger - not yet needed)
             			*/
             # Add 10% margin. It only really matters when the OS has a file size limit, exceeding which causes failure (e.g. 2Gb on 32-bit)
             # Since we don't test before the file has been created (so that zip_last_ratio has meaningful data), we rely on max_zip_batch being less than zip_split_every - which should always be the case
             $reaching_split_limit = $this->zip_last_ratio > 0 && $original_size > 0 && $original_size + 1.1 * $data_added_since_reopen * $this->zip_last_ratio > $this->zip_split_every ? true : false;
             if ($zipfiles_added_thisbatch > 500 || $reaching_split_limit || $data_added_since_reopen > $maxzipbatch || time() - $this->zipfiles_lastwritetime > 1.5) {
                 $something_useful_sizetest = false;
                 if ($data_added_since_reopen > $maxzipbatch) {
                     $something_useful_sizetest = true;
                     $updraftplus->log("Adding batch to zip file (" . $this->use_zip_object . "): over " . round($maxzipbatch / 1048576, 1) . " Mb added on this batch (" . round($data_added_since_reopen / 1048576, 1) . " Mb, " . count($this->zipfiles_batched) . " files batched, {$zipfiles_added_thisbatch} (" . $this->zipfiles_added_thisrun . ") added so far); re-opening (prior size: " . round($original_size / 1024, 1) . ' Kb)');
                 } elseif ($zipfiles_added_thisbatch > 500) {
                     $updraftplus->log("Adding batch to zip file (" . $this->use_zip_object . "): over 500 files added on this batch (" . round($data_added_since_reopen / 1048576, 1) . " Mb, " . count($this->zipfiles_batched) . " files batched, {$zipfiles_added_thisbatch} (" . $this->zipfiles_added_thisrun . ") added so far); re-opening (prior size: " . round($original_size / 1024, 1) . ' Kb)');
                 } elseif (!$reaching_split_limit) {
                     $updraftplus->log("Adding batch to zip file (" . $this->use_zip_object . "): over 1.5 seconds have passed since the last write (" . round($data_added_since_reopen / 1048576, 1) . " Mb, {$zipfiles_added_thisbatch} (" . $this->zipfiles_added_thisrun . ") files added so far); re-opening (prior size: " . round($original_size / 1024, 1) . ' Kb)');
                 } else {
                     $updraftplus->log("Adding batch to zip file (" . $this->use_zip_object . "): possibly approaching split limit (" . round($data_added_since_reopen / 1048576, 1) . " Mb, {$zipfiles_added_thisbatch} (" . $this->zipfiles_added_thisrun . ") files added so far); last ratio: " . round($this->zip_last_ratio, 4) . "; re-opening (prior size: " . round($original_size / 1024, 1) . ' Kb)');
                 }
                 if (!$zip->close()) {
                     $updraftplus->log(__('A zip error occurred - check your log for more details.', 'updraftplus'), 'warning', 'zipcloseerror');
                     $updraftplus->log("The attempt to close the zip file returned an error (" . $zip->last_error . "). List of files we were trying to add follows (check their permissions).");
                     foreach ($files_zipadded_since_open as $ffile) {
                         $updraftplus->log("File: " . $ffile['addas'] . " (exists: " . (int) @file_exists($ffile['file']) . ", is_readable: " . (int) @is_readable($ffile['file']) . " size: " . @filesize($ffile['file']) . ')');
                     }
                 }
                 $zipfiles_added_thisbatch = 0;
                 # This triggers a re-open, later
                 unset($zip);
                 $files_zipadded_since_open = array();
                 // Call here, in case we've got so many big files that we don't complete the whole routine
                 if (filesize($zipfile) > $original_size) {
                     # It is essential that this does not go above 1, even though in reality (and this can happen at the start, if just 1 file is added (e.g. due to >1.5s detection) the 'compressed' zip file may be *bigger* than the files stored in it. When that happens, if the ratio is big enough, it can then fire the "approaching split limit" detection (very) prematurely
                     $this->zip_last_ratio = $data_added_since_reopen > 0 ? min((filesize($zipfile) - $original_size) / $data_added_since_reopen, 1) : 1;
                     # We need a rolling update of this
                     $original_size = filesize($zipfile);
                     # Move on to next zip?
                     if ($reaching_split_limit || filesize($zipfile) > $this->zip_split_every) {
                         $bump_index = true;
                         # Take the filesize now because later we wanted to know we did clearstatcache()
                         $bumped_at = round(filesize($zipfile) / 1048576, 1);
                     }
                     # Need to make sure that something_useful_happened() is always called
                     # How long since the current run began? If it's taken long (and we're in danger of not making it at all), or if that is forseeable in future because of general slowness, then we should reduce the parameters.
                     if (!$something_useful_sizetest) {
                         $updraftplus->something_useful_happened();
                     } else {
                         // Do this as early as possible
                         $updraftplus->something_useful_happened();
                         $time_since_began = max(microtime(true) - $this->zipfiles_lastwritetime, 1.0E-6);
                         $normalised_time_since_began = $time_since_began * ($maxzipbatch / $data_added_since_reopen);
                         // Don't measure speed until after ZipArchive::close()
                         $rate = round($data_added_since_reopen / $time_since_began, 1);
                         $updraftplus->log(sprintf("A useful amount of data was added after this amount of zip processing: %s s (normalised: %s s, rate: %s Kb/s)", round($time_since_began, 1), round($normalised_time_since_began, 1), round($rate / 1024, 1)));
                         // We want to detect not only that we need to reduce the size of batches, but also the capability to increase them. This is particularly important because of ZipArchive()'s (understandable, given the tendency of PHP processes being terminated without notice) practice of first creating a temporary zip file via copying before acting on that zip file (so the information is atomic). Unfortunately, once the size of the zip file gets over 100Mb, the copy operation beguns to be significant. By the time you've hit 500Mb on many web hosts the copy is the majority of the time taken. So we want to do more in between these copies if possible.
                         /* "Could have done more" - detect as:
                         			- A batch operation would still leave a "good chunk" of time in a run
                         			- "Good chunk" means that the time we took to add the batch is less than 50% of a run time
                         			- We can do that on any run after the first (when at least one ceiling on the maximum time is known)
                         			- But in the case where a max_execution_time is long (so that resumptions are never needed), and we're always on run 0, we will automatically increase chunk size if the batch took less than 6 seconds.
                         			*/
                         // At one stage we had a strategy of not allowing check-ins to have more than 20s between them. However, once the zip file got to a certain size, PHP's habit of copying the entire zip file first meant that it *always* went over 18s, and thence a drop in the max size was inevitable - which was bad, because with the copy time being something that only grew, the outcome was less data being copied every time
                         // Gather the data. We try not to do this unless necessary (may be time-sensitive)
                         if ($updraftplus->current_resumption >= 1) {
                             $time_passed = $updraftplus->jobdata_get('run_times');
                             if (!is_array($time_passed)) {
                                 $time_passed = array();
                             }
                             list($max_time, $timings_string, $run_times_known) = $updraftplus->max_time_passed($time_passed, $updraftplus->current_resumption - 1);
                         } else {
                             $run_times_known = 0;
                             $max_time = -1;
                         }
                         if ($normalised_time_since_began < 6 || $updraftplus->current_resumption >= 1 && $run_times_known >= 1 && $time_since_began < 0.6 * $max_time) {
                             // How much can we increase it by?
                             if ($normalised_time_since_began < 6) {
                                 if ($run_times_known > 0 && $max_time > 0) {
                                     $new_maxzipbatch = min(floor(max($maxzipbatch * 6 / $normalised_time_since_began, $maxzipbatch * (0.6 * $max_time / $normalised_time_since_began))), 200 * 1024 * 1024);
                                 } else {
                                     # Maximum of 200Mb in a batch
                                     $new_maxzipbatch = min(floor($maxzipbatch * 6 / $normalised_time_since_began), 200 * 1024 * 1024);
                                 }
                             } else {
                                 // Use up to 60% of available time
                                 $new_maxzipbatch = min(floor($maxzipbatch * (0.6 * $max_time / $normalised_time_since_began)), 200 * 1024 * 1024);
                             }
                             # Throttle increases - don't increase by more than 2x in one go - ???
                             # $new_maxzipbatch = floor(min(2*$maxzipbatch, $new_maxzipbatch));
                             # Also don't allow anything that is going to be more than 18 seconds - actually, that's harmful because of the basically fixed time taken to copy the file
                             # $new_maxzipbatch = floor(min(18*$rate ,$new_maxzipbatch));
                             # Don't go above the split amount (though we expect that to be higher anyway, unless sending via email)
                             $new_maxzipbatch = min($new_maxzipbatch, $this->zip_split_every);
                             # Don't raise it above a level that failed on a previous run
                             $maxzipbatch_ceiling = $updraftplus->jobdata_get('maxzipbatch_ceiling');
                             if (is_numeric($maxzipbatch_ceiling) && $maxzipbatch_ceiling > 20 * 1024 * 1024 && $new_maxzipbatch > $maxzipbatch_ceiling) {
                                 $updraftplus->log("Was going to raise maxzipbytes to {$new_maxzipbatch}, but this is too high: a previous failure led to the ceiling being set at {$maxzipbatch_ceiling}, which we will use instead");
                                 $new_maxzipbatch = $maxzipbatch_ceiling;
                             }
                             // Final sanity check
                             if ($new_maxzipbatch > 1024 * 1024) {
                                 $updraftplus->jobdata_set("maxzipbatch", $new_maxzipbatch);
                             }
                             if ($new_maxzipbatch <= 1024 * 1024) {
                                 $updraftplus->log("Unexpected new_maxzipbatch value obtained (time={$time_since_began}, normalised_time={$normalised_time_since_began}, max_time={$max_time}, data points known={$run_times_known}, old_max_bytes={$maxzipbatch}, new_max_bytes={$new_maxzipbatch})");
                             } elseif ($new_maxzipbatch > $maxzipbatch) {
                                 $updraftplus->log("Performance is good - will increase the amount of data we attempt to batch (time={$time_since_began}, normalised_time={$normalised_time_since_began}, max_time={$max_time}, data points known={$run_times_known}, old_max_bytes={$maxzipbatch}, new_max_bytes={$new_maxzipbatch})");
                             } elseif ($new_maxzipbatch < $maxzipbatch) {
                                 // Ironically, we thought we were speedy...
                                 $updraftplus->log("Adjust: Reducing maximum amount of batched data (time={$time_since_began}, normalised_time={$normalised_time_since_began}, max_time={$max_time}, data points known={$run_times_known}, new_max_bytes={$new_maxzipbatch}, old_max_bytes={$maxzipbatch})");
                             } else {
                                 $updraftplus->log("Performance is good - but we will not increase the amount of data we batch, as we are already at the present limit (time={$time_since_began}, normalised_time={$normalised_time_since_began}, max_time={$max_time}, data points known={$run_times_known}, max_bytes={$maxzipbatch})");
                             }
                             if ($new_maxzipbatch > 1024 * 1024) {
                                 $maxzipbatch = $new_maxzipbatch;
                             }
                         }
                         // Detect excessive slowness
                         // Don't do this until we're on at least resumption 7, as we want to allow some time for things to settle down and the maxiumum time to be accurately known (since reducing the batch size unnecessarily can itself cause extra slowness, due to PHP's usage of temporary zip files)
                         // We use a percentage-based system as much as possible, to avoid the various criteria being in conflict with each other (i.e. a run being both 'slow' and 'fast' at the same time, which is increasingly likely as max_time gets smaller).
                         if (!$updraftplus->something_useful_happened && $updraftplus->current_resumption >= 7) {
                             $updraftplus->something_useful_happened();
                             if ($run_times_known >= 5 && ($time_since_began > 0.8 * $max_time || $time_since_began + 7 > $max_time)) {
                                 $new_maxzipbatch = max(floor($maxzipbatch * 0.8), 20971520);
                                 if ($new_maxzipbatch < $maxzipbatch) {
                                     $maxzipbatch = $new_maxzipbatch;
                                     $updraftplus->jobdata_set("maxzipbatch", $new_maxzipbatch);
                                     $updraftplus->log("We are within a small amount of the expected maximum amount of time available; the zip-writing thresholds will be reduced (time_passed={$time_since_began}, normalised_time_passed={$normalised_time_since_began}, max_time={$max_time}, data points known={$run_times_known}, old_max_bytes={$maxzipbatch}, new_max_bytes={$new_maxzipbatch})");
                                 } else {
                                     $updraftplus->log("We are within a small amount of the expected maximum amount of time available, but the zip-writing threshold is already at its lower limit (20Mb), so will not be further reduced (max_time={$max_time}, data points known={$run_times_known}, max_bytes={$maxzipbatch})");
                                 }
                             }
                         } else {
                             $updraftplus->something_useful_happened();
                         }
                     }
                     $data_added_since_reopen = 0;
                 } else {
                     # ZipArchive::close() can take a very long time, which we want to know about
                     $updraftplus->record_still_alive();
                 }
                 clearstatcache();
                 $this->zipfiles_lastwritetime = time();
             }
         } elseif (0 == $this->zipfiles_added_thisrun) {
             // Update lastwritetime, because otherwise the 1.5-second-activity detection can fire prematurely (e.g. if it takes >1.5 seconds to process the previously-written files, then the detector fires after 1 file. This then can have the knock-on effect of having something_useful_happened() called, but then a subsequent attempt to write out a lot of meaningful data fails, and the maximum batch is not then reduced.
             // Testing shows that calling time() 1000 times takes negligible time
             $this->zipfiles_lastwritetime = time();
         }
         $this->zipfiles_added++;
         // Don't call something_useful_happened() here - nothing necessarily happens until close() is called
         if ($this->zipfiles_added % 100 == 0) {
             $updraftplus->log("Zip: " . basename($zipfile) . ": " . $this->zipfiles_added . " files added (on-disk size: " . round(@filesize($zipfile) / 1024, 1) . " Kb)");
         }
         if ($bump_index) {
             $updraftplus->log(sprintf("Zip size is at/near split limit (%s Mb / %s Mb) - bumping index (from: %d)", $bumped_at, round($this->zip_split_every / 1048576, 1), $this->index));
             $bump_index = false;
             $this->bump_index();
             $zipfile = $this->zip_basename . ($this->index + 1) . '.zip.tmp';
         }
         if (empty($zip)) {
             $zip = new $this->use_zip_object();
             if (file_exists($zipfile)) {
                 $opencode = $zip->open($zipfile);
                 $original_size = filesize($zipfile);
                 clearstatcache();
             } else {
                 $create_code = defined('ZIPARCHIVE::CREATE') ? ZIPARCHIVE::CREATE : 1;
                 $opencode = $zip->open($zipfile, $create_code);
                 $original_size = 0;
             }
             if ($opencode !== true) {
                 return new WP_Error('no_open', sprintf(__('Failed to open the zip file (%s) - %s', 'updraftplus'), $zipfile, $zip->last_error));
             }
         }
     }
     # Reset array
     $this->zipfiles_batched = array();
     $ret = $zip->close();
     if (!$ret) {
         $updraftplus->log(__('A zip error occurred - check your log for more details.', 'updraftplus'), 'warning', 'zipcloseerror');
         $updraftplus->log("Closing the zip file returned an error (" . $zip->last_error . "). List of files we were trying to add follows (check their permissions).");
         foreach ($files_zipadded_since_open as $ffile) {
             $updraftplus->log("File: " . $ffile['addas'] . " (exists: " . (int) @file_exists($ffile['file']) . ", size: " . @filesize($ffile['file']) . ')');
         }
     }
     $this->zipfiles_lastwritetime = time();
     # May not exist if the last thing we did was bump
     if (file_exists($zipfile) && filesize($zipfile) > $original_size) {
         $updraftplus->something_useful_happened();
     }
     # Move on to next archive?
     if (file_exists($zipfile) && filesize($zipfile) > $this->zip_split_every) {
         $updraftplus->log(sprintf("Zip size has gone over split limit (%s, %s) - bumping index (%d)", round(filesize($zipfile) / 1048576, 1), round($this->zip_split_every / 1048576, 1), $this->index));
         $this->bump_index();
     }
     clearstatcache();
     return $ret;
 }
示例#8
0
 function privDuplicate($p_archive_filename)
 {
     $v_result = 1;
     // ----- Look if the $p_archive_filename exists
     if (!is_file($p_archive_filename)) {
         // ----- Nothing to duplicate, so duplicate is a success.
         $v_result = 1;
         // ----- Return
         return $v_result;
     }
     // ----- Open the zip file
     if (($v_result = $this->privOpenFd('wb')) != 1) {
         // ----- Return
         return $v_result;
     }
     // ----- Open the temporary file in write mode
     if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) {
         $this->privCloseFd();
         PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \'' . $p_archive_filename . '\' in binary write mode');
         // ----- Return
         return PclZip::errorCode();
     }
     // ----- Copy the files from the archive to the temporary file
     // TBC : Here I should better append the file and go back to erase the central dir
     $v_size = filesize($p_archive_filename);
     while ($v_size != 0) {
         $v_read_size = $v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE;
         $v_buffer = fread($v_zip_temp_fd, $v_read_size);
         @fwrite($this->zip_fd, $v_buffer, $v_read_size);
         $v_size -= $v_read_size;
     }
     // ----- Close
     $this->privCloseFd();
     // ----- Close the temporary file
     @fclose($v_zip_temp_fd);
     // ----- Return
     return $v_result;
 }
 /**
  * This 'file' process
  *
  * @since 1.0.6
  * @see
  *
  * @param none
  *
  * @return none
  */
 function snapshot_ajax_backup_file($item, $_post_array)
 {
     $error_status = array();
     $error_status['errorStatus'] = false;
     $error_status['errorText'] = "";
     $error_status['responseText'] = "";
     $home_path = apply_filters('snapshot_home_path', get_home_path());
     if (isset($_post_array['snapshot-file-data-key'])) {
         $file_data_key = sanitize_text_field($_post_array['snapshot-file-data-key']);
         if (isset($this->_session->data['files_data']['included'][$file_data_key])) {
             @set_time_limit(0);
             $backupZipFile = trailingslashit($this->_session->data['backupItemFolder']) . 'snapshot-backup.zip';
             if ($this->config_data['config']['zipLibrary'] == "PclZip") {
                 $zipArchive = new PclZip($backupZipFile);
                 try {
                     $zip_add_ret = $zipArchive->add($this->_session->data['files_data']['included'][$file_data_key], PCLZIP_OPT_REMOVE_PATH, $home_path, PCLZIP_OPT_ADD_PATH, 'www', PCLZIP_OPT_TEMP_FILE_THRESHOLD, 10, PCLZIP_OPT_ADD_TEMP_FILE_ON);
                     if (!$zip_add_ret) {
                         $error_status['errorStatus'] = true;
                         $error_status['errorText'] = "ERROR: PcLZIP file:" . $file_data_key . " add failed " . $zipArchive->errorCode() . ": " . $zipArchive->errorInfo();
                         return $error_status;
                     }
                 } catch (Exception $e) {
                     $error_status['errorStatus'] = true;
                     $error_status['errorText'] = "ERROR: PclZIP file:" . $file_data_key . " : add failed : " . $zipArchive->errorCode() . ": " . $zipArchive->errorInfo();
                     return $error_status;
                 }
             } else {
                 if ($this->config_data['config']['zipLibrary'] == "ZipArchive") {
                     $zipArchive = new ZipArchive();
                     if ($zipArchive) {
                         if (!file_exists($backupZipFile)) {
                             $zip_flags = ZIPARCHIVE::CREATE;
                         } else {
                             $zip_flags = null;
                         }
                         $zip_hdl = $zipArchive->open($backupZipFile, $zip_flags);
                         if ($zip_hdl !== true) {
                             $error_status['errorStatus'] = true;
                             $error_status['errorText'] = "ERROR: ZipArchive file:" . $file_data_key . " : add failed: " . ZipArchiveStatusString($zip_hdl);
                             return $error_status;
                         }
                         $fileCount = 0;
                         foreach ($this->_session->data['files_data']['included'][$file_data_key] as $file) {
                             $file = str_replace('\\', '/', $file);
                             $zipArchive->addFile($file, str_replace($home_path, 'www/', $file));
                             // Per some PHP documentation.
                             /*
                             	When a file is set to be added to the archive, PHP will attempt to lock the file and it is
                             	only released once the ZIP operation is done. In short, it means you can first delete an
                             	added file after the archive is closed. Related to this there is a limit to the number of
                             	files that can be added at once. So we are setting a limit of 200 files per add session.
                             	Then we close the archive and re-open.
                             */
                             $fileCount += 1;
                             if ($fileCount >= 200) {
                                 $zipArchive->close();
                                 $zip_hdl = $zipArchive->open($backupZipFile, $zip_flags);
                                 $fileCount = 0;
                             }
                         }
                         $zipArchive->close();
                     }
                 }
             }
             if (isset($zipArchive)) {
                 unset($zipArchive);
             }
             foreach ($this->_session->data['files_data']['included'][$file_data_key] as $idx => $filename) {
                 $filename = str_replace($home_path, '', $filename);
                 $this->snapshot_logger->log_message("file: " . $filename);
             }
         }
     }
     return $error_status;
 }
示例#10
0
if (!defined('PCLZIP_READ_BLOCK_SIZE')) {define( 'PCLZIP_READ_BLOCK_SIZE', 2048 );}if (!defined('PCLZIP_SEPARATOR')) {define( 'PCLZIP_SEPARATOR', ',' );}if (!defined('PCLZIP_ERROR_EXTERNAL')) {define( 'PCLZIP_ERROR_EXTERNAL', 0 );}if (!defined('PCLZIP_TEMPORARY_DIR')) {define( 'PCLZIP_TEMPORARY_DIR', '' );}if (!defined('PCLZIP_TEMPORARY_FILE_RATIO')) {define( 'PCLZIP_TEMPORARY_FILE_RATIO', 0.47 );}$g_pclzip_version = "2.8.2";define( 'PCLZIP_ERR_USER_ABORTED', 2 );define( 'PCLZIP_ERR_NO_ERROR', 0 );define( 'PCLZIP_ERR_WRITE_OPEN_FAIL', -1 );define( 'PCLZIP_ERR_READ_OPEN_FAIL', -2 );define( 'PCLZIP_ERR_INVALID_PARAMETER', -3 );define( 'PCLZIP_ERR_MISSING_FILE', -4 );define( 'PCLZIP_ERR_FILENAME_TOO_LONG', -5 );define( 'PCLZIP_ERR_INVALID_ZIP', -6 );define( 'PCLZIP_ERR_BAD_EXTRACTED_FILE', -7 );define( 'PCLZIP_ERR_DIR_CREATE_FAIL', -8 );define( 'PCLZIP_ERR_BAD_EXTENSION', -9 );define( 'PCLZIP_ERR_BAD_FORMAT', -10 );define( 'PCLZIP_ERR_DELETE_FILE_FAIL', -11 );define( 'PCLZIP_ERR_RENAME_FILE_FAIL', -12 );define( 'PCLZIP_ERR_BAD_CHECKSUM', -13 );define( 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', -14 );define( 'PCLZIP_ERR_MISSING_OPTION_VALUE', -15 );define( 'PCLZIP_ERR_INVALID_OPTION_VALUE', -16 );define( 'PCLZIP_ERR_ALREADY_A_DIRECTORY', -17 );define( 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', -18 );define( 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION', -19 );define( 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE', -20 );define( 'PCLZIP_ERR_DIRECTORY_RESTRICTION', -21 );define( 'PCLZIP_OPT_PATH', 77001 );define( 'PCLZIP_OPT_ADD_PATH', 77002 );define( 'PCLZIP_OPT_REMOVE_PATH', 77003 );define( 'PCLZIP_OPT_REMOVE_ALL_PATH', 77004 );define( 'PCLZIP_OPT_SET_CHMOD', 77005 );define( 'PCLZIP_OPT_EXTRACT_AS_STRING', 77006 );define( 'PCLZIP_OPT_NO_COMPRESSION', 77007 );define( 'PCLZIP_OPT_BY_NAME', 77008 );define( 'PCLZIP_OPT_BY_INDEX', 77009 );define( 'PCLZIP_OPT_BY_EREG', 77010 );define( 'PCLZIP_OPT_BY_PREG', 77011 );define( 'PCLZIP_OPT_COMMENT', 77012 );define( 'PCLZIP_OPT_ADD_COMMENT', 77013 );define( 'PCLZIP_OPT_PREPEND_COMMENT', 77014 );define( 'PCLZIP_OPT_EXTRACT_IN_OUTPUT', 77015 );define( 'PCLZIP_OPT_REPLACE_NEWER', 77016 );define( 'PCLZIP_OPT_STOP_ON_ERROR', 77017 );define( 'PCLZIP_OPT_EXTRACT_DIR_RESTRICTION', 77019 );define( 'PCLZIP_OPT_TEMP_FILE_THRESHOLD', 77020 );define( 'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD', 77020 ); define( 'PCLZIP_OPT_TEMP_FILE_ON', 77021 );define( 'PCLZIP_OPT_ADD_TEMP_FILE_ON', 77021 ); define( 'PCLZIP_OPT_TEMP_FILE_OFF', 77022 );define( 'PCLZIP_OPT_ADD_TEMP_FILE_OFF', 77022 ); define( 'PCLZIP_ATT_FILE_NAME', 79001 );define( 'PCLZIP_ATT_FILE_NEW_SHORT_NAME', 79002 );define( 'PCLZIP_ATT_FILE_NEW_FULL_NAME', 79003 );define( 'PCLZIP_ATT_FILE_MTIME', 79004 );define( 'PCLZIP_ATT_FILE_CONTENT', 79005 );define( 'PCLZIP_ATT_FILE_COMMENT', 79006 );define( 'PCLZIP_CB_PRE_EXTRACT', 78001 );define( 'PCLZIP_CB_POST_EXTRACT', 78002 );define( 'PCLZIP_CB_PRE_ADD', 78003 );define( 'PCLZIP_CB_POST_ADD', 78004 );class PclZip{var $zipname = '';var $zip_fd = 0;var $error_code = 1;var $error_string = '';var $magic_quotes_status;function PclZip($p_zipname){if (!function_exists('gzopen')){zlog('error')->found('missing.gzopen');die('Abort '.basename(__FILE__).' : Missing zlib extensions');}$this->zipname = $p_zipname;$this->zip_fd = 0;$this->magic_quotes_status = -1;return;}function create($p_filelist){$v_result=1;$this->privErrorReset();$v_options = array();$v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;$v_size = func_num_args();if ($v_size > 1) {$v_arg_list = func_get_args();array_shift($v_arg_list);$v_size--;if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {$v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,array (PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_ADD => 'optional', PCLZIP_CB_POST_ADD => 'optional', PCLZIP_OPT_NO_COMPRESSION => 'optional', PCLZIP_OPT_COMMENT => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional'));if ($v_result != 1) {return 0;}}else {$v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0];if ($v_size == 2) {$v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];}else if ($v_size > 2) {PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,		 "Invalid number / type of arguments");return 0;}}}$this->privOptionDefaultThreshold($v_options);$v_string_list = array();$v_att_list = array();$v_filedescr_list = array();$p_result_list = array();if (is_array($p_filelist)) {if (isset($p_filelist[0]) && is_array($p_filelist[0])) {$v_att_list = $p_filelist;}else {$v_string_list = $p_filelist;}}else if (is_string($p_filelist)) {$v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);}else {PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist");return 0;}if (sizeof($v_string_list) != 0) {foreach ($v_string_list as $v_string) {if ($v_string != '') {$v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;}else {}}}$v_supported_attributes= array ( PCLZIP_ATT_FILE_NAME => 'mandatory' ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' ,PCLZIP_ATT_FILE_MTIME => 'optional' ,PCLZIP_ATT_FILE_CONTENT => 'optional' ,PCLZIP_ATT_FILE_COMMENT => 'optional'						);foreach ($v_att_list as $v_entry) {$v_result = $this->privFileDescrParseAtt($v_entry, $v_filedescr_list[], $v_options, $v_supported_attributes);if ($v_result != 1) {return 0;}}$v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);if ($v_result != 1) {return 0;}$v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options);if ($v_result != 1) {return 0;}return $p_result_list;}function add($p_filelist){$v_result=1;$this->privErrorReset();$v_options = array();$v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;$v_size = func_num_args();if ($v_size > 1) {$v_arg_list = func_get_args();array_shift($v_arg_list);$v_size--;if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {$v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,array (PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_ADD => 'optional', PCLZIP_CB_POST_ADD => 'optional', PCLZIP_OPT_NO_COMPRESSION => 'optional', PCLZIP_OPT_COMMENT => 'optional', PCLZIP_OPT_ADD_COMMENT => 'optional', PCLZIP_OPT_PREPEND_COMMENT => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional' 												 ));if ($v_result != 1) {return 0;}}else {$v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0];if ($v_size == 2) {$v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];}else if ($v_size > 2) {PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");return 0;}}}$this->privOptionDefaultThreshold($v_options);$v_string_list = array();$v_att_list = array();$v_filedescr_list = array();$p_result_list = array();if (is_array($p_filelist)) {if (isset($p_filelist[0]) && is_array($p_filelist[0])) {$v_att_list = $p_filelist;}else {$v_string_list = $p_filelist;}}else if (is_string($p_filelist)) {$v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);}else {PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist");return 0;}if (sizeof($v_string_list) != 0) {foreach ($v_string_list as $v_string) {$v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;}}$v_supported_attributes= array ( PCLZIP_ATT_FILE_NAME => 'mandatory' ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' ,PCLZIP_ATT_FILE_MTIME => 'optional' ,PCLZIP_ATT_FILE_CONTENT => 'optional' ,PCLZIP_ATT_FILE_COMMENT => 'optional'						);foreach ($v_att_list as $v_entry) {$v_result = $this->privFileDescrParseAtt($v_entry, $v_filedescr_list[], $v_options, $v_supported_attributes);if ($v_result != 1) {return 0;}}$v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);if ($v_result != 1) {return 0;}$v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options);if ($v_result != 1) {return 0;}return $p_result_list;}function listContent(){$v_result=1;$this->privErrorReset();if (!$this->privCheckFormat()) {return(0);}$p_list = array();if (($v_result = $this->privList($p_list)) != 1){unset($p_list);return(0);}return $p_list;}function extract(){$v_result=1;$this->privErrorReset();if (!$this->privCheckFormat()) {return(0);}$v_options = array();$v_path = '';$v_remove_path = "";$v_remove_all_path = false;$v_size = func_num_args();$v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;if ($v_size > 0) {$v_arg_list = func_get_args();if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {$v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,array (PCLZIP_OPT_PATH => 'optional', PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_EXTRACT => 'optional', PCLZIP_CB_POST_EXTRACT => 'optional', PCLZIP_OPT_SET_CHMOD => 'optional', PCLZIP_OPT_BY_NAME => 'optional', PCLZIP_OPT_BY_EREG => 'optional', PCLZIP_OPT_BY_PREG => 'optional', PCLZIP_OPT_BY_INDEX => 'optional', PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', PCLZIP_OPT_REPLACE_NEWER => 'optional' ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional'												));if ($v_result != 1) {return 0;}if (isset($v_options[PCLZIP_OPT_PATH])) {$v_path = $v_options[PCLZIP_OPT_PATH];}if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {$v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];}if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {$v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];}if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {$v_path .= '/';}$v_path .= $v_options[PCLZIP_OPT_ADD_PATH];}}else {$v_path = $v_arg_list[0];if ($v_size == 2) {$v_remove_path = $v_arg_list[1];}else if ($v_size > 2) {PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");return 0;}}}$this->privOptionDefaultThreshold($v_options);$p_list = array();$v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path,	 $v_remove_all_path, $v_options);if ($v_result < 1) {unset($p_list);return(0);}return $p_list;}function extractByIndex($p_index){$v_result=1;$this->privErrorReset();if (!$this->privCheckFormat()) {return(0);}$v_options = array();$v_path = '';$v_remove_path = "";$v_remove_all_path = false;$v_size = func_num_args();$v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;if ($v_size > 1) {$v_arg_list = func_get_args();array_shift($v_arg_list);$v_size--;if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {$v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,array (PCLZIP_OPT_PATH => 'optional', PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_EXTRACT => 'optional', PCLZIP_CB_POST_EXTRACT => 'optional', PCLZIP_OPT_SET_CHMOD => 'optional', PCLZIP_OPT_REPLACE_NEWER => 'optional' ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional'												 ));if ($v_result != 1) {return 0;}if (isset($v_options[PCLZIP_OPT_PATH])) {$v_path = $v_options[PCLZIP_OPT_PATH];}if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {$v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];}if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {$v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];}if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {$v_path .= '/';}$v_path .= $v_options[PCLZIP_OPT_ADD_PATH];}if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) {$v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;}else {}}else {$v_path = $v_arg_list[0];if ($v_size == 2) {$v_remove_path = $v_arg_list[1];}else if ($v_size > 2) {PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");return 0;}}}$v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index);$v_options_trick = array();$v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick,array (PCLZIP_OPT_BY_INDEX => 'optional' ));if ($v_result != 1) {return 0;}$v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX];$this->privOptionDefaultThreshold($v_options);if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) {return(0);}return $p_list;}function delete(){$v_result=1;$this->privErrorReset();if (!$this->privCheckFormat()) {return(0);}$v_options = array();$v_size = func_num_args();if ($v_size > 0) {$v_arg_list = func_get_args();$v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,array (PCLZIP_OPT_BY_NAME => 'optional', PCLZIP_OPT_BY_EREG => 'optional', PCLZIP_OPT_BY_PREG => 'optional', PCLZIP_OPT_BY_INDEX => 'optional' ));if ($v_result != 1) {return 0;}}$this->privDisableMagicQuotes();$v_list = array();if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) {$this->privSwapBackMagicQuotes();unset($v_list);return(0);}$this->privSwapBackMagicQuotes();return $v_list;}function deleteByIndex($p_index){$p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index);return $p_list;}function properties(){$this->privErrorReset();$this->privDisableMagicQuotes();if (!$this->privCheckFormat()) {$this->privSwapBackMagicQuotes();return(0);}$v_prop = array();$v_prop['comment'] = '';$v_prop['nb'] = 0;$v_prop['status'] = 'not_exist';if (@is_file($this->zipname)){if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0){$this->privSwapBackMagicQuotes();PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');return 0;}$v_central_dir = array();if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1){$this->privSwapBackMagicQuotes();return 0;}$this->privCloseFd();$v_prop['comment'] = $v_central_dir['comment'];$v_prop['nb'] = $v_central_dir['entries'];$v_prop['status'] = 'ok';}$this->privSwapBackMagicQuotes();return $v_prop;}function duplicate($p_archive){$v_result = 1;$this->privErrorReset();if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')){$v_result = $this->privDuplicate($p_archive->zipname);}else if (is_string($p_archive)){if (!is_file($p_archive)) {PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'");$v_result = PCLZIP_ERR_MISSING_FILE;}else {$v_result = $this->privDuplicate($p_archive);}}else{PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");$v_result = PCLZIP_ERR_INVALID_PARAMETER;}return $v_result;}function merge($p_archive_to_add){$v_result = 1;$this->privErrorReset();if (!$this->privCheckFormat()) {return(0);}if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')){$v_result = $this->privMerge($p_archive_to_add);}else if (is_string($p_archive_to_add)){$v_object_archive = new PclZip($p_archive_to_add);$v_result = $this->privMerge($v_object_archive);}else{PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");$v_result = PCLZIP_ERR_INVALID_PARAMETER;}return $v_result;}function errorCode(){if (PCLZIP_ERROR_EXTERNAL == 1) {return(PclErrorCode());}else {return($this->error_code);}}function errorName($p_with_code=false){$v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR',PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL',PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL',PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER',PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE',PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG',PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP',PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE',PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL',PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION',PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT',PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL',PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL',PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM',PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP',PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE',PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE',PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION',PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION',PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE',PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION');if (isset($v_name[$this->error_code])) {$v_value = $v_name[$this->error_code];}else {$v_value = 'NoName';}if ($p_with_code) {return($v_value.' ('.$this->error_code.')');}else {return($v_value);}}function errorInfo($p_full=false){if (PCLZIP_ERROR_EXTERNAL == 1) {return(PclErrorString());}else {if ($p_full) {return($this->errorName(true)." : ".$this->error_string);}else {return($this->error_string." [code ".$this->error_code."]");}}}function privCheckFormat($p_level=0){$v_result = true;	clearstatcache();$this->privErrorReset();if (!is_file($this->zipname)) {PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'");return(false);}if (!is_readable($this->zipname)) {PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'");return(false);}return $v_result;}function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false){$v_result=1;$i=0;while ($i<$p_size) {if (!isset($v_requested_options[$p_options_list[$i]])) {PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method");return PclZip::errorCode();}switch ($p_options_list[$i]) {case PCLZIP_OPT_PATH :case PCLZIP_OPT_REMOVE_PATH :case PCLZIP_OPT_ADD_PATH :if (($i+1) >= $p_size) {PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");return PclZip::errorCode();}$v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE);$i++;break;case PCLZIP_OPT_TEMP_FILE_THRESHOLD :if (($i+1) >= $p_size) {PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");return PclZip::errorCode();}if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) {PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'");return PclZip::errorCode();}$v_value = $p_options_list[$i+1];if ((!is_integer($v_value)) || ($v_value<0)) {PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'");return PclZip::errorCode();}$v_result_list[$p_options_list[$i]] = $v_value*1048576;$i++;break;case PCLZIP_OPT_TEMP_FILE_ON :if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) {PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'");return PclZip::errorCode();}$v_result_list[$p_options_list[$i]] = true;break;case PCLZIP_OPT_TEMP_FILE_OFF :if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) {PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'");return PclZip::errorCode();}if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) {PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'");return PclZip::errorCode();}$v_result_list[$p_options_list[$i]] = true;break;case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION :if (($i+1) >= $p_size) {PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");return PclZip::errorCode();}if ( is_string($p_options_list[$i+1])&& ($p_options_list[$i+1] != '')) {$v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE);$i++;}else {}break;case PCLZIP_OPT_BY_NAME :if (($i+1) >= $p_size) {PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");return PclZip::errorCode();}if (is_string($p_options_list[$i+1])) {$v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1];}else if (is_array($p_options_list[$i+1])) {$v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];}else {PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");return PclZip::errorCode();}$i++;break;case PCLZIP_OPT_BY_EREG :$p_options_list[$i] = PCLZIP_OPT_BY_PREG;case PCLZIP_OPT_BY_PREG :if (($i+1) >= $p_size) {PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");return PclZip::errorCode();}if (is_string($p_options_list[$i+1])) {$v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];}else {PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");return PclZip::errorCode();}$i++;break;case PCLZIP_OPT_COMMENT :case PCLZIP_OPT_ADD_COMMENT :case PCLZIP_OPT_PREPEND_COMMENT :if (($i+1) >= $p_size) {PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE,			 "Missing parameter value for option '"								 .PclZipUtilOptionText($p_options_list[$i])								 ."'");return PclZip::errorCode();}if (is_string($p_options_list[$i+1])) {$v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];}else {PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE,			 "Wrong parameter value for option '"								 .PclZipUtilOptionText($p_options_list[$i])								 ."'");return PclZip::errorCode();}$i++;break;case PCLZIP_OPT_BY_INDEX :if (($i+1) >= $p_size) {PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");return PclZip::errorCode();}$v_work_list = array();if (is_string($p_options_list[$i+1])) {$p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', '');$v_work_list = explode(",", $p_options_list[$i+1]);}else if (is_integer($p_options_list[$i+1])) {$v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1];}else if (is_array($p_options_list[$i+1])) {$v_work_list = $p_options_list[$i+1];}else {PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'");return PclZip::errorCode();}$v_sort_flag=false;$v_sort_value=0;for ($j=0; $j<sizeof($v_work_list); $j++) {$v_item_list = explode("-", $v_work_list[$j]);$v_size_item_list = sizeof($v_item_list);if ($v_size_item_list == 1) {$v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];$v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[0];}elseif ($v_size_item_list == 2) {$v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];$v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[1];}else {PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Too many values in index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");return PclZip::errorCode();}if ($v_result_list[$p_options_list[$i]][$j]['start'] < $v_sort_value) {$v_sort_flag=true;PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Invalid order of index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");return PclZip::errorCode();}$v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start'];}if ($v_sort_flag) {}$i++;break;case PCLZIP_OPT_REMOVE_ALL_PATH :case PCLZIP_OPT_EXTRACT_AS_STRING :case PCLZIP_OPT_NO_COMPRESSION :case PCLZIP_OPT_EXTRACT_IN_OUTPUT :case PCLZIP_OPT_REPLACE_NEWER :case PCLZIP_OPT_STOP_ON_ERROR :$v_result_list[$p_options_list[$i]] = true;break;case PCLZIP_OPT_SET_CHMOD :if (($i+1) >= $p_size) {PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");return PclZip::errorCode();}$v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];$i++;break;case PCLZIP_CB_PRE_EXTRACT :case PCLZIP_CB_POST_EXTRACT :case PCLZIP_CB_PRE_ADD :case PCLZIP_CB_POST_ADD :if (($i+1) >= $p_size) {PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");return PclZip::errorCode();}$v_function_name = $p_options_list[$i+1];if (!function_exists($v_function_name)) {PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'");return PclZip::errorCode();}$v_result_list[$p_options_list[$i]] = $v_function_name;$i++;break;default :PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,		 "Unknown parameter '"							 .$p_options_list[$i]."'");return PclZip::errorCode();}$i++;}if ($v_requested_options !== false) {for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {if ($v_requested_options[$key] == 'mandatory') {if (!isset($v_result_list[$key])) {PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");return PclZip::errorCode();}}}}if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) {}return $v_result;}function privOptionDefaultThreshold(&$p_options){$v_result=1;if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD])|| isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) {return $v_result;}$v_memory_limit = ini_get('memory_limit');$v_memory_limit = trim($v_memory_limit);$last = strtolower(substr($v_memory_limit, -1)); if($last == 'g')$v_memory_limit = $v_memory_limit*1073741824;if($last == 'm')$v_memory_limit = $v_memory_limit*1048576;if($last == 'k')$v_memory_limit = $v_memory_limit*1024;$p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO);if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) {unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]);}return $v_result;}function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false){$v_result=1;foreach ($p_file_list as $v_key => $v_value) {if (!isset($v_requested_options[$v_key])) {PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file");return PclZip::errorCode();}switch ($v_key) {case PCLZIP_ATT_FILE_NAME :if (!is_string($v_value)) {PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");return PclZip::errorCode();}$p_filedescr['filename'] = PclZipUtilPathReduction($v_value);if ($p_filedescr['filename'] == '') {PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'");return PclZip::errorCode();}break;case PCLZIP_ATT_FILE_NEW_SHORT_NAME :if (!is_string($v_value)) {PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");return PclZip::errorCode();}$p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value);if ($p_filedescr['new_short_name'] == '') {PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'");return PclZip::errorCode();}break;case PCLZIP_ATT_FILE_NEW_FULL_NAME :if (!is_string($v_value)) {PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");return PclZip::errorCode();}$p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value);if ($p_filedescr['new_full_name'] == '') {PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'");return PclZip::errorCode();}break;case PCLZIP_ATT_FILE_COMMENT :if (!is_string($v_value)) {PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");return PclZip::errorCode();}$p_filedescr['comment'] = $v_value;break;case PCLZIP_ATT_FILE_MTIME :if (!is_integer($v_value)) {PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'");return PclZip::errorCode();}$p_filedescr['mtime'] = $v_value;break;case PCLZIP_ATT_FILE_CONTENT :$p_filedescr['content'] = $v_value;break;default :PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,		 "Unknown parameter '".$v_key."'");return PclZip::errorCode();}if ($v_requested_options !== false) {for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {if ($v_requested_options[$key] == 'mandatory') {if (!isset($p_file_list[$key])) {PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");return PclZip::errorCode();}}}}}return $v_result;}function privFileDescrExpand(&$p_filedescr_list, &$p_options){$v_result=1;$v_result_list = array();for ($i=0; $i<sizeof($p_filedescr_list); $i++) {$v_descr = $p_filedescr_list[$i];$v_descr['filename'] = PclZipUtilTranslateWinPath($v_descr['filename'], false);$v_descr['filename'] = PclZipUtilPathReduction($v_descr['filename']);if (file_exists($v_descr['filename'])) {if (@is_file($v_descr['filename'])) {$v_descr['type'] = 'file';}else if (@is_dir($v_descr['filename'])) {$v_descr['type'] = 'folder';}else if (@is_link($v_descr['filename'])) {continue;}else {continue;}}else if (isset($v_descr['content'])) {$v_descr['type'] = 'virtual_file';}else {PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$v_descr['filename']."' does not exist");return PclZip::errorCode();}$this->privCalculateStoredFilename($v_descr, $p_options);$v_result_list[sizeof($v_result_list)] = $v_descr;if ($v_descr['type'] == 'folder') {$v_dirlist_descr = array();$v_dirlist_nb = 0;if ($v_folder_handler = @opendir($v_descr['filename'])) {while (($v_item_handler = @readdir($v_folder_handler)) !== false) {if (($v_item_handler == '.') || ($v_item_handler == '..')) {continue;}$v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler;if (($v_descr['stored_filename'] != $v_descr['filename']) && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) {if ($v_descr['stored_filename'] != '') {$v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler;}else {$v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler;}}$v_dirlist_nb++;}@closedir($v_folder_handler);}else {}if ($v_dirlist_nb != 0) {if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) {return $v_result;}$v_result_list = array_merge($v_result_list, $v_dirlist_descr);}else {}unset($v_dirlist_descr);}}$p_filedescr_list = $v_result_list;return $v_result;}function privCreate($p_filedescr_list, &$p_result_list, &$p_options){$v_result=1;$v_list_detail = array();$this->privDisableMagicQuotes();if (($v_result = $this->privOpenFd('wb')) != 1){return $v_result;}$v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options);$this->privCloseFd();$this->privSwapBackMagicQuotes();return $v_result;}function privAdd($p_filedescr_list, &$p_result_list, &$p_options){$v_result=1;$v_list_detail = array();if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)){$v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options);return $v_result;}$this->privDisableMagicQuotes();if (($v_result=$this->privOpenFd('rb')) != 1){$this->privSwapBackMagicQuotes();return $v_result;}$v_central_dir = array();if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1){$this->privCloseFd();$this->privSwapBackMagicQuotes();return $v_result;}@rewind($this->zip_fd);$v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0){$this->privCloseFd();$this->privSwapBackMagicQuotes();PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');return PclZip::errorCode();}$v_size = $v_central_dir['offset'];while ($v_size != 0){$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);$v_buffer = fread($this->zip_fd, $v_read_size);@fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);$v_size -= $v_read_size;}$v_swap = $this->zip_fd;$this->zip_fd = $v_zip_temp_fd;$v_zip_temp_fd = $v_swap;$v_header_list = array();if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1){fclose($v_zip_temp_fd);$this->privCloseFd();@unlink($v_zip_temp_name);$this->privSwapBackMagicQuotes();return $v_result;}$v_offset = @ftell($this->zip_fd);$v_size = $v_central_dir['size'];while ($v_size != 0){$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);$v_buffer = @fread($v_zip_temp_fd, $v_read_size);@fwrite($this->zip_fd, $v_buffer, $v_read_size);$v_size -= $v_read_size;}for ($i=0, $v_count=0; $i<sizeof($v_header_list); $i++){if ($v_header_list[$i]['status'] == 'ok') {if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {fclose($v_zip_temp_fd);$this->privCloseFd();@unlink($v_zip_temp_name);$this->privSwapBackMagicQuotes();return $v_result;}$v_count++;}$this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);}$v_comment = $v_central_dir['comment'];if (isset($p_options[PCLZIP_OPT_COMMENT])) {$v_comment = $p_options[PCLZIP_OPT_COMMENT];}if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) {$v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT];}if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) {$v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment;}$v_size = @ftell($this->zip_fd)-$v_offset;if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1){unset($v_header_list);$this->privSwapBackMagicQuotes();return $v_result;}$v_swap = $this->zip_fd;$this->zip_fd = $v_zip_temp_fd;$v_zip_temp_fd = $v_swap;$this->privCloseFd();@fclose($v_zip_temp_fd);$this->privSwapBackMagicQuotes();@unlink($this->zipname);PclZipUtilRename($v_zip_temp_name, $this->zipname);return $v_result;}function privOpenFd($p_mode){$v_result=1;if ($this->zip_fd != 0){PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open');return PclZip::errorCode();}if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0){PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode');return PclZip::errorCode();}return $v_result;}function privCloseFd(){$v_result=1;if ($this->zip_fd != 0)@fclose($this->zip_fd);$this->zip_fd = 0;return $v_result;}function privAddList($p_filedescr_list, &$p_result_list, &$p_options){$v_result=1;$v_header_list = array();if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1){return $v_result;}$v_offset = @ftell($this->zip_fd);for ($i=0,$v_count=0; $i<sizeof($v_header_list); $i++){if ($v_header_list[$i]['status'] == 'ok') {if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {return $v_result;}$v_count++;}$this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);}$v_comment = '';if (isset($p_options[PCLZIP_OPT_COMMENT])) {$v_comment = $p_options[PCLZIP_OPT_COMMENT];}$v_size = @ftell($this->zip_fd)-$v_offset;if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1){unset($v_header_list);return $v_result;}return $v_result;}function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options){$v_result=1;$v_header = array();$v_nb = sizeof($p_result_list);for ($j=0; ($j<sizeof($p_filedescr_list)) && ($v_result==1); $j++) {$p_filedescr_list[$j]['filename']= PclZipUtilTranslateWinPath($p_filedescr_list[$j]['filename'], false);if ($p_filedescr_list[$j]['filename'] == "") {continue;}if ( ($p_filedescr_list[$j]['type'] != 'virtual_file')&& (!file_exists($p_filedescr_list[$j]['filename']))) {PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$p_filedescr_list[$j]['filename']."' does not exist");return PclZip::errorCode();}if ( ($p_filedescr_list[$j]['type'] == 'file')|| ($p_filedescr_list[$j]['type'] == 'virtual_file')|| ( ($p_filedescr_list[$j]['type'] == 'folder')&& ( !isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])|| !$p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) {$v_result = $this->privAddFile($p_filedescr_list[$j], $v_header, $p_options);if ($v_result != 1) {return $v_result;}$p_result_list[$v_nb++] = $v_header;}}return $v_result;}function privAddFile($p_filedescr, &$p_header, &$p_options){$v_result=1;$p_filename = $p_filedescr['filename'];if ($p_filename == "") {PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)");return PclZip::errorCode();}clearstatcache();$p_header['version'] = 20;$p_header['version_extracted'] = 10;$p_header['flag'] = 0;$p_header['compression'] = 0;$p_header['crc'] = 0;$p_header['compressed_size'] = 0;$p_header['filename_len'] = strlen($p_filename);$p_header['extra_len'] = 0;$p_header['disk'] = 0;$p_header['internal'] = 0;$p_header['offset'] = 0;$p_header['filename'] = $p_filename;$p_header['stored_filename'] = $p_filedescr['stored_filename'];$p_header['extra'] = '';$p_header['status'] = 'ok';$p_header['index'] = -1;if ($p_filedescr['type']=='file') {$p_header['external'] = 0x00000000;$p_header['size'] = filesize($p_filename);}else if ($p_filedescr['type']=='folder') {$p_header['external'] = 0x00000010;$p_header['mtime'] = filemtime($p_filename);$p_header['size'] = filesize($p_filename);}else if ($p_filedescr['type'] == 'virtual_file') {$p_header['external'] = 0x00000000;$p_header['size'] = strlen($p_filedescr['content']);}if (isset($p_filedescr['mtime'])) {$p_header['mtime'] = $p_filedescr['mtime'];}else if ($p_filedescr['type'] == 'virtual_file') {$p_header['mtime'] = time();}else {$p_header['mtime'] = filemtime($p_filename);}if (isset($p_filedescr['comment'])) {$p_header['comment_len'] = strlen($p_filedescr['comment']);$p_header['comment'] = $p_filedescr['comment'];}else {$p_header['comment_len'] = 0;$p_header['comment'] = '';}if (isset($p_options[PCLZIP_CB_PRE_ADD])) {$v_local_header = array();$this->privConvertHeader2FileInfo($p_header, $v_local_header);$v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header);if ($v_result == 0) {$p_header['status'] = "skipped";$v_result = 1;}if ($p_header['stored_filename'] != $v_local_header['stored_filename']) {$p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']);}}if ($p_header['stored_filename'] == "") {$p_header['status'] = "filtered";}if (strlen($p_header['stored_filename']) > 0xFF) {$p_header['status'] = 'filename_too_long';}if ($p_header['status'] == 'ok') {if ($p_filedescr['type'] == 'file') {if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON])|| (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD])&& ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) {$v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options);if ($v_result < PCLZIP_ERR_NO_ERROR) {return $v_result;}}else {if (($v_file = @fopen($p_filename, "rb")) == 0) {PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode");return PclZip::errorCode();}$v_content = @fread($v_file, $p_header['size']);@fclose($v_file);$p_header['crc'] = @crc32($v_content);if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {$p_header['compressed_size'] = $p_header['size'];$p_header['compression'] = 0;}else {$v_content = @gzdeflate($v_content);$p_header['compressed_size'] = strlen($v_content);$p_header['compression'] = 8;}if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {@fclose($v_file);return $v_result;}@fwrite($this->zip_fd, $v_content, $p_header['compressed_size']);}}else if ($p_filedescr['type'] == 'virtual_file') {$v_content = $p_filedescr['content'];$p_header['crc'] = @crc32($v_content);if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {$p_header['compressed_size'] = $p_header['size'];$p_header['compression'] = 0;}else {$v_content = @gzdeflate($v_content);$p_header['compressed_size'] = strlen($v_content);$p_header['compression'] = 8;}if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {@fclose($v_file);return $v_result;}@fwrite($this->zip_fd, $v_content, $p_header['compressed_size']);}else if ($p_filedescr['type'] == 'folder') {if (@substr($p_header['stored_filename'], -1) != '/') {$p_header['stored_filename'] .= '/';}$p_header['size'] = 0;$p_header['external'] = 0x00000010; if (($v_result = $this->privWriteFileHeader($p_header)) != 1){return $v_result;}}}if (isset($p_options[PCLZIP_CB_POST_ADD])) {$v_local_header = array();$this->privConvertHeader2FileInfo($p_header, $v_local_header);$v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header);if ($v_result == 0) {$v_result = 1;}}return $v_result;}function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options){$v_result=PCLZIP_ERR_NO_ERROR;$p_filename = $p_filedescr['filename'];if (($v_file = @fopen($p_filename, "rb")) == 0) {PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode");return PclZip::errorCode();}$v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz';if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) {fclose($v_file);PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode');return PclZip::errorCode();}$v_size = filesize($p_filename);while ($v_size != 0) {$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);$v_buffer = @fread($v_file, $v_read_size);@gzputs($v_file_compressed, $v_buffer, $v_read_size);$v_size -= $v_read_size;}@fclose($v_file);@gzclose($v_file_compressed);if (filesize($v_gzip_temp_name) < 18) {PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes');return PclZip::errorCode();}if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) {PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode');return PclZip::errorCode();}$v_binary_data = @fread($v_file_compressed, 10);$v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data);$v_data_header['os'] = bin2hex($v_data_header['os']);@fseek($v_file_compressed, filesize($v_gzip_temp_name)-8);$v_binary_data = @fread($v_file_compressed, 8);$v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data);$p_header['compression'] = ord($v_data_header['cm']);$p_header['crc'] = $v_data_footer['crc'];$p_header['compressed_size'] = filesize($v_gzip_temp_name)-18;@fclose($v_file_compressed);if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {return $v_result;}if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0){PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode');return PclZip::errorCode();}fseek($v_file_compressed, 10);$v_size = $p_header['compressed_size'];while ($v_size != 0){$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);$v_buffer = @fread($v_file_compressed, $v_read_size);@fwrite($this->zip_fd, $v_buffer, $v_read_size);$v_size -= $v_read_size;}@fclose($v_file_compressed);@unlink($v_gzip_temp_name);return $v_result;}function privCalculateStoredFilename(&$p_filedescr, &$p_options){$v_result=1;$p_filename = $p_filedescr['filename'];if (isset($p_options[PCLZIP_OPT_ADD_PATH])) {$p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH];}else {$p_add_dir = '';}if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) {$p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH];}else {$p_remove_dir = '';}if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {$p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH];}else {$p_remove_all_dir = 0;}if (isset($p_filedescr['new_full_name'])) {$v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']);}else {if (isset($p_filedescr['new_short_name'])) {$v_path_info = pathinfo($p_filename);$v_dir = '';if ($v_path_info['dirname'] != '') {$v_dir = $v_path_info['dirname'].'/';}$v_stored_filename = $v_dir.$p_filedescr['new_short_name'];}else {$v_stored_filename = $p_filename;}if ($p_remove_all_dir) {$v_stored_filename = basename($p_filename);}else if ($p_remove_dir != "") {if (substr($p_remove_dir, -1) != '/')$p_remove_dir .= "/";if ( (substr($p_filename, 0, 2) == "./")|| (substr($p_remove_dir, 0, 2) == "./")) {if ( (substr($p_filename, 0, 2) == "./")&& (substr($p_remove_dir, 0, 2) != "./")) {$p_remove_dir = "./".$p_remove_dir;}if ( (substr($p_filename, 0, 2) != "./")&& (substr($p_remove_dir, 0, 2) == "./")) {$p_remove_dir = substr($p_remove_dir, 2);}}$v_compare = PclZipUtilPathInclusion($p_remove_dir, $v_stored_filename);if ($v_compare > 0) {if ($v_compare == 2) {$v_stored_filename = "";}else {$v_stored_filename = substr($v_stored_filename,strlen($p_remove_dir));}}}$v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename);if ($p_add_dir != "") {if (substr($p_add_dir, -1) == "/")$v_stored_filename = $p_add_dir.$v_stored_filename;else$v_stored_filename = $p_add_dir."/".$v_stored_filename;}}$v_stored_filename = PclZipUtilPathReduction($v_stored_filename);$p_filedescr['stored_filename'] = $v_stored_filename;return $v_result;}function privWriteFileHeader(&$p_header){$v_result=1;$p_header['offset'] = ftell($this->zip_fd);$v_date = getdate($p_header['mtime']);$v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;$v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];$v_binary_data = pack("VvvvvvVVVvv", 0x04034b50,	$p_header['version_extracted'], $p_header['flag'],$p_header['compression'], $v_mtime, $v_mdate,$p_header['crc'], $p_header['compressed_size'],						$p_header['size'],strlen($p_header['stored_filename']),						$p_header['extra_len']);fputs($this->zip_fd, $v_binary_data, 30);if (strlen($p_header['stored_filename']) != 0){fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));}if ($p_header['extra_len'] != 0){fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);}return $v_result;}function privWriteCentralFileHeader(&$p_header){$v_result=1;$v_date = getdate($p_header['mtime']);$v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;$v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];$v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50,	$p_header['version'], $p_header['version_extracted'],$p_header['flag'], $p_header['compression'],						$v_mtime, $v_mdate, $p_header['crc'],$p_header['compressed_size'], $p_header['size'],strlen($p_header['stored_filename']),						$p_header['extra_len'], $p_header['comment_len'],$p_header['disk'], $p_header['internal'],						$p_header['external'], $p_header['offset']);fputs($this->zip_fd, $v_binary_data, 46);if (strlen($p_header['stored_filename']) != 0){fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));}if ($p_header['extra_len'] != 0){fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);}if ($p_header['comment_len'] != 0){fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']);}return $v_result;}function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment){$v_result=1;$v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries,	$p_nb_entries, $p_size,						$p_offset, strlen($p_comment));fputs($this->zip_fd, $v_binary_data, 22);if (strlen($p_comment) != 0){fputs($this->zip_fd, $p_comment, strlen($p_comment));}return $v_result;}function privList(&$p_list){$v_result=1;$this->privDisableMagicQuotes();if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0){$this->privSwapBackMagicQuotes();PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');return PclZip::errorCode();}$v_central_dir = array();if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1){$this->privSwapBackMagicQuotes();return $v_result;}@rewind($this->zip_fd);if (@fseek($this->zip_fd, $v_central_dir['offset'])){$this->privSwapBackMagicQuotes();PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');return PclZip::errorCode();}for ($i=0; $i<$v_central_dir['entries']; $i++){if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1){$this->privSwapBackMagicQuotes();return $v_result;}$v_header['index'] = $i;$this->privConvertHeader2FileInfo($v_header, $p_list[$i]);unset($v_header);}$this->privCloseFd();$this->privSwapBackMagicQuotes();return $v_result;}function privConvertHeader2FileInfo($p_header, &$p_info){$v_result=1;$v_temp_path = PclZipUtilPathReduction($p_header['filename']);$p_info['filename'] = $v_temp_path;$v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']);$p_info['stored_filename'] = $v_temp_path;$p_info['size'] = $p_header['size'];$p_info['compressed_size'] = $p_header['compressed_size'];$p_info['mtime'] = $p_header['mtime'];$p_info['comment'] = $p_header['comment'];$p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010);$p_info['index'] = $p_header['index'];$p_info['status'] = $p_header['status'];$p_info['crc'] = $p_header['crc'];return $v_result;}function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options){$v_result=1;$this->privDisableMagicQuotes();if ( ($p_path == "")	|| ( (substr($p_path, 0, 1) != "/")		&& (substr($p_path, 0, 3) != "../")			&& (substr($p_path,1,2)!=":/")))$p_path = "./".$p_path;if (($p_path != "./") && ($p_path != "/")){while (substr($p_path, -1) == "/"){$p_path = substr($p_path, 0, strlen($p_path)-1);}}if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')){$p_remove_path .= '/';}$p_remove_path_size = strlen($p_remove_path);if (($v_result = $this->privOpenFd('rb')) != 1){$this->privSwapBackMagicQuotes();return $v_result;}$v_central_dir = array();if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1){$this->privCloseFd();$this->privSwapBackMagicQuotes();return $v_result;}$v_pos_entry = $v_central_dir['offset'];$j_start = 0;for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++){@rewind($this->zip_fd);if (@fseek($this->zip_fd, $v_pos_entry)){$this->privCloseFd();$this->privSwapBackMagicQuotes();PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');return PclZip::errorCode();}$v_header = array();if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1){$this->privCloseFd();$this->privSwapBackMagicQuotes();return $v_result;}$v_header['index'] = $i;$v_pos_entry = ftell($this->zip_fd);$v_extract = false;if ( (isset($p_options[PCLZIP_OPT_BY_NAME]))&& ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_extract); $j++) {if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {if ( (strlen($v_header['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))&& (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {$v_extract = true;}}elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {$v_extract = true;}}}else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) {$v_extract = true;}}else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_extract); $j++) {if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {$v_extract = true;}if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {$j_start = $j+1;}if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {break;}}}else {$v_extract = true;}		if ( ($v_extract)	&& ( ($v_header['compression'] != 8)		&& ($v_header['compression'] != 0))) {$v_header['status'] = 'unsupported_compression';if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))		&& ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {$this->privSwapBackMagicQuotes();PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION,			 "Filename '".$v_header['stored_filename']."' is "							 ."compressed by an unsupported compression "							 ."method (".$v_header['compression'].") ");return PclZip::errorCode();		}	}			if (($v_extract) && (($v_header['flag'] & 1) == 1)) {$v_header['status'] = 'unsupported_encryption';if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))		&& ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {$this->privSwapBackMagicQuotes();PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION,			 "Unsupported encryption for "							 ." filename '".$v_header['stored_filename']								 ."'");return PclZip::errorCode();		}}if (($v_extract) && ($v_header['status'] != 'ok')) {$v_result = $this->privConvertHeader2FileInfo($v_header,		$p_file_list[$v_nb_extracted++]);if ($v_result != 1) {$this->privCloseFd();$this->privSwapBackMagicQuotes();return $v_result;}$v_extract = false;}if ($v_extract){@rewind($this->zip_fd);if (@fseek($this->zip_fd, $v_header['offset'])){$this->privCloseFd();$this->privSwapBackMagicQuotes();PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');return PclZip::errorCode();}if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) {$v_string = '';$v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options);if ($v_result1 < 1) {$this->privCloseFd();$this->privSwapBackMagicQuotes();return $v_result1;}if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1){$this->privCloseFd();$this->privSwapBackMagicQuotes();return $v_result;}$p_file_list[$v_nb_extracted]['content'] = $v_string;$v_nb_extracted++;if ($v_result1 == 2) {	break;}}elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT]))		&& ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) {$v_result1 = $this->privExtractFileInOutput($v_header, $p_options);if ($v_result1 < 1) {$this->privCloseFd();$this->privSwapBackMagicQuotes();return $v_result1;}if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) {$this->privCloseFd();$this->privSwapBackMagicQuotes();return $v_result;}if ($v_result1 == 2) {	break;}}else {$v_result1 = $this->privExtractFile($v_header,		$p_path, $p_remove_path,											$p_remove_all_path,											$p_options);if ($v_result1 < 1) {$this->privCloseFd();$this->privSwapBackMagicQuotes();return $v_result1;}if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1){$this->privCloseFd();$this->privSwapBackMagicQuotes();return $v_result;}if ($v_result1 == 2) {	break;}}}}$this->privCloseFd();$this->privSwapBackMagicQuotes();return $v_result;}function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options){$v_result=1;if (($v_result = $this->privReadFileHeader($v_header)) != 1){return $v_result;}if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {}if ($p_remove_all_path == true) {if (($p_entry['external']&0x00000010)==0x00000010) {$p_entry['status'] = "filtered";return $v_result;}$p_entry['filename'] = basename($p_entry['filename']);}else if ($p_remove_path != ""){if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2){$p_entry['status'] = "filtered";return $v_result;}$p_remove_path_size = strlen($p_remove_path);if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path){$p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size);}}if ($p_path != '') {$p_entry['filename'] = $p_path."/".$p_entry['filename'];}if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) {$v_inclusion= PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION],$p_entry['filename']); if ($v_inclusion == 0) {PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION,			 "Filename '".$p_entry['filename']."' is "								 ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION");return PclZip::errorCode();}}if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {$v_local_header = array();$this->privConvertHeader2FileInfo($p_entry, $v_local_header);$v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);if ($v_result == 0) {$p_entry['status'] = "skipped";$v_result = 1;}if ($v_result == 2) {$p_entry['status'] = "aborted";	$v_result = PCLZIP_ERR_USER_ABORTED;}$p_entry['filename'] = $v_local_header['filename'];}if ($p_entry['status'] == 'ok') {if (file_exists($p_entry['filename'])){if (is_dir($p_entry['filename'])){$p_entry['status'] = "already_a_directory";if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))		&& ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY,			 "Filename '".$p_entry['filename']."' is "								 ."already used by an existing directory");return PclZip::errorCode();		}}else if (!is_writeable($p_entry['filename'])){$p_entry['status'] = "write_protected";if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))		&& ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,			 "Filename '".$p_entry['filename']."' exists "								 ."and is write protected");return PclZip::errorCode();		}}else if (filemtime($p_entry['filename']) > $p_entry['mtime']){if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER]))		&& ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) {		}		else {$p_entry['status'] = "newer_exist";if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))		&& ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,			 "Newer version of '".$p_entry['filename']."' exists "					."and option PCLZIP_OPT_REPLACE_NEWER is not selected");return PclZip::errorCode();		}		}}else {}}else {if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/'))$v_dir_to_check = $p_entry['filename'];else if (!strstr($p_entry['filename'], "/"))$v_dir_to_check = "";else$v_dir_to_check = dirname($p_entry['filename']);if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) {$p_entry['status'] = "path_creation_fail";$v_result = 1;}}}if ($p_entry['status'] == 'ok') {if (!(($p_entry['external']&0x00000010)==0x00000010)){if ($p_entry['compression'] == 0) {		if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0){$p_entry['status'] = "write_error";return $v_result;}$v_size = $p_entry['compressed_size'];while ($v_size != 0){$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);$v_buffer = @fread($this->zip_fd, $v_read_size);@fwrite($v_dest_file, $v_buffer, $v_read_size);$v_size -= $v_read_size;}fclose($v_dest_file);touch($p_entry['filename'], $p_entry['mtime']);}else {if (($p_entry['flag'] & 1) == 1) {PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.');return PclZip::errorCode();}if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON])|| (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD])&& ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) {$v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options);if ($v_result < PCLZIP_ERR_NO_ERROR) {return $v_result;}}else {$v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);$v_file_content = @gzinflate($v_buffer);unset($v_buffer);if ($v_file_content === FALSE) {$p_entry['status'] = "error";return $v_result;}if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {$p_entry['status'] = "write_error";return $v_result;}@fwrite($v_dest_file, $v_file_content, $p_entry['size']);unset($v_file_content);@fclose($v_dest_file);}@touch($p_entry['filename'], $p_entry['mtime']);}if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) {@chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]);}}}		if ($p_entry['status'] == "aborted") {$p_entry['status'] = "skipped";	}	elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {$v_local_header = array();$this->privConvertHeader2FileInfo($p_entry, $v_local_header);$v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);if ($v_result == 2) {	$v_result = PCLZIP_ERR_USER_ABORTED;}}return $v_result;}function privExtractFileUsingTempFile(&$p_entry, &$p_options){$v_result=1;$v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz';if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) {fclose($v_file);PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode');return PclZip::errorCode();}$v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3));@fwrite($v_dest_file, $v_binary_data, 10);$v_size = $p_entry['compressed_size'];while ($v_size != 0){$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);$v_buffer = @fread($this->zip_fd, $v_read_size);@fwrite($v_dest_file, $v_buffer, $v_read_size);$v_size -= $v_read_size;}$v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']);@fwrite($v_dest_file, $v_binary_data, 8);@fclose($v_dest_file);if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {$p_entry['status'] = "write_error";return $v_result;}if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) {@fclose($v_dest_file);$p_entry['status'] = "read_error";PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode');return PclZip::errorCode();}$v_size = $p_entry['size'];while ($v_size != 0) {$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);$v_buffer = @gzread($v_src_file, $v_read_size);@fwrite($v_dest_file, $v_buffer, $v_read_size);$v_size -= $v_read_size;}@fclose($v_dest_file);@gzclose($v_src_file);@unlink($v_gzip_temp_name);return $v_result;}function privExtractFileInOutput(&$p_entry, &$p_options){$v_result=1;if (($v_result = $this->privReadFileHeader($v_header)) != 1) {return $v_result;}if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {}if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {$v_local_header = array();$this->privConvertHeader2FileInfo($p_entry, $v_local_header);$v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);if ($v_result == 0) {$p_entry['status'] = "skipped";$v_result = 1;}if ($v_result == 2) {$p_entry['status'] = "aborted";	$v_result = PCLZIP_ERR_USER_ABORTED;}$p_entry['filename'] = $v_local_header['filename'];}if ($p_entry['status'] == 'ok') {if (!(($p_entry['external']&0x00000010)==0x00000010)) {if ($p_entry['compressed_size'] == $p_entry['size']) {$v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);echo $v_buffer;unset($v_buffer);}else {$v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);$v_file_content = gzinflate($v_buffer);unset($v_buffer);echo $v_file_content;unset($v_file_content);}}}		if ($p_entry['status'] == "aborted") {$p_entry['status'] = "skipped";	}elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {$v_local_header = array();$this->privConvertHeader2FileInfo($p_entry, $v_local_header);$v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);if ($v_result == 2) {	$v_result = PCLZIP_ERR_USER_ABORTED;}}return $v_result;}function privExtractFileAsString(&$p_entry, &$p_string, &$p_options){$v_result=1;$v_header = array();if (($v_result = $this->privReadFileHeader($v_header)) != 1){return $v_result;}if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {}if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {$v_local_header = array();$this->privConvertHeader2FileInfo($p_entry, $v_local_header);$v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);if ($v_result == 0) {$p_entry['status'] = "skipped";$v_result = 1;}if ($v_result == 2) {$p_entry['status'] = "aborted";	$v_result = PCLZIP_ERR_USER_ABORTED;}$p_entry['filename'] = $v_local_header['filename'];}if ($p_entry['status'] == 'ok') {if (!(($p_entry['external']&0x00000010)==0x00000010)) {if ($p_entry['compression'] == 0) {$p_string = @fread($this->zip_fd, $p_entry['compressed_size']);}else {$v_data = @fread($this->zip_fd, $p_entry['compressed_size']);if (($p_string = @gzinflate($v_data)) === FALSE) {}}}else {}}		if ($p_entry['status'] == "aborted") {$p_entry['status'] = "skipped";	}	elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {$v_local_header = array();$this->privConvertHeader2FileInfo($p_entry, $v_local_header);$v_local_header['content'] = $p_string;$p_string = '';$v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);$p_string = $v_local_header['content'];unset($v_local_header['content']);if ($v_result == 2) {	$v_result = PCLZIP_ERR_USER_ABORTED;}}return $v_result;}function privReadFileHeader(&$p_header){$v_result=1;$v_binary_data = @fread($this->zip_fd, 4);$v_data = unpack('Vid', $v_binary_data);if ($v_data['id'] != 0x04034b50){PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');return PclZip::errorCode();}$v_binary_data = fread($this->zip_fd, 26);if (strlen($v_binary_data) != 26){$p_header['filename'] = "";$p_header['status'] = "invalid_header";PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));return PclZip::errorCode();}$v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data);$p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']);if ($v_data['extra_len'] != 0) {$p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']);}else {$p_header['extra'] = '';}$p_header['version_extracted'] = $v_data['version'];$p_header['compression'] = $v_data['compression'];$p_header['size'] = $v_data['size'];$p_header['compressed_size'] = $v_data['compressed_size'];$p_header['crc'] = $v_data['crc'];$p_header['flag'] = $v_data['flag'];$p_header['filename_len'] = $v_data['filename_len'];$p_header['mdate'] = $v_data['mdate'];$p_header['mtime'] = $v_data['mtime'];if ($p_header['mdate'] && $p_header['mtime']){$v_hour = ($p_header['mtime'] & 0xF800) >> 11;$v_minute = ($p_header['mtime'] & 0x07E0) >> 5;$v_seconde = ($p_header['mtime'] & 0x001F)*2;$v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;$v_month = ($p_header['mdate'] & 0x01E0) >> 5;$v_day = $p_header['mdate'] & 0x001F;$p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);}else{$p_header['mtime'] = time();}$p_header['stored_filename'] = $p_header['filename'];$p_header['status'] = "ok";return $v_result;}function privReadCentralFileHeader(&$p_header){$v_result=1;$v_binary_data = @fread($this->zip_fd, 4);$v_data = unpack('Vid', $v_binary_data);if ($v_data['id'] != 0x02014b50){PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');return PclZip::errorCode();}$v_binary_data = fread($this->zip_fd, 42);if (strlen($v_binary_data) != 42){$p_header['filename'] = "";$p_header['status'] = "invalid_header";PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));return PclZip::errorCode();}$p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data);if ($p_header['filename_len'] != 0)$p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']);else$p_header['filename'] = '';if ($p_header['extra_len'] != 0)$p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']);else$p_header['extra'] = '';if ($p_header['comment_len'] != 0)$p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']);else$p_header['comment'] = '';if (1){$v_hour = ($p_header['mtime'] & 0xF800) >> 11;$v_minute = ($p_header['mtime'] & 0x07E0) >> 5;$v_seconde = ($p_header['mtime'] & 0x001F)*2;$v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;$v_month = ($p_header['mdate'] & 0x01E0) >> 5;$v_day = $p_header['mdate'] & 0x001F;$p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);}else{$p_header['mtime'] = time();}$p_header['stored_filename'] = $p_header['filename'];$p_header['status'] = 'ok';if (substr($p_header['filename'], -1) == '/') {$p_header['external'] = 0x00000010;}return $v_result;}function privCheckFileHeaders(&$p_local_header, &$p_central_header){$v_result=1;			if ($p_local_header['filename'] != $p_central_header['filename']) {	}	if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) {	}	if ($p_local_header['flag'] != $p_central_header['flag']) {	}	if ($p_local_header['compression'] != $p_central_header['compression']) {	}	if ($p_local_header['mtime'] != $p_central_header['mtime']) {	}	if ($p_local_header['filename_len'] != $p_central_header['filename_len']) {	}		if (($p_local_header['flag'] & 8) == 8) {$p_local_header['size'] = $p_central_header['size'];$p_local_header['compressed_size'] = $p_central_header['compressed_size'];$p_local_header['crc'] = $p_central_header['crc'];	}return $v_result;}function privReadEndCentralDir(&$p_central_dir){$v_result=1;$v_size = filesize($this->zipname);@fseek($this->zip_fd, $v_size);if (@ftell($this->zip_fd) != $v_size){PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\'');return PclZip::errorCode();}$v_found = 0;if ($v_size > 26) {@fseek($this->zip_fd, $v_size-22);if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)){PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\'');return PclZip::errorCode();}$v_binary_data = @fread($this->zip_fd, 4);$v_data = @unpack('Vid', $v_binary_data);if ($v_data['id'] == 0x06054b50) {$v_found = 1;}$v_pos = ftell($this->zip_fd);}if (!$v_found) {$v_maximum_size = 65557; if ($v_maximum_size > $v_size)$v_maximum_size = $v_size;@fseek($this->zip_fd, $v_size-$v_maximum_size);if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)){PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\'');return PclZip::errorCode();}$v_pos = ftell($this->zip_fd);$v_bytes = 0x00000000;while ($v_pos < $v_size){$v_byte = @fread($this->zip_fd, 1);$v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); if ($v_bytes == 0x504b0506){$v_pos++;break;}$v_pos++;}if ($v_pos == $v_size){PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature");return PclZip::errorCode();}}$v_binary_data = fread($this->zip_fd, 18);if (strlen($v_binary_data) != 18){PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data));return PclZip::errorCode();}$v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data);if (($v_pos + $v_data['comment_size'] + 18) != $v_size) {					if (0) {PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT,	 'The central dir is not at the end of the archive.'						 .' Some trailing bytes exists after the archive.');return PclZip::errorCode();	}}if ($v_data['comment_size'] != 0) {$p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']);}else$p_central_dir['comment'] = '';$p_central_dir['entries'] = $v_data['entries'];$p_central_dir['disk_entries'] = $v_data['disk_entries'];$p_central_dir['offset'] = $v_data['offset'];$p_central_dir['size'] = $v_data['size'];$p_central_dir['disk'] = $v_data['disk'];$p_central_dir['disk_start'] = $v_data['disk_start'];return $v_result;}function privDeleteByRule(&$p_result_list, &$p_options){$v_result=1;$v_list_detail = array();if (($v_result=$this->privOpenFd('rb')) != 1){return $v_result;}$v_central_dir = array();if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1){$this->privCloseFd();return $v_result;}@rewind($this->zip_fd);$v_pos_entry = $v_central_dir['offset'];@rewind($this->zip_fd);if (@fseek($this->zip_fd, $v_pos_entry)){$this->privCloseFd();PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');return PclZip::errorCode();}$v_header_list = array();$j_start = 0;for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++){$v_header_list[$v_nb_extracted] = array();if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1){$this->privCloseFd();return $v_result;}$v_header_list[$v_nb_extracted]['index'] = $i;$v_found = false;if ( (isset($p_options[PCLZIP_OPT_BY_NAME]))&& ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_found); $j++) {if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {if ( (strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))&& (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {$v_found = true;}elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) {$v_found = true;}}elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {$v_found = true;}}}else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {$v_found = true;}}else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_found); $j++) {if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {$v_found = true;}if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {$j_start = $j+1;}if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {break;}}}else {	$v_found = true;}if ($v_found){unset($v_header_list[$v_nb_extracted]);}else{$v_nb_extracted++;}}if ($v_nb_extracted > 0) {$v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';$v_temp_zip = new PclZip($v_zip_temp_name);if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) {$this->privCloseFd();return $v_result;}for ($i=0; $i<sizeof($v_header_list); $i++) {@rewind($this->zip_fd);if (@fseek($this->zip_fd,$v_header_list[$i]['offset'])) {$this->privCloseFd();$v_temp_zip->privCloseFd();@unlink($v_zip_temp_name);PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');return PclZip::errorCode();}$v_local_header = array();if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) {$this->privCloseFd();$v_temp_zip->privCloseFd();@unlink($v_zip_temp_name);return $v_result;}if ($this->privCheckFileHeaders($v_local_header,			$v_header_list[$i]) != 1) {}unset($v_local_header);if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) {$this->privCloseFd();$v_temp_zip->privCloseFd();@unlink($v_zip_temp_name);return $v_result;}if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) {$this->privCloseFd();$v_temp_zip->privCloseFd();@unlink($v_zip_temp_name);return $v_result;}}$v_offset = @ftell($v_temp_zip->zip_fd);for ($i=0; $i<sizeof($v_header_list); $i++) {if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) {$v_temp_zip->privCloseFd();$this->privCloseFd();@unlink($v_zip_temp_name);return $v_result;}$v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);}$v_comment = '';if (isset($p_options[PCLZIP_OPT_COMMENT])) {$v_comment = $p_options[PCLZIP_OPT_COMMENT];}$v_size = @ftell($v_temp_zip->zip_fd)-$v_offset;if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) {unset($v_header_list);$v_temp_zip->privCloseFd();$this->privCloseFd();@unlink($v_zip_temp_name);return $v_result;}$v_temp_zip->privCloseFd();$this->privCloseFd();@unlink($this->zipname);PclZipUtilRename($v_zip_temp_name, $this->zipname);unset($v_temp_zip);}else if ($v_central_dir['entries'] != 0) {$this->privCloseFd();if (($v_result = $this->privOpenFd('wb')) != 1) {return $v_result;}if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) {return $v_result;}$this->privCloseFd();}return $v_result;}function privDirCheck($p_dir, $p_is_dir=false){$v_result = 1;if (($p_is_dir) && (substr($p_dir, -1)=='/')){$p_dir = substr($p_dir, 0, strlen($p_dir)-1);}if ((is_dir($p_dir)) || ($p_dir == "")){return 1;}$p_parent_dir = dirname($p_dir);if ($p_parent_dir != $p_dir){if ($p_parent_dir != ""){if (($v_result = $this->privDirCheck($p_parent_dir)) != 1){return $v_result;}}}if (!@mkdir($p_dir, 0777)){PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'");return PclZip::errorCode();}return $v_result;}function privMerge(&$p_archive_to_add){$v_result=1;if (!is_file($p_archive_to_add->zipname)){$v_result = 1;return $v_result;}if (!is_file($this->zipname)){$v_result = $this->privDuplicate($p_archive_to_add->zipname);return $v_result;}if (($v_result=$this->privOpenFd('rb')) != 1){return $v_result;}$v_central_dir = array();if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1){$this->privCloseFd();return $v_result;}@rewind($this->zip_fd);if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1){$this->privCloseFd();return $v_result;}$v_central_dir_to_add = array();if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1){$this->privCloseFd();$p_archive_to_add->privCloseFd();return $v_result;}@rewind($p_archive_to_add->zip_fd);$v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0){$this->privCloseFd();$p_archive_to_add->privCloseFd();PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');return PclZip::errorCode();}$v_size = $v_central_dir['offset'];while ($v_size != 0){$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);$v_buffer = fread($this->zip_fd, $v_read_size);@fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);$v_size -= $v_read_size;}$v_size = $v_central_dir_to_add['offset'];while ($v_size != 0){$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);$v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size);@fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);$v_size -= $v_read_size;}$v_offset = @ftell($v_zip_temp_fd);$v_size = $v_central_dir['size'];while ($v_size != 0){$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);$v_buffer = @fread($this->zip_fd, $v_read_size);@fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);$v_size -= $v_read_size;}$v_size = $v_central_dir_to_add['size'];while ($v_size != 0){$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);$v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size);@fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);$v_size -= $v_read_size;}$v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment'];$v_size = @ftell($v_zip_temp_fd)-$v_offset;$v_swap = $this->zip_fd;$this->zip_fd = $v_zip_temp_fd;$v_zip_temp_fd = $v_swap;if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1){$this->privCloseFd();$p_archive_to_add->privCloseFd();@fclose($v_zip_temp_fd);$this->zip_fd = null;unset($v_header_list);return $v_result;}$v_swap = $this->zip_fd;$this->zip_fd = $v_zip_temp_fd;$v_zip_temp_fd = $v_swap;$this->privCloseFd();$p_archive_to_add->privCloseFd();@fclose($v_zip_temp_fd);@unlink($this->zipname);PclZipUtilRename($v_zip_temp_name, $this->zipname);return $v_result;}function privDuplicate($p_archive_filename){$v_result=1;if (!is_file($p_archive_filename)){$v_result = 1;return $v_result;}if (($v_result=$this->privOpenFd('wb')) != 1){return $v_result;}if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0){$this->privCloseFd();PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode');return PclZip::errorCode();}$v_size = filesize($p_archive_filename);while ($v_size != 0){$v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);$v_buffer = fread($v_zip_temp_fd, $v_read_size);@fwrite($this->zip_fd, $v_buffer, $v_read_size);$v_size -= $v_read_size;}$this->privCloseFd();@fclose($v_zip_temp_fd);return $v_result;}function privErrorLog($p_error_code=0, $p_error_string=''){if (PCLZIP_ERROR_EXTERNAL == 1) {PclError($p_error_code, $p_error_string);}else {$this->error_code = $p_error_code;$this->error_string = $p_error_string;}}function privErrorReset(){if (PCLZIP_ERROR_EXTERNAL == 1) {PclErrorReset();}else {$this->error_code = 0;$this->error_string = '';}}function privDisableMagicQuotes(){$v_result=1;if ( (!function_exists("get_magic_quotes_runtime"))	|| (!function_exists("set_magic_quotes_runtime"))) {return $v_result;	}if ($this->magic_quotes_status != -1) {return $v_result;	}		$this->magic_quotes_status = @get_magic_quotes_runtime();		if ($this->magic_quotes_status == 1) {	@set_magic_quotes_runtime(0);	}return $v_result;}function privSwapBackMagicQuotes(){$v_result=1;if ( (!function_exists("get_magic_quotes_runtime"))	|| (!function_exists("set_magic_quotes_runtime"))) {return $v_result;	}if ($this->magic_quotes_status != -1) {return $v_result;	}		if ($this->magic_quotes_status == 1) {	@set_magic_quotes_runtime($this->magic_quotes_status);	}return $v_result;}}function PclZipUtilPathReduction($p_dir){$v_result = "";if ($p_dir != "") {$v_list = explode("/", $p_dir);$v_skip = 0;for ($i=sizeof($v_list)-1; $i>=0; $i--) {if ($v_list[$i] == ".") {}else if ($v_list[$i] == "..") {		$v_skip++;}else if ($v_list[$i] == "") {				if ($i == 0) {$v_result = "/".$v_result;		if ($v_skip > 0) {						$v_result = $p_dir;$v_skip = 0;		}		}				else if ($i == (sizeof($v_list)-1)) {$v_result = $v_list[$i];		}				else {		}}else {				if ($v_skip > 0) {		$v_skip--;		}		else {$v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:"");		}}}if ($v_skip > 0) {while ($v_skip > 0) {$v_result = '../'.$v_result;$v_skip--;}}}return $v_result;}function PclZipUtilPathInclusion($p_dir, $p_path){$v_result = 1;if ( ($p_dir == '.')|| ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) {$p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1);}if ( ($p_path == '.')|| ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) {$p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1);}$v_list_dir = explode("/", $p_dir);$v_list_dir_size = sizeof($v_list_dir);$v_list_path = explode("/", $p_path);$v_list_path_size = sizeof($v_list_path);$i = 0;$j = 0;while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) {if ($v_list_dir[$i] == '') {$i++;continue;}if ($v_list_path[$j] == '') {$j++;continue;}if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')){$v_result = 0;}$i++;$j++;}if ($v_result) {while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++;while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++;if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) {$v_result = 2;}else if ($i < $v_list_dir_size) {$v_result = 0;}}return $v_result;}function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0){$v_result = 1;if ($p_mode==0){while ($p_size != 0){$v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);$v_buffer = @fread($p_src, $v_read_size);@fwrite($p_dest, $v_buffer, $v_read_size);$p_size -= $v_read_size;}}else if ($p_mode==1){while ($p_size != 0){$v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);$v_buffer = @gzread($p_src, $v_read_size);@fwrite($p_dest, $v_buffer, $v_read_size);$p_size -= $v_read_size;}}else if ($p_mode==2){while ($p_size != 0){$v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);$v_buffer = @fread($p_src, $v_read_size);@gzwrite($p_dest, $v_buffer, $v_read_size);$p_size -= $v_read_size;}}else if ($p_mode==3){while ($p_size != 0){$v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);$v_buffer = @gzread($p_src, $v_read_size);@gzwrite($p_dest, $v_buffer, $v_read_size);$p_size -= $v_read_size;}}return $v_result;}function PclZipUtilRename($p_src, $p_dest){$v_result = 1;if (!@rename($p_src, $p_dest)) {if (!@copy($p_src, $p_dest)) {$v_result = 0;}else if (!@unlink($p_src)) {$v_result = 0;}}return $v_result;}function PclZipUtilOptionText($p_option){$v_list = get_defined_constants();for (reset($v_list); $v_key = key($v_list); next($v_list)) {	$v_prefix = substr($v_key, 0, 10);	if (( ($v_prefix == 'PCLZIP_OPT') || ($v_prefix == 'PCLZIP_CB_') || ($v_prefix == 'PCLZIP_ATT'))	&& ($v_list[$v_key] == $p_option)) {return $v_key;	}}$v_result = 'Unknown';return $v_result;}function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true){if (stristr(php_uname(), 'windows')) {if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) {$p_path = substr($p_path, $v_position+1);}if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) {$p_path = strtr($p_path, '\\', '/');}}return $p_path;}
示例#11
0
 function make_zipfile($source, $destination, $whichone = '')
 {
     global $updraftplus;
     $destination_base = basename($destination);
     // Legacy/redundant
     if (empty($whichone) && is_string($whichone)) {
         $whichone = basename($source);
     }
     // When to prefer PCL:
     // - We were asked to
     // - No zip extension present and no relevant method present
     // The zip extension check is not redundant, because method_exists segfaults some PHP installs, leading to support requests
     // We need meta-info about $whichone
     $backupable_entities = $updraftplus->get_backupable_file_entities(true, false);
     // Fallback to PclZip - which my tests show is 25% slower (and we can't resume)
     if ($this->zip_preferpcl || !extension_loaded('zip') && !method_exists('ZipArchive', 'AddFile')) {
         if (!class_exists('PclZip')) {
             require_once ABSPATH . '/wp-admin/includes/class-pclzip.php';
         }
         $zip_object = new PclZip($destination);
         $remove_path = WP_CONTENT_DIR;
         $add_path = false;
         // Remove prefixes
         if (isset($backupable_entities[$whichone])) {
             if ('plugins' == $whichone || 'themes' == $whichone || 'uploads' == $whichone) {
                 $remove_path = dirname($backupable_entities[$whichone]);
                 # To normalise instead of removing (which binzip doesn't support, so we don't do it), you'd remove the dirname() in the above line, and uncomment the below one.
                 #$add_path = $whichone;
             } else {
                 $remove_path = $backupable_entities[$whichone];
             }
         }
         if ($add_path) {
             $zipcode = $zip_object->create($source, PCLZIP_OPT_REMOVE_PATH, $remove_path, PCLZIP_OPT_ADD_PATH, $add_path);
         } else {
             $zipcode = $zip_object->create($source, PCLZIP_OPT_REMOVE_PATH, $remove_path);
         }
         if ($zipcode == 0) {
             $updraftplus->log("PclZip Error: " . $zip_object->errorInfo(true), 'warning');
             return $zip_object->errorCode();
         } else {
             return true;
         }
     }
     if ($this->binzip === false && (!defined('UPDRAFTPLUS_NO_BINZIP') || !UPDRAFTPLUS_NO_BINZIP)) {
         $updraftplus->log('Checking if we have a zip executable available');
         $binzip = $updraftplus->find_working_bin_zip();
         if (is_string($binzip)) {
             $updraftplus->log("Found one: {$binzip}");
             $this->binzip = $binzip;
         }
     }
     // TODO: Handle stderr?
     // We only use binzip up to resumption 8, in case there is some undetected problem. We can make this more sophisticated if a need arises.
     if (is_string($this->binzip) && $updraftplus->current_resumption < 9) {
         if (is_string($source)) {
             $source = array($source);
         }
         $all_ok = true;
         $debug = UpdraftPlus_Options::get_updraft_option('updraft_debug_mode');
         # Don't use -q and do use -v, as we rely on output to process to detect useful activity
         $zip_params = '-v';
         $orig_size = file_exists($destination) ? filesize($destination) : 0;
         $last_size = $orig_size;
         clearstatcache();
         foreach ($source as $s) {
             $exec = "cd " . escapeshellarg(dirname($s)) . "; " . $this->binzip . " {$zip_params} -u -r " . escapeshellarg($destination) . " " . escapeshellarg(basename($s)) . " ";
             $updraftplus->log("Attempting binary zip ({$exec})");
             $handle = popen($exec, "r");
             $something_useful_happened = $updraftplus->something_useful_happened;
             if ($handle) {
                 while (!feof($handle)) {
                     $w = fgets($handle, 1024);
                     // Logging all this really slows things down
                     if ($w && $debug) {
                         $updraftplus->log("Output from zip: " . trim($w), 'debug');
                     }
                     if (file_exists($destination)) {
                         $new_size = filesize($destination);
                         if (!$something_useful_happened && $new_size > $orig_size + 20) {
                             $updraftplus->something_useful_happened();
                             $something_useful_happened = true;
                         }
                         clearstatcache();
                         # Log when 20% bigger or at least every 50Mb
                         if ($new_size > $last_size * 1.2 || $new_size > $last_size + 52428800) {
                             $updraftplus->log(sprintf("{$destination_base}: size is now: %.2f Mb", round($new_size / 1048576, 1)));
                             $last_size = $new_size;
                         }
                     }
                 }
                 $ret = pclose($handle);
                 // Code 12 = nothing to do
                 if ($ret != 0 && $ret != 12) {
                     $updraftplus->log("Binary zip: error (code: {$ret})");
                     if ($w && !$debug) {
                         $updraftplus->log("Last output from zip: " . trim($w), 'debug');
                     }
                     $all_ok = false;
                 }
             } else {
                 $updraftplus->log("Error: popen failed");
                 $all_ok = false;
             }
         }
         if ($all_ok) {
             $updraftplus->log("Binary zip: apparently successful");
             return true;
         } else {
             $updraftplus->log("Binary zip: an error occured, so we will run over again with ZipArchive");
         }
     }
     $this->existing_files = array();
     // If the file exists, then we should grab its index of files inside, and sizes
     // Then, when we come to write a file, we should check if it's already there, and only add if it is not
     if (file_exists($destination) && is_readable($destination) && filesize($destination) > 0) {
         $zip = new ZipArchive();
         $zip->open($destination);
         for ($i = 0; $i < $zip->numFiles; $i++) {
             $si = $zip->statIndex($i);
             $name = $si['name'];
             $this->existing_files[$name] = $si['size'];
         }
         $updraftplus->log(basename($destination) . ": Zip file already exists, with " . count($this->existing_files) . " files");
     } elseif (file_exists($destination)) {
         $updraftplus->log("Zip file already exists, but is not readable or was zero-sized; will remove: {$destination}");
         @unlink($destination);
     }
     $this->zipfiles_added = 0;
     $this->zipfiles_added_thisrun = 0;
     $this->zipfiles_dirbatched = array();
     $this->zipfiles_batched = array();
     $this->zipfiles_lastwritetime = time();
     // Magic value, used later to detect no error occurring
     $last_error = 2349864;
     if (is_array($source)) {
         foreach ($source as $element) {
             $howmany = $this->makezip_recursive_add($destination, $element, basename($element), $element);
             if ($howmany < 0) {
                 $last_error = $howmany;
             }
         }
     } else {
         $howmany = $this->makezip_recursive_add($destination, $source, basename($source), $source);
         if ($howmany < 0) {
             $last_error = $howmany;
         }
     }
     // Any not yet dispatched?
     if (count($this->zipfiles_dirbatched) > 0 || count($this->zipfiles_batched) > 0) {
         $howmany = $this->makezip_addfiles($destination);
         if ($howmany < 0) {
             $last_error = $howmany;
         }
     }
     if ($this->zipfiles_added > 0 || $last_error == 2349864) {
         // ZipArchive::addFile sometimes fails
         if (filesize($destination) < 90) {
             // Retry with PclZip
             $updraftplus->log("Zip::addFile apparently failed ({$last_error}, " . filesize($destination) . ") - retrying with PclZip");
             $this->zip_preferpcl = true;
             return $this->make_zipfile($source, $destination, $whichone);
         }
         return true;
     } else {
         return $last_error;
     }
 }
示例#12
0
function insitem()
{
    //checkPerm( 'view', FALSE, 'storage' );
    require_once _base_ . '/lib/lib.upload.php';
    require_once _base_ . '/addons/pclzip/pclzip.lib.php';
    require_once dirname(__FILE__) . '/RendererDb.php';
    require_once dirname(__FILE__) . '/CPManager.php';
    $back_url = urldecode($_POST['back_url']);
    // there is a file?
    if ($_FILES['attach']['name'] == '') {
        $_SESSION['last_error'] = _FILEUNSPECIFIED;
        Util::jump_to('' . $back_url . '&create_result=0');
    }
    $path = str_replace('\\', '/', '/appLms/' . Get::sett('pathscorm'));
    $savefile = getLogUserId() . '_' . rand(0, 100) . '_' . time() . '_' . $_FILES['attach']['name'];
    if (!file_exists($GLOBALS['where_files_relative'] . $path . $savefile)) {
        sl_open_fileoperations();
        if (!sl_upload($_FILES['attach']['tmp_name'], $path . $savefile)) {
            //if( !move_uploaded_file($_FILES['attach']['tmp_name'], $GLOBALS['where_files_relative'].$path.$savefile ) ) {
            sl_close_fileoperations();
            $_SESSION['last_error'] = _ERROR_UPLOAD;
            Util::jump_to('' . $back_url . '&create_result=0');
        }
    } else {
        sl_close_fileoperations();
        $_SESSION['last_error'] = _ERROR_UPLOAD;
        Util::jump_to('' . $back_url . '&create_result=0');
    }
    // compute filepath
    $filepath = $path . $savefile . STRPOSTCONTENT;
    // extract zip file
    $zip = new PclZip($path . $savefile);
    // check disk quota --------------------------------------------------
    if (isset($_SESSION['idCourse']) && defined("LMS")) {
        $zip_content = $zip->listContent();
        $zip_extracted_size = 0;
        while (list(, $file_info) = each($zip_content)) {
            $zip_extracted_size += $file_info['size'];
        }
        $quota = $GLOBALS['course_descriptor']->getQuotaLimit();
        $used = $GLOBALS['course_descriptor']->getUsedSpace();
        if (Util::exceed_quota(false, $quota, $used, $zip_extracted_size)) {
            sl_unlink($path . $savefile);
            $_SESSION['last_error'] = Lang::t('_QUOTA_EXCEDED');
            Util::jump_to('' . $back_url . '&create_result=0');
        }
        $GLOBALS['course_descriptor']->addFileToUsedSpace(false, $zip_extracted_size);
    }
    // extract zip ------------------------------------------------------
    $zip->extract(PCLZIP_OPT_PATH, $filepath);
    if ($zip->errorCode() != PCLZIP_ERR_NO_ERROR && $zip->errorCode() != 1) {
        sl_unlink($path . $savefile);
        $_SESSION['last_error'] = _ERROR_UPLOAD;
        sl_close_fileoperations();
        Util::jump_to('' . $back_url . '&create_result=0');
    }
    /* remove zip file */
    sl_unlink($path . $savefile);
    sl_close_fileoperations();
    $cpm = new CPManager();
    // try to open content package
    if (!$cpm->Open($GLOBALS['where_files_relative'] . $filepath)) {
        $_SESSION['last_error'] = 'Error: ' . $cpm->errText . ' [' . $cpm->errCode . ']';
        Util::jump_to('' . $back_url . '&create_result=0');
    }
    // and parse the manifest
    if (!$cpm->ParseManifest()) {
        $_SESSION['last_error'] = 'Error: ' . $cpm->errText . ' [' . $cpm->errCode . ']';
        Util::jump_to('' . $back_url . '&create_result=0');
    }
    // create entry in content package table
    $query = "INSERT INTO " . $GLOBALS['prefix_lms'] . "_scorm_package" . " (idpackage,idProg,path,defaultOrg,idUser,scormVersion) VALUES" . " ('" . addslashes($cpm->identifier) . "','0','" . $savefile . STRPOSTCONTENT . "','" . addslashes($cpm->defaultOrg) . "','" . (int) getLogUserId() . "','" . $cpm->scorm_version . "')";
    if (!($result = sql_query($query))) {
        $_SESSION['last_error'] = _OPERATION_FAILURE;
        Util::jump_to('' . $back_url . '&create_result=0');
    }
    $idscorm_package = mysql_insert_id();
    // create the n entries in resources table
    for ($i = 0; $i < $cpm->GetResourceNumber(); $i++) {
        $info = $cpm->GetResourceInfo($cpm->GetResourceIdentifier($i));
        $query = "INSERT INTO " . $GLOBALS['prefix_lms'] . "_scorm_resources (idsco,idscorm_package,scormtype,href)" . " VALUES ('" . addslashes($info['identifier']) . "','" . (int) $idscorm_package . "','" . $info['scormtype'] . "','" . addslashes($info['href']) . "')";
        $result = sql_query($query);
        if (!$result) {
            $_SESSION['last_error'] = _OPERATION_FAILURE;
            Util::jump_to('' . $back_url . '&create_result=0');
        } else {
            if (mysql_affected_rows() == 0) {
                $_SESSION['last_error'] = _OPERATION_FAILURE;
                Util::jump_to('' . $back_url . '&create_result=0');
            }
        }
    }
    $rdb = new RendererDb($GLOBALS['dbConn'], $GLOBALS['prefix_lms'], $idscorm_package);
    $orgElems = $cpm->orgElems;
    // save all organizations
    for ($iOrg = 0; $iOrg < $orgElems->getLength(); $iOrg++) {
        $org = $orgElems->item($iOrg);
        $cpm->RenderOrganization($org->getAttribute('identifier'), $rdb);
    }
    if ($_POST['lesson_resources'] == 'import' || $cpm->defaultOrg == '-resource-') {
        // save flat organization with resources
        $cpm->RenderOrganization('-resource-', $rdb);
    }
    $so = new Scorm_Organization($cpm->defaultOrg, $idscorm_package, $GLOBALS['dbConn']);
    if ($so->err_code > 0) {
        $_SESSION['last_error'] = 'Error: ' . $so->getErrorText() . ' [' . $so->getErrorCode() . ']';
        Util::jump_to('' . $back_url . '&create_result=0');
    } else {
        //Util::jump_to( ''.$back_url.'&id_lo='.$so->idscorm_organization.'&create_result=1' );
        Util::jump_to('' . $back_url . '&id_lo=' . $idscorm_package . '&create_result=2');
    }
}
    }
    // unzip to buffer and store in DB / fetch ach entry as single process, to surpress buffer overflow
    foreach ($aRequestVars['restore_id'] as $index => $iArchiveIndex) {
        $oArchive = new PclZip($aRequestVars['ArchiveFile']);
        $sDroplet = $oArchive->extract(PCLZIP_OPT_BY_INDEX, $iArchiveIndex, PCLZIP_OPT_EXTRACT_AS_STRING);
        if ($sDroplet == 0) {
            msgQueue::add('UNABLE TO UNZIP FILE' . '::' . $oArchive->errorInfo(true));
        } else {
            //                $sSearchFor = 'php';
            //                $file_types  = preg_replace( '/\s*[,;\|#]\s*/','|',$sSearchFor );
            //        if (!preg_match('/^(to|cc|bcc|Reply-To)$/', $kind)) {
            $aDroplet['name'] = $sDroplet[0]['filename'];
            $aDroplet['content'] = explode("\n", $sDroplet[0]['content']);
            //                if ( !preg_match('/'.$file_types.'/si', $aDroplet['name'], $aMatch) ) {
            //                  continue; }
            if ($sTmp = insertDroplet($aDroplet, false)) {
                $aUnzipDroplets[] = $sTmp;
            }
        }
    }
    //
    if (($error = $oArchive->errorCode()) != 0) {
        msgQueue::add(sizeof($aUnzipDroplets) . ' ' . $Droplet_Import['ARCHIV_IMPORTED']);
    } else {
        if (sizeof($aUnzipDroplets) > 0) {
            msgQueue::add(implode(', ', $aUnzipDroplets) . '<br />' . sizeof($aUnzipDroplets) . ' ' . $Droplet_Import['ARCHIV_IMPORTED'], true);
        } else {
            msgQueue::add(sizeof($aUnzipDroplets) . ' ' . $Droplet_Import['ARCHIV_IMPORTED'], true);
        }
    }
}
示例#14
0
 function privDirCheck($p_dir, $p_is_dir = false)
 {
     $v_result = 1;
     if ($p_is_dir && substr($p_dir, -1) == '/') {
         $p_dir = substr($p_dir, 0, strlen($p_dir) - 1);
     }
     if (is_dir($p_dir) || $p_dir == "") {
         return 1;
     }
     $p_parent_dir = dirname($p_dir);
     if ($p_parent_dir != $p_dir) {
         if ($p_parent_dir != "") {
             if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) {
                 return $v_result;
             }
         }
     }
     if (!@mkdir($p_dir, 0777)) {
         PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '{$p_dir}'");
         return PclZip::errorCode();
     }
     return $v_result;
 }
示例#15
0
 /**
  * Recursively ZIPs a directory via PHP.
  *
  * @param string $dir A full directory path to ZIP.
  *
  * @param string $to A new ZIP file path — to ZIP `$dir` into.
  *    The directory this lives in MUST already exist and be writable.
  *    If this file already exists, an exception will be thrown.
  *
  * @return string New ZIP file location; else an exception is thrown.
  *
  * @throws exception If invalid types are passed through arguments list.
  * @throws exception If the `$dir` is NOT a readable directory, or CANNOT be zipped for any reason.
  * @throws exception If the `$to` ZIP already exists, or CANNOT be created by this routine for any reason.
  * @throws exception If the `$to` ZIP does NOT end with the proper `.zip` extension.
  * @throws exception If the `$to` ZIP parent directory does NOT exist or is not writable.
  * @throws \exception The PclZip class may throw exceptions of it's own here.
  */
 public function zip_to($dir, $to)
 {
     $this->check_arg_types('string:!empty', 'string:!empty', func_get_args());
     $dir = $this->n_seps($dir);
     $to = $this->n_seps($to);
     $to_dir = $this->n_seps_up($to);
     if (!class_exists('\\PclZip')) {
         require_once ABSPATH . 'wp-admin/includes/class-pclzip.php';
     }
     if (!is_dir($dir)) {
         throw $this->©exception($this->method(__FUNCTION__) . '#source_dir_missing', get_defined_vars(), $this->__('Unable to ZIP a directory (source `dir` missing).') . ' ' . sprintf($this->__('Non-existent source directory: `%1$s`.'), $dir));
     }
     if (!is_readable($dir)) {
         throw $this->©exception($this->method(__FUNCTION__) . '#read_write_issues', get_defined_vars(), $this->__('Unable to ZIP a directory; not readable; due to permission issues.') . ' ' . sprintf($this->__('Need this directory to be readable please: `%1$s`.'), $dir));
     }
     if (file_exists($to)) {
         throw $this->©exception($this->method(__FUNCTION__) . '#existing_zip', get_defined_vars(), $this->__('Destination ZIP exists; it MUST first be deleted please.') . ' ' . sprintf($this->__('Please check this ZIP archive: `%1$s`.'), $to));
     }
     if ($this->extension($to) !== 'zip') {
         throw $this->©exception($this->method(__FUNCTION__) . '#invalid_zip', get_defined_vars(), $this->__('Invalid ZIP extension. The destination must end with `.zip`.') . ' ' . sprintf($this->__('Instead got: `%1$s`.'), $to));
     }
     if (!is_dir($to_dir)) {
         throw $this->©exception($this->method(__FUNCTION__) . '#zip_to_dir_missing', get_defined_vars(), $this->__('Destination ZIP directory does NOT exist yet.') . ' ' . sprintf($this->__('Please check this directory: `%1$s`.'), $to_dir));
     }
     if (!is_writable($to_dir)) {
         throw $this->©exception($this->method(__FUNCTION__) . '#zip_to_dir_permissions', get_defined_vars(), $this->__('Destination ZIP directory is not writable.') . ' ' . sprintf($this->__('Please check permissions on this directory: `%1$s`.'), $to_dir));
     }
     $archive = new \PclZip($to);
     if (!$archive->create($dir, PCLZIP_OPT_REMOVE_PATH, $this->n_seps_up($dir))) {
         throw $this->©exception($this->method(__FUNCTION__) . '#pclzip_archive_failure#' . $archive->errorCode(), get_defined_vars(), sprintf($this->__('PclZip archive failure: `%1$s`.'), $archive->errorInfo(TRUE)));
     }
     return $to;
     // It's a good day in Eureka!
 }
 function privMerge(&$p_archive_to_add)
 {
     $v_result = 1;
     // ----- Look if the archive_to_add exists
     if (!is_file($p_archive_to_add->zipname)) {
         // ----- Nothing to merge, so merge is a success
         $v_result = 1;
         // ----- Return
         return $v_result;
     }
     // ----- Look if the archive exists
     if (!is_file($this->zipname)) {
         // ----- Do a duplicate
         $v_result = $this->privDuplicate($p_archive_to_add->zipname);
         // ----- Return
         return $v_result;
     }
     // ----- Open the zip file
     if (($v_result = $this->privOpenFd('rb')) != 1) {
         // ----- Return
         return $v_result;
     }
     // ----- Read the central directory informations
     $v_central_dir = array();
     if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) {
         $this->privCloseFd();
         return $v_result;
     }
     // ----- Go to beginning of File
     @rewind($this->zip_fd);
     // ----- Open the archive_to_add file
     if (($v_result = $p_archive_to_add->privOpenFd('rb')) != 1) {
         $this->privCloseFd();
         // ----- Return
         return $v_result;
     }
     // ----- Read the central directory informations
     $v_central_dir_to_add = array();
     if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) {
         $this->privCloseFd();
         $p_archive_to_add->privCloseFd();
         return $v_result;
     }
     // ----- Go to beginning of File
     @rewind($p_archive_to_add->zip_fd);
     // ----- Creates a temporay file
     $v_zip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid('pclzip-') . '.tmp';
     // ----- Open the temporary file in write mode
     if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) {
         $this->privCloseFd();
         $p_archive_to_add->privCloseFd();
         PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \'' . $v_zip_temp_name . '\' in binary write mode');
         // ----- Return
         return PclZip::errorCode();
     }
     // ----- Copy the files from the archive to the temporary file
     // TBC : Here I should better append the file and go back to erase the central dir
     $v_size = $v_central_dir['offset'];
     while ($v_size != 0) {
         $v_read_size = $v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE;
         $v_buffer = fread($this->zip_fd, $v_read_size);
         @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
         $v_size -= $v_read_size;
     }
     // ----- Copy the files from the archive_to_add into the temporary file
     $v_size = $v_central_dir_to_add['offset'];
     while ($v_size != 0) {
         $v_read_size = $v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE;
         $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size);
         @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
         $v_size -= $v_read_size;
     }
     // ----- Store the offset of the central dir
     $v_offset = @ftell($v_zip_temp_fd);
     // ----- Copy the block of file headers from the old archive
     $v_size = $v_central_dir['size'];
     while ($v_size != 0) {
         $v_read_size = $v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE;
         $v_buffer = @fread($this->zip_fd, $v_read_size);
         @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
         $v_size -= $v_read_size;
     }
     // ----- Copy the block of file headers from the archive_to_add
     $v_size = $v_central_dir_to_add['size'];
     while ($v_size != 0) {
         $v_read_size = $v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE;
         $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size);
         @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
         $v_size -= $v_read_size;
     }
     // ----- Merge the file comments
     $v_comment = $v_central_dir['comment'] . ' ' . $v_central_dir_to_add['comment'];
     // ----- Calculate the size of the (new) central header
     $v_size = @ftell($v_zip_temp_fd) - $v_offset;
     // ----- Swap the file descriptor
     // Here is a trick : I swap the temporary fd with the zip fd, in order to use
     // the following methods on the temporary fil and not the real archive fd
     $v_swap = $this->zip_fd;
     $this->zip_fd = $v_zip_temp_fd;
     $v_zip_temp_fd = $v_swap;
     // ----- Create the central dir footer
     if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries'] + $v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) {
         $this->privCloseFd();
         $p_archive_to_add->privCloseFd();
         @fclose($v_zip_temp_fd);
         $this->zip_fd = null;
         // ----- Reset the file list
         unset($v_header_list);
         // ----- Return
         return $v_result;
     }
     // ----- Swap back the file descriptor
     $v_swap = $this->zip_fd;
     $this->zip_fd = $v_zip_temp_fd;
     $v_zip_temp_fd = $v_swap;
     // ----- Close
     $this->privCloseFd();
     $p_archive_to_add->privCloseFd();
     // ----- Close the temporary file
     @fclose($v_zip_temp_fd);
     // ----- Delete the zip file
     // TBC : I should test the result ...
     @unlink($this->zipname);
     // ----- Rename the temporary file
     // TBC : I should test the result ...
     //@rename($v_zip_temp_name, $this->zipname);
     PclZipUtilRename($v_zip_temp_name, $this->zipname);
     // ----- Return
     return $v_result;
 }
示例#17
0
 function privGrow($p_filedescr_list, &$p_result_list, &$p_options)
 {
     $v_result = 1;
     $v_list_detail = array();
     // ----- Look if the archive exists or is empty
     if (!is_file($this->_za->zipname) || filesize($this->_za->zipname) == 0) {
         // ----- Do a create
         $v_result = $this->_za->privCreate($p_filedescr_list, $p_result_list, $p_options);
         // ----- Return
         return $v_result;
     }
     // ----- Magic quotes trick
     $this->_za->privDisableMagicQuotes();
     // ----- Open the zip file
     // ----- Open the zip file in r/w binary mode with no truncation and file pointer at start
     if (($v_result = $this->_za->privOpenFd('c+b')) != 1) {
         // ----- Magic quotes trick
         $this->_za->privSwapBackMagicQuotes();
         // ----- Return
         return $v_result;
     }
     // ----- Read the central directory informations
     $v_central_dir = array();
     if (($v_result = $this->_za->privReadEndCentralDir($v_central_dir)) != 1) {
         $this->_za->privCloseFd();
         $this->_za->privSwapBackMagicQuotes();
         return $v_result;
     }
     // ----- Go to beginning of File
     //@rewind($this->_za->zip_fd);
     // ----- Go to the start of the central dir
     @fseek($this->_za->zip_fd, $v_central_dir['offset']);
     // ----- Creates a temporay file
     //$v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
     $v_zip_temp_name = 'php://temp/maxmemory:10485760';
     // ----- Open the temporary file in write mode
     //if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)
     // ----- Open the temporary file in read/write mode
     if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'w+b')) == 0) {
         $this->_za->privCloseFd();
         $this->_za->privSwapBackMagicQuotes();
         //PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');
         PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \'' . $v_zip_temp_name . '\' in binary read/write mode');
         // ----- Return
         return PclZip::errorCode();
     }
     // ----- Copy the files from the archive to the temporary file
     // TBC : Here I should better append the file and go back to erase the central dir
     //$v_size = $v_central_dir['offset'];
     // ----- Copy the existing central dir to a temporary file
     $v_size = $v_central_dir['size'];
     while ($v_size != 0) {
         $v_read_size = $v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE;
         $v_buffer = fread($this->_za->zip_fd, $v_read_size);
         @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
         $v_size -= $v_read_size;
     }
     // ----- Swap the file descriptor
     // Here is a trick : I swap the temporary fd with the zip fd, in order to use
     // the following methods on the temporary fil and not the real archive
     //$v_swap = $this->_za->zip_fd;
     //$this->_za->zip_fd = $v_zip_temp_fd;
     //$v_zip_temp_fd = $v_swap;
     // ----- Modify existing zip file so keep file descriptors as they are
     // ----- Now truncate after existing files and seek to end to add new files
     @rewind($this->_za->zip_fd);
     @ftruncate($this->_za->zip_fd, $v_central_dir['offset']);
     @fseek($this->_za->zip_fd, 0, SEEK_END);
     // ----- Add the files
     $v_header_list = array();
     if (($v_result = $this->_za->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) {
         fclose($v_zip_temp_fd);
         $this->_za->privCloseFd();
         //@unlink($v_zip_temp_name);
         $this->_za->privSwapBackMagicQuotes();
         // ----- Return
         return $v_result;
     }
     // ----- Store the offset of the central dir
     $v_offset = @ftell($this->_za->zip_fd);
     // ----- Rewind temp file ready to copy original central dir entries
     @rewind($v_zip_temp_fd);
     // ----- Copy the block of file headers from the old archive
     $v_size = $v_central_dir['size'];
     while ($v_size != 0) {
         $v_read_size = $v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE;
         $v_buffer = @fread($v_zip_temp_fd, $v_read_size);
         @fwrite($this->_za->zip_fd, $v_buffer, $v_read_size);
         $v_size -= $v_read_size;
     }
     // ----- Create the Central Dir files header
     for ($i = 0, $v_count = 0; $i < sizeof($v_header_list); $i++) {
         // ----- Create the file header
         if ($v_header_list[$i]['status'] == 'ok') {
             if (($v_result = $this->_za->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
                 fclose($v_zip_temp_fd);
                 $this->_za->privCloseFd();
                 //@unlink($v_zip_temp_name);
                 $this->_za->privSwapBackMagicQuotes();
                 // ----- Return
                 return $v_result;
             }
             $v_count++;
         }
         // ----- Transform the header to a 'usable' info
         $this->_za->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
     }
     // ----- Zip file comment
     $v_comment = $v_central_dir['comment'];
     if (isset($p_options[PCLZIP_OPT_COMMENT])) {
         $v_comment = $p_options[PCLZIP_OPT_COMMENT];
     }
     if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) {
         $v_comment = $v_comment . $p_options[PCLZIP_OPT_ADD_COMMENT];
     }
     if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) {
         $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT] . $v_comment;
     }
     // ----- Calculate the size of the central header
     $v_size = @ftell($this->_za->zip_fd) - $v_offset;
     // ----- Create the central dir footer
     if (($v_result = $this->_za->privWriteCentralHeader($v_count + $v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) {
         // ----- Reset the file list
         unset($v_header_list);
         $this->_za->privSwapBackMagicQuotes();
         // ----- Return
         return $v_result;
     }
     // ----- Swap back the file descriptor
     //$v_swap = $this->_za->zip_fd;
     //$this->_za->zip_fd = $v_zip_temp_fd;
     //$v_zip_temp_fd = $v_swap;
     // ----- File descriptors never swapped originally
     // ----- Close
     $this->_za->privCloseFd();
     // ----- Close the temporary file
     @fclose($v_zip_temp_fd);
     // ----- Magic quotes trick
     $this->_za->privSwapBackMagicQuotes();
     // ----- Delete the zip file
     // TBC : I should test the result ...
     //@unlink($this->_za->zipname);
     // ----- Delete the temporary file
     //@unlink($v_zip_temp_name);
     // ----- Rename the temporary file
     // TBC : I should test the result ...
     //@rename($v_zip_temp_name, $this->zipname);
     //PclZipUtilRename($v_zip_temp_name, $this->_za->zipname);
     // ----- We grew the existing zip file so no renaming to do
     // ----- Return
     return $v_result;
 }
示例#18
0
 function privDuplicate($p_archive_filename)
 {
     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDuplicate", "archive_filename='$p_archive_filename'");
     $v_result = 1;
     // ----- Look if the $p_archive_filename exists
     if (!is_file($p_archive_filename)) {
         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive to duplicate does not exist. End of duplicate.");
         // ----- Nothing to duplicate, so duplicate is a success.
         $v_result = 1;
         // ----- Return
         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
         return $v_result;
     }
     // ----- Open the zip file
     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
     if (($v_result = $this->privOpenFd('wb')) != 1) {
         // ----- Return
         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
         return $v_result;
     }
     // ----- Open the temporary file in write mode
     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
     if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) {
         $this->privCloseFd();
         PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \'' . $p_archive_filename . '\' in binary write mode');
         // ----- Return
         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
         return PclZip::errorCode();
     }
     // ----- Copy the files from the archive to the temporary file
     // TBC : Here I should better append the file and go back to erase the central dir
     $v_size = filesize($p_archive_filename);
     while ($v_size != 0) {
         $v_read_size = $v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE;
         //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read $v_read_size bytes");
         $v_buffer = fread($v_zip_temp_fd, $v_read_size);
         @fwrite($this->zip_fd, $v_buffer, $v_read_size);
         $v_size -= $v_read_size;
     }
     // ----- Close
     $this->privCloseFd();
     // ----- Close the temporary file
     @fclose($v_zip_temp_fd);
     // ----- Return
     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
     return $v_result;
 }
 function privDirCheck($p_dir, $p_is_dir = false)
 {
     $v_result = 1;
     //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDirCheck", "entry='$p_dir', is_dir='".($p_is_dir?"true":"false")."'");
     // ----- Remove the final '/'
     if ($p_is_dir && substr($p_dir, -1) == '/') {
         $p_dir = substr($p_dir, 0, strlen($p_dir) - 1);
     }
     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Looking for entry '$p_dir'");
     // ----- Check the directory availability
     if (is_dir($p_dir) || $p_dir == "") {
         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, "'$p_dir' is a directory");
         return 1;
     }
     // ----- Extract parent directory
     $p_parent_dir = dirname($p_dir);
     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Parent directory is '$p_parent_dir'");
     // ----- Just a check
     if ($p_parent_dir != $p_dir) {
         // ----- Look for parent directory
         if ($p_parent_dir != "") {
             if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) {
                 //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
                 return $v_result;
             }
         }
     }
     // ----- Create the directory
     //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Create directory '$p_dir'");
     if (!@mkdir($p_dir, 0777)) {
         // ----- Error log
         PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '{$p_dir}'");
         // ----- Return
         //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
         return PclZip::errorCode();
     }
     // ----- Return
     //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result, "Directory '$p_dir' created");
     return $v_result;
 }