Code

Updated integrated smarty
[gosa.git] / gosa-core / include / smarty / sysplugins / smarty_internal_write_file.php
index 6ec5e2dfd46d162295347d659949bde68ccec9de..aae600ee11bc5f64c75bcfbf2d6a0769c699b6e4 100644 (file)
@@ -1,50 +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);
+        }
 
+        // 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)) {
-            umask($old_umask);
+            error_reporting($_error_reporting);
             throw new SmartyException("unable to write file {$_tmp_file}");
             return false;
-        } 
+        }
+
         // 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