From 6e030da38f7d6260b9f780bdefbcbda27265095a Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Sat, 18 Mar 2006 17:55:31 +0000
Subject: [PATCH] =?UTF-8?q?int=C3=A9gration=20du=20patch=20#144=20sur=20in?=
 =?UTF-8?q?c=5Fflock,=20qui=20permet=20de=20limiter=20le=20nombre=20de=20f?=
 =?UTF-8?q?ichiers=20lus=20par=20preg=5Ffiles,=20et=20d'utiliser=20ecrire?=
 =?UTF-8?q?=5Ffichier=20sans=20ftruncate=20(Cedric)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/inc/flock.php | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/ecrire/inc/flock.php b/ecrire/inc/flock.php
index 0509a6b882..de0227837d 100644
--- a/ecrire/inc/flock.php
+++ b/ecrire/inc/flock.php
@@ -70,7 +70,7 @@ function lire_fichier ($fichier, &$contenu, $options=false) {
 // Ecrire un fichier de maniere un peu sure
 //
 // zippe les fichiers .gz
-function ecrire_fichier ($fichier, $contenu, $ecrire_quand_meme = false) {
+function ecrire_fichier ($fichier, $contenu, $ecrire_quand_meme = false, $truncate=true) {
 
 	// Ne rien faire si on est en preview, debug, ou si une erreur
 	// grave s'est presentee (compilation du squelette, MySQL, etc)
@@ -93,7 +93,8 @@ function ecrire_fichier ($fichier, $contenu, $ecrire_quand_meme = false) {
 	// (on ouvre un nouveau pointeur sur le fichier, ce qui a l'avantage
 	// de le recreer si le locker qui nous precede l'avait supprime...)
 	if ($gzip) $contenu = gzencode($contenu);
-	@ftruncate($fp,0);
+	if ($truncate)
+		@ftruncate($fp,0);
 	$s = @fputs($fp, $contenu, $a = strlen($contenu));
 
 	$ok = ($s == $a);
@@ -193,31 +194,36 @@ function creer_repertoire($base, $subdir) {
 // si $dir = 'rep/sous_rep_' au lieu de 'rep/sous_rep/' on scanne 'rep/' et on
 // applique un pattern '^rep/sous_rep_'
 //
-function preg_files($dir, $pattern=-1 /* AUTO */, $recurs=array()) {
+function preg_files($dir, $pattern=-1 /* AUTO */, $maxfiles = 10000, $recurs=array()) {
+	$nbfiles = 0;
 	if ($pattern == -1)
 		$pattern = "^$dir";
 	$fichiers = array();
-
 	// revenir au repertoire racine si on a recu dossier/truc
 	// pour regarder dossier/truc/ ne pas oublier le / final
 	$dir = preg_replace(',/[^/]*$,', '', $dir);
 	if ($dir == '') $dir = '.';
 
 	if (@is_dir($dir) AND is_readable($dir) AND $d = @opendir($dir)) {
-		while (($f = readdir($d)) !== false) {
+		while (($f = readdir($d)) !== false && ($nbfiles<$maxfiles)) {
 			if ($f[0] != '.' # ignorer . .. .svn etc
 			AND $f != 'CVS'
 			AND $f != 'remove.txt'
 			AND is_readable("$dir/$f")) {
 				if (is_file("$dir/$f")) {
 					if (preg_match(",$pattern,i", "$dir/$f"))
+					{
 						$fichiers[] = "$dir/$f";
+						$nbfiles++;
+					}
 				} else if (is_dir("$dir/$f")
 				AND !in_array(realpath("$dir/$f"), $recurs)) {
 					array_push($recurs, realpath("$dir/$f"));
 					$beginning = $fichiers;
-					$end = preg_files("$dir/$f/", $pattern, $recurs);
+					$end = preg_files("$dir/$f/", $pattern,
+						$maxfiles-$nbfiles, $recurs);
 					$fichiers = array_merge((array)$beginning, (array)$end);
+					$nbfiles = count($fichiers);
 				}
 			}
 		}
-- 
GitLab