diff options
author | plegall <plg@piwigo.org> | 2015-12-10 14:02:22 +0100 |
---|---|---|
committer | plegall <plg@piwigo.org> | 2015-12-10 14:02:22 +0100 |
commit | fa10e0945ecd45bfe78a2c8fb015a43092b4944b (patch) | |
tree | 19cf59c08877e43325efbe9a2584114011a25522 /include/smarty/libs/sysplugins/smarty_internal_runtime_writefile.php | |
parent | 16f6a54fa719cc79ff942e4bb8139d7ca09ed997 (diff) |
bug #385 update to smarty-3.1.28-dev (from Github)
Diffstat (limited to 'include/smarty/libs/sysplugins/smarty_internal_runtime_writefile.php')
-rw-r--r-- | include/smarty/libs/sysplugins/smarty_internal_runtime_writefile.php | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/include/smarty/libs/sysplugins/smarty_internal_runtime_writefile.php b/include/smarty/libs/sysplugins/smarty_internal_runtime_writefile.php new file mode 100644 index 000000000..05c973783 --- /dev/null +++ b/include/smarty/libs/sysplugins/smarty_internal_runtime_writefile.php @@ -0,0 +1,90 @@ +<?php +/** + * Smarty write file plugin + * + * @package Smarty + * @subpackage PluginsInternal + * @author Monte Ohrt + */ + +/** + * Smarty Internal Write File Class + * + * @package Smarty + * @subpackage PluginsInternal + */ +class Smarty_Internal_Runtime_WriteFile +{ + /** + * Writes file in a safe way to disk + * + * @param string $_filepath complete filepath + * @param string $_contents file content + * @param Smarty $smarty smarty instance + * + * @throws SmartyException + * @return boolean true + */ + public function writeFile($_filepath, $_contents, Smarty $smarty) + { + $_error_reporting = error_reporting(); + error_reporting($_error_reporting & ~E_NOTICE & ~E_WARNING); + $_file_perms = property_exists($smarty, '_file_perms') ? $smarty->_file_perms : 0644; + $_dir_perms = property_exists($smarty, '_dir_perms') ? (isset($smarty->_dir_perms) ? $smarty->_dir_perms : 0777) : 0771; + if ($_file_perms !== null) { + $old_umask = umask(0); + } + + $_dirpath = dirname($_filepath); + // if subdirs, create dir structure + if ($_dirpath !== '.' && !file_exists($_dirpath)) { + mkdir($_dirpath, $_dir_perms, true); + } + + // write to tmp file, then move to overt file lock race condition + $_tmp_file = $_dirpath . DS . str_replace(array('.', ','), '_', uniqid('wrt', true)); + if (!file_put_contents($_tmp_file, $_contents)) { + error_reporting($_error_reporting); + throw new SmartyException("unable to write file {$_tmp_file}"); + } + + /* + * Windows' rename() fails if the destination exists, + * Linux' rename() properly handles the overwrite. + * Simply unlink()ing a file might cause other processes + * currently reading that file to fail, but linux' rename() + * seems to be smart enough to handle that for us. + */ + if (Smarty::$_IS_WINDOWS) { + // remove original file + if (is_file($_filepath)) { + @unlink($_filepath); + } + // rename tmp file + $success = @rename($_tmp_file, $_filepath); + } else { + // rename tmp file + $success = @rename($_tmp_file, $_filepath); + if (!$success) { + // remove original file + if (is_file($_filepath)) { + @unlink($_filepath); + } + // rename tmp file + $success = @rename($_tmp_file, $_filepath); + } + } + if (!$success) { + error_reporting($_error_reporting); + throw new SmartyException("unable to write file {$_filepath}"); + } + if ($_file_perms !== null) { + // set file permissions + chmod($_filepath, $_file_perms); + umask($old_umask); + } + error_reporting($_error_reporting); + + return true; + } +} |