3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2007 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
14 if (!defined("_ECRIRE_INC_VERSION")) return;
16 // http://doc.spip.org/@spip_file_get_contents
17 function spip_file_get_contents ($fichier) {
18 if (substr($fichier, -3) != '.gz') {
19 if (function_exists('file_get_contents')
20 AND os_serveur
!= 'windows') # windows retourne ''
21 return @file_get_contents ($fichier);
23 return join('', @file($fichier));
25 return join('', @gzfile($fichier));
29 // 'phpcheck' => 'oui' # verifier qu'on a bien du php
30 // dezippe automatiquement les fichiers .gz
31 // http://doc.spip.org/@lire_fichier
32 function lire_fichier ($fichier, &$contenu, $options=false
) {
34 if (!@file_exists($fichier))
37 #spip_timer('lire_fichier');
39 if ($fl = @fopen($fichier, 'r')) {
44 // a-t-il ete supprime par le locker ?
45 if (!@file_exists($fichier)) {
51 $contenu = spip_file_get_contents($fichier);
59 if ($options['phpcheck'] == 'oui')
60 $ok &= (ereg("[?]>\n?$", $contenu));
62 #spip_log("$fread $fichier ".spip_timer('lire_fichier'));
64 spip_log("echec lecture $fichier");
72 // Ecrire un fichier de maniere un peu sure
74 // zippe les fichiers .gz
75 // http://doc.spip.org/@ecrire_fichier
76 function ecrire_fichier ($fichier, $contenu, $ecrire_quand_meme = false
, $truncate=true
) {
78 // Ne rien faire si on est en preview, debug, ou si une erreur
79 // grave s'est presentee (compilation du squelette, MySQL, etc)
81 (isset($GLOBALS['var_preview'])&&$GLOBALS['var_preview'])
82 OR (isset($GLOBALS['var_mode'])&&($GLOBALS['var_mode'] == 'debug'))
83 OR defined('spip_interdire_cache'))
84 AND !$ecrire_quand_meme)
87 $gzip = (substr($fichier, -3) == '.gz');
89 #spip_timer('ecrire_fichier');
91 // verrouiller le fichier destination
92 if ($fp = @fopen($fichier, 'a'))
97 // ecrire les donnees, compressees le cas echeant
98 // (on ouvre un nouveau pointeur sur le fichier, ce qui a l'avantage
99 // de le recreer si le locker qui nous precede l'avait supprime...)
100 if ($gzip) $contenu = gzencode($contenu);
103 $s = @fputs($fp, $contenu, $a = strlen($contenu));
107 // liberer le verrou et fermer le fichier
108 @flock($fp, LOCK_UN
);
112 spip_log("echec ecriture fichier $fichier");
120 // Supprimer le fichier de maniere sympa (flock)
122 // http://doc.spip.org/@supprimer_fichier
123 function supprimer_fichier($fichier) {
124 if (!@file_exists($fichier))
127 // verrouiller le fichier destination
128 if ($fp = @fopen($fichier, 'a'))
129 @flock($fp, LOCK_EX
);
134 @flock($fp, LOCK_UN
);
143 // Retourne $base/${subdir}/ si le sous-repertoire peut etre cree,
144 // $base/${subdir}_ sinon ; $nobase signale qu'on ne veut pas de $base/
145 // On peut aussi ne donner qu'un seul argument,
146 // subdir valant alors ce qui suit le dernier / dans $base
148 // http://doc.spip.org/@sous_repertoire
149 function sous_repertoire($base, $subdir='', $nobase = false
) {
150 $base = str_replace("//", "/", $base);
151 if (preg_match(',[/_]$,', $base)) $base = substr($base,0,-1);
152 if (!strlen($subdir)) {
153 $n = strrpos($base, "/");
154 if ($n === false
) return $nobase ?
'' : ($base .'/');
155 $subdir = substr($base, $n+
1);
156 $base = substr($base, 0, $n+
1);
159 $subdir = str_replace("/", "", "$subdir");
161 $baseaff = $nobase ?
'' : $base;
163 if (@file_exists("$base${subdir}.plat"))
164 return "$baseaff${subdir}_";;
166 $path = $base.$subdir; # $path = 'IMG/distant/pdf' ou 'IMG/distant_pdf'
168 if (file_exists("$path/.ok"))
169 return "$baseaff$subdir/";
171 @mkdir($path, _SPIP_CHMOD
);
172 @chmod($path, _SPIP_CHMOD
);
175 if ($test = @fopen("$path/dir_test.php", "w")) {
176 @fputs($test, '<'.'?php $ok = true; ?'.'>');
178 @include("$path/dir_test.php");
179 @unlink("$path/dir_test.php");
182 @touch ("$path/.ok");
183 spip_log("creation $base$subdir/");
184 return "$baseaff$subdir/";
187 $f = @fopen("$base${subdir}.plat", "w");
191 spip_log("echec creation $base${subdir}");
193 $base = preg_replace(',^' . _DIR_RACINE
.',', '',$base);
194 if ($test) $base .= $subdir;
195 include_spip('inc/headers');
196 redirige_par_entete(generer_url_action('test_dirs',"test_dir=$base",true
));
198 spip_log("faux sous-repertoire $base${subdir}");
199 return "$baseaff${subdir}";
203 // Cette fonction parcourt recursivement le repertoire $dir, et renvoie les
204 // fichiers dont le chemin verifie le pattern (preg) donne en argument.
205 // En cas d'echec retourne un array() vide
207 // Usage: array preg_files('ecrire/data/', '[.]lock$');
209 // Attention, afin de conserver la compatibilite avec les repertoires '.plat'
210 // si $dir = 'rep/sous_rep_' au lieu de 'rep/sous_rep/' on scanne 'rep/' et on
211 // applique un pattern '^rep/sous_rep_'
212 // si $recurs vaut false, la fonction ne descend pas dans les sus repertoires
214 // http://doc.spip.org/@preg_files
215 function preg_files($dir, $pattern=-1 /* AUTO */, $maxfiles = 10000, $recurs=array()) {
220 // revenir au repertoire racine si on a recu dossier/truc
221 // pour regarder dossier/truc/ ne pas oublier le / final
222 $dir = preg_replace(',/[^/]*$,', '', $dir);
223 if ($dir == '') $dir = '.';
225 if (@is_dir($dir) AND is_readable($dir) AND $d = @opendir($dir)) {
226 while (($f = readdir($d)) !== false
&& ($nbfiles<$maxfiles)) {
227 if ($f[0] != '.' # ignorer . .. .svn etc
229 AND $f != 'remove.txt'
230 AND is_readable($f = "$dir/$f")) {
232 if (preg_match(";$pattern;iS", $f))
238 else if (is_dir($f) AND is_array($recurs)){
240 if (!is_string($rp) OR !strlen($rp)) $rp=$f; # realpath n'est peut etre pas autorise
241 if (!isset($recurs[$rp])) {
243 $beginning = $fichiers;
244 $end = preg_files("$f/", $pattern,
245 $maxfiles-$nbfiles, $recurs);
246 $fichiers = array_merge((array)$beginning, (array)$end);
247 $nbfiles = count($fichiers);
255 spip_log("repertoire $dir absent ou illisible");