diff options
Diffstat (limited to 'libs/sysplugins/smarty_internal_write_file.php')
| -rw-r--r-- | libs/sysplugins/smarty_internal_write_file.php | 70 |
1 files changed, 42 insertions, 28 deletions
diff --git a/libs/sysplugins/smarty_internal_write_file.php b/libs/sysplugins/smarty_internal_write_file.php index 4e34335f..aae600ee 100644 --- a/libs/sysplugins/smarty_internal_write_file.php +++ b/libs/sysplugins/smarty_internal_write_file.php @@ -1,56 +1,70 @@ <?php - /** * Smarty write file plugin - * + * * @package Smarty * @subpackage PluginsInternal - * @author Monte Ohrt + * @author Monte Ohrt */ /** * Smarty Internal Write File Class + * + * @package Smarty + * @subpackage PluginsInternal */ class Smarty_Internal_Write_File { + /** - * Writes file in a save way to disk - * + * Writes file in a safe way to disk + * * @param string $_filepath complete filepath * @param string $_contents file content + * @param Smarty $smarty smarty instance * @return boolean true */ - public static function writeFile($_filepath, $_contents, $smarty) + public static function writeFile($_filepath, $_contents, Smarty $smarty) { - $old_umask = umask(0); - $_dirpath = dirname($_filepath); + $_error_reporting = error_reporting(); + error_reporting($_error_reporting & ~E_NOTICE & ~E_WARNING); + if ($smarty->_file_perms !== null) { + $old_umask = umask(0); + } + + $_dirpath = dirname($_filepath); // if subdirs, create dir structure if ($_dirpath !== '.' && !file_exists($_dirpath)) { - mkdir($_dirpath, $smarty->_dir_perms, true); - } - // write to tmp file, then move to overt file lock race condition - $_tmp_file = tempnam($_dirpath, 'wrt'); + mkdir($_dirpath, $smarty->_dir_perms === null ? 0777 : $smarty->_dir_perms, true); + } - if (!($fd = @fopen($_tmp_file, 'wb'))) { - $_tmp_file = $_dirpath . DS . uniqid('wrt'); - if (!($fd = @fopen($_tmp_file, 'wb'))) { + // write to tmp file, then move to overt file lock race condition + $_tmp_file = $_dirpath . DS . uniqid('wrt'); + if (!file_put_contents($_tmp_file, $_contents)) { + error_reporting($_error_reporting); throw new SmartyException("unable to write file {$_tmp_file}"); return false; - } - } - - fwrite($fd, $_contents); - fclose($fd); + } // remove original file - if (file_exists($_filepath)) - @unlink($_filepath); + unlink($_filepath); + // rename tmp file - rename($_tmp_file, $_filepath); - // set file permissions - chmod($_filepath, $smarty->_file_perms); - umask($old_umask); + $success = rename($_tmp_file, $_filepath); + if (!$success) { + error_reporting($_error_reporting); + throw new SmartyException("unable to write file {$_filepath}"); + return false; + } + + if ($smarty->_file_perms !== null) { + // set file permissions + chmod($_filepath, $smarty->_file_perms); + umask($old_umask); + } + error_reporting($_error_reporting); return true; - } -} + } + +} ?>
\ No newline at end of file |
