Subversion Repositories Sites.tela-botanica.org

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4 david 1
<?php
2
 
3
/***************************************************************************\
4
 *  SPIP, Systeme de publication pour l'internet                           *
5
 *                                                                         *
6
 *  Copyright (c) 2001-2005                                                *
7
 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8
 *                                                                         *
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
\***************************************************************************/
12
 
13
 
14
//
15
// Ce fichier ne sera execute qu'une fois
16
if (defined("_ECRIRE_INC_FLOCK")) return;
17
define("_ECRIRE_INC_FLOCK", "1");
18
 
19
function spip_file_get_contents ($fichier) {
20
	if (substr($fichier, -3) != '.gz') {
21
		if (function_exists('file_get_contents')
22
		AND os_serveur != 'windows') # windows retourne ''
23
			return @file_get_contents ($fichier);
24
		else
25
			return join('', @file($fichier));
26
	} else
27
			return join('', @gzfile($fichier));
28
}
29
 
30
// options = array(
31
// 'phpcheck' => 'oui' # verifier qu'on a bien du php
32
// dezippe automatiquement les fichiers .gz
33
function lire_fichier ($fichier, &$contenu, $options=false) {
34
	$contenu = '';
35
	if (!@file_exists($fichier))
36
		return false;
37
 
38
	#spip_timer('lire_fichier');
39
 
40
	if ($fl = @fopen($fichier, 'r')) {
41
 
42
		// verrou lecture
43
		@flock($fl, LOCK_SH);
44
 
45
		// a-t-il ete supprime par le locker ?
46
		if (!@file_exists($fichier)) {
47
			@fclose($fl);
48
			return false;
49
		}
50
 
51
		// lire le fichier
52
		$contenu = spip_file_get_contents($fichier);
53
 
54
		// liberer le verrou
55
		@flock($fl, LOCK_UN);
56
		@fclose($fl);
57
 
58
		// Verifications
59
		$ok = true;
60
		if ($options['phpcheck'] == 'oui')
61
			$ok &= (ereg("[?]>\n?$", $contenu));
62
 
63
		#spip_log("$fread $fichier ".spip_timer('lire_fichier'));
64
		if (!$ok)
65
			spip_log("echec lecture $fichier");
66
 
67
		return $ok;
68
	}
69
}
70
 
71
 
72
//
73
// Ecrire un fichier de maniere un peu sure
74
//
75
// zippe les fichiers .gz
76
function ecrire_fichier ($fichier, $contenu, $ecrire_quand_meme = false) {
77
 
78
	// Ne rien faire si on est en preview, debug, ou si une erreur
79
	// grave s'est presentee (compilation du squelette, MySQL, etc)
80
	if (($GLOBALS['var_preview'] OR ($GLOBALS['var_mode'] == 'debug')
81
	OR defined('spip_interdire_cache'))
82
	AND !$ecrire_quand_meme)
83
		return;
84
 
85
	$gzip = (substr($fichier, -3) == '.gz');
86
 
87
	#spip_timer('ecrire_fichier');
88
 
89
	// verrouiller le fichier destination
90
	if ($fp = @fopen($fichier, 'a'))
91
		@flock($fp, LOCK_EX);
92
	else
93
		return false;
94
 
95
	// ecrire les donnees, compressees le cas echeant
96
	// (on ouvre un nouveau pointeur sur le fichier, ce qui a l'avantage
97
	// de le recreer si le locker qui nous precede l'avait supprime...)
98
	if ($gzip) $contenu = gzencode($contenu);
99
	@ftruncate($fp,0);
100
	$s = @fputs($fp, $contenu, $a = strlen($contenu));
101
 
102
	$ok = ($s == $a);
103
 
104
	// liberer le verrou et fermer le fichier
105
	@flock($fp, LOCK_UN);
106
	@fclose($fp);
107
 
108
	if (!$ok) {
109
		spip_log("echec ecriture fichier $fichier");
110
		@unlink($fichier);
111
	}
112
 
113
	return $ok;
114
}
115
 
116
//
117
// Supprimer le fichier de maniere sympa (flock)
118
//
119
function supprimer_fichier($fichier) {
120
	if (!@file_exists($fichier))
121
		return;
122
 
123
	// verrouiller le fichier destination
124
	if ($fp = @fopen($fichier, 'a'))
125
		@flock($fp, LOCK_EX);
126
	else
127
		return;
128
 
129
	// liberer le verrou
130
	@flock($fp, LOCK_UN);
131
	@fclose($fp);
132
 
133
	// supprimer
134
	@unlink($fichier);
135
}
136
 
137
?>