|
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 * @return boolean true |
|
25 */ |
|
26 public static function writeFile($_filepath, $_contents, Smarty $smarty) |
|
27 { |
|
28 $_error_reporting = error_reporting(); |
|
29 error_reporting($_error_reporting & ~E_NOTICE & ~E_WARNING); |
|
30 if ($smarty->_file_perms !== null) { |
|
31 $old_umask = umask(0); |
|
32 } |
|
33 |
|
34 $_dirpath = dirname($_filepath); |
|
35 // if subdirs, create dir structure |
|
36 if ($_dirpath !== '.' && !file_exists($_dirpath)) { |
|
37 mkdir($_dirpath, $smarty->_dir_perms === null ? 0777 : $smarty->_dir_perms, true); |
|
38 } |
|
39 |
|
40 // write to tmp file, then move to overt file lock race condition |
|
41 $_tmp_file = $_dirpath . DS . uniqid('wrt', true); |
|
42 if (!file_put_contents($_tmp_file, $_contents)) { |
|
43 error_reporting($_error_reporting); |
|
44 throw new SmartyException("unable to write file {$_tmp_file}"); |
|
45 return false; |
|
46 } |
|
47 |
|
48 /* |
|
49 * Windows' rename() fails if the destination exists, |
|
50 * Linux' rename() properly handles the overwrite. |
|
51 * Simply unlink()ing a file might cause other processes |
|
52 * currently reading that file to fail, but linux' rename() |
|
53 * seems to be smart enough to handle that for us. |
|
54 */ |
|
55 if (Smarty::$_IS_WINDOWS) { |
|
56 // remove original file |
|
57 @unlink($_filepath); |
|
58 // rename tmp file |
|
59 $success = @rename($_tmp_file, $_filepath); |
|
60 } else { |
|
61 // rename tmp file |
|
62 $success = @rename($_tmp_file, $_filepath); |
|
63 if (!$success) { |
|
64 // remove original file |
|
65 @unlink($_filepath); |
|
66 // rename tmp file |
|
67 $success = @rename($_tmp_file, $_filepath); |
|
68 } |
|
69 } |
|
70 |
|
71 if (!$success) { |
|
72 error_reporting($_error_reporting); |
|
73 throw new SmartyException("unable to write file {$_filepath}"); |
|
74 return false; |
|
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 return true; |
|
84 } |
|
85 |
|
86 } |
|
87 |
|
88 ?> |