1f3f0262cSandi<? 2*15fae107Sandi/** 3*15fae107Sandi * File IO functions 4*15fae107Sandi * 5*15fae107Sandi * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 6*15fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 7*15fae107Sandi */ 8*15fae107Sandi 9f3f0262cSandi require_once("inc/common.php"); 10f3f0262cSandi require_once("inc/parser.php"); 11f3f0262cSandi 12f3f0262cSandi/** 13f3f0262cSandi * Returns the parsed text from the given sourcefile. Uses cache 14f3f0262cSandi * if exists. Creates it if not. 15*15fae107Sandi * 16*15fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 17f3f0262cSandi */ 18f3f0262cSandifunction io_cacheParse($file){ 19f3f0262cSandi global $conf; 20f3f0262cSandi global $CACHEGROUP; 21f3f0262cSandi global $parser; //we read parser options 22f3f0262cSandi $parsed = ''; 23f3f0262cSandi $cache = $conf['datadir'].'/.cache/'; 24f3f0262cSandi $cache .= md5($file.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'].$CACHEGROUP); 25f3f0262cSandi $purge = $conf['datadir'].'/.cache/purgefile'; 26f3f0262cSandi 27f3f0262cSandi // check if cache can be used 28f3f0262cSandi $cachetime = @filemtime($cache); 29f3f0262cSandi 30f3f0262cSandi if( @file_exists($cache) // does the cachefile exist 31f3f0262cSandi && @file_exists($file) // and does the source exist 32f3f0262cSandi && !isset($_REQUEST['purge']) // no purge param was set 33f3f0262cSandi && filesize($cache) // and contains the cachefile any data 34f3f0262cSandi && ((time() - $cachetime) < $conf['cachetime']) // and is cachefile young enough 35f3f0262cSandi && ($cachetime > filemtime($file)) // and newer than the source 36f3f0262cSandi && ($cachetime > @filemtime($purge)) // and newer than the purgefile 37f3f0262cSandi && ($cachetime > filemtime('conf/dokuwiki.php')) // and newer than the config file 38f3f0262cSandi && ($cachetime > @filemtime('conf/local.php')) // and newer than the local config file 39f3f0262cSandi && ($cachetime > filemtime('inc/parser.php')) // and newer than the parser 40f3f0262cSandi && ($cachetime > filemtime('inc/format.php'))) // and newer than the formating functions 41f3f0262cSandi { 42f3f0262cSandi $parsed = io_readFile($cache); //give back cache 43f3f0262cSandi $parsed .= "\n<!-- cachefile $cache used -->\n"; 44f3f0262cSandi }elseif(@file_exists($file)){ 45f3f0262cSandi $parsed = parse(io_readFile($file)); //sets global parseroptions 46f3f0262cSandi if($parser['cache']){ 47f3f0262cSandi io_saveFile($cache,$parsed); //save cachefile 48f3f0262cSandi $parsed .= "\n<!-- no cachefile used, but created -->\n"; 49f3f0262cSandi }else{ 50f3f0262cSandi @unlink($cache); //try to delete cachefile 51f3f0262cSandi $parsed .= "\n<!-- no cachefile used, caching forbidden -->\n"; 52f3f0262cSandi } 53f3f0262cSandi } 54f3f0262cSandi 55f3f0262cSandi return $parsed; 56f3f0262cSandi} 57f3f0262cSandi 58f3f0262cSandi/** 59*15fae107Sandi * Returns content of $file as cleaned string. 60*15fae107Sandi * 61*15fae107Sandi * Uses gzip if extension is .gz 62*15fae107Sandi * 63*15fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 64f3f0262cSandi */ 65f3f0262cSandifunction io_readFile($file){ 66f3f0262cSandi $ret = ''; 67f3f0262cSandi if(@file_exists($file)){ 68f3f0262cSandi if(substr($file,-3) == '.gz'){ 69f3f0262cSandi $ret = join('',gzfile($file)); 70f3f0262cSandi }else{ 71f3f0262cSandi $ret = join('',file($file)); 72f3f0262cSandi } 73f3f0262cSandi } 74f3f0262cSandi return cleanText($ret); 75f3f0262cSandi} 76f3f0262cSandi 77f3f0262cSandi/** 78*15fae107Sandi * Saves $content to $file. 79f3f0262cSandi * 80*15fae107Sandi * Uses gzip if extension is .gz 81*15fae107Sandi * 82*15fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 83*15fae107Sandi * @return bool true on success 84f3f0262cSandi */ 85f3f0262cSandifunction io_saveFile($file,$content){ 86f3f0262cSandi io_makeFileDir($file); 87f3f0262cSandi if(substr($file,-3) == '.gz'){ 88f3f0262cSandi $fh = @gzopen($file,'wb9'); 89f3f0262cSandi if(!$fh){ 90f3f0262cSandi msg("Writing $file failed",-1); 91f3f0262cSandi return false; 92f3f0262cSandi } 93f3f0262cSandi gzwrite($fh, $content); 94f3f0262cSandi gzclose($fh); 95f3f0262cSandi }else{ 96f3f0262cSandi $fh = @fopen($file,'wb'); 97f3f0262cSandi if(!$fh){ 98f3f0262cSandi msg("Writing $file failed",-1); 99f3f0262cSandi return false; 100f3f0262cSandi } 101f3f0262cSandi fwrite($fh, $content); 102f3f0262cSandi fclose($fh); 103f3f0262cSandi } 104f3f0262cSandi return true; 105f3f0262cSandi} 106f3f0262cSandi 107f3f0262cSandi/** 108f3f0262cSandi * Create the directory needed for the given file 109*15fae107Sandi * 110*15fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 111f3f0262cSandi */ 112f3f0262cSandifunction io_makeFileDir($file){ 113f3f0262cSandi global $conf; 114f3f0262cSandi 115f3f0262cSandi $dir = dirname($file); 116f3f0262cSandi umask($conf['dmask']); 117f3f0262cSandi if(!is_dir($dir)){ 118f3f0262cSandi io_mkdir_p($dir) || msg("Creating directory $dir failed",-1); 119f3f0262cSandi } 120f3f0262cSandi umask($conf['umask']); 121f3f0262cSandi} 122f3f0262cSandi 123f3f0262cSandi/** 124f3f0262cSandi * Creates a directory hierachy. 125f3f0262cSandi * 126*15fae107Sandi * @link http://www.php.net/manual/en/function.mkdir.php 127f3f0262cSandi * @author <saint@corenova.com> 128f3f0262cSandi */ 129f3f0262cSandifunction io_mkdir_p($target){ 130f3f0262cSandi if (is_dir($target)||empty($target)) return 1; // best case check first 131f3f0262cSandi if (@file_exists($target) && !is_dir($target)) return 0; 132f3f0262cSandi if (io_mkdir_p(substr($target,0,strrpos($target,'/')))) 133f3f0262cSandi return @mkdir($target,0777); // crawl back up & create dir tree 134f3f0262cSandi return 0; 135f3f0262cSandi} 136f3f0262cSandi 137f3f0262cSandi/** 138f3f0262cSandi * Runs an external command and returns it's output as string 139*15fae107Sandi * 140*15fae107Sandi * @author Harry Brueckner <harry_b@eml.cc> 141*15fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 142f3f0262cSandi */ 143f3f0262cSandifunction io_runcmd($cmd){ 144f3f0262cSandi $fh = popen($cmd, "r"); 145f3f0262cSandi if(!$fh) return false; 146f3f0262cSandi $ret = ''; 147f3f0262cSandi while (!feof($fh)) { 148f3f0262cSandi $ret .= fread($fh, 8192); 149f3f0262cSandi } 150f3f0262cSandi pclose($fh); 151f3f0262cSandi return $ret; 152f3f0262cSandi} 153f3f0262cSandi 154f3f0262cSandi?> 155