f46fe2b6c77177f3a2eb28044db608c42212cb71
[GitHub/Stricted/Domain-Control-Panel.git] / lib / api / smarty / sysplugins / smarty_internal_write_file.php
1 <?php
2 /**
3 * Smarty write file plugin
4 *
5 * @package Smarty
6 * @subpackage PluginsInternal
7 * @author Monte Ohrt
8 */
9
10 /**
11 * Smarty Internal Write File Class
12 *
13 * @package Smarty
14 * @subpackage PluginsInternal
15 */
16 class Smarty_Internal_Write_File
17 {
18 /**
19 * Writes file in a safe way to disk
20 *
21 * @param string $_filepath complete filepath
22 * @param string $_contents file content
23 * @param Smarty $smarty smarty instance
24 *
25 * @throws SmartyException
26 * @return boolean true
27 */
28 public static function writeFile($_filepath, $_contents, Smarty $smarty)
29 {
30 $_error_reporting = error_reporting();
31 error_reporting($_error_reporting & ~E_NOTICE & ~E_WARNING);
32 if ($smarty->_file_perms !== null) {
33 $old_umask = umask(0);
34 }
35
36 $_dirpath = dirname($_filepath);
37 // if subdirs, create dir structure
38 if ($_dirpath !== '.' && !file_exists($_dirpath)) {
39 mkdir($_dirpath, $smarty->_dir_perms === null ? 0777 : $smarty->_dir_perms, true);
40 }
41
42 // write to tmp file, then move to overt file lock race condition
43 $_tmp_file = $_dirpath . DS . str_replace(array('.', ','), '_', uniqid('wrt', true));
44 if (!file_put_contents($_tmp_file, $_contents)) {
45 error_reporting($_error_reporting);
46 throw new SmartyException("unable to write file {$_tmp_file}");
47 }
48
49 /*
50 * Windows' rename() fails if the destination exists,
51 * Linux' rename() properly handles the overwrite.
52 * Simply unlink()ing a file might cause other processes
53 * currently reading that file to fail, but linux' rename()
54 * seems to be smart enough to handle that for us.
55 */
56 if (Smarty::$_IS_WINDOWS) {
57 // remove original file
58 @unlink($_filepath);
59 // rename tmp file
60 $success = @rename($_tmp_file, $_filepath);
61 } else {
62 // rename tmp file
63 $success = @rename($_tmp_file, $_filepath);
64 if (!$success) {
65 // remove original file
66 @unlink($_filepath);
67 // rename tmp file
68 $success = @rename($_tmp_file, $_filepath);
69 }
70 }
71
72 if (!$success) {
73 error_reporting($_error_reporting);
74 throw new SmartyException("unable to write file {$_filepath}");
75 }
76
77 if ($smarty->_file_perms !== null) {
78 // set file permissions
79 chmod($_filepath, $smarty->_file_perms);
80 umask($old_umask);
81 }
82 error_reporting($_error_reporting);
83
84 return true;
85 }
86 }