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