1ed7b5f09Sandi<?php 215fae107Sandi/** 315fae107Sandi * File IO functions 415fae107Sandi * 515fae107Sandi * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 715fae107Sandi */ 815fae107Sandi 9ed7b5f09Sandi if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/'); 10ed7b5f09Sandi require_once(DOKU_INC.'inc/common.php'); 11f3f0262cSandi 12f3f0262cSandi/** 13f3f0262cSandi * Returns the parsed text from the given sourcefile. Uses cache 14f3f0262cSandi * if exists. Creates it if not. 1515fae107Sandi * 1615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 17c112d578Sandi * @deprecated -> parserutils 18f3f0262cSandi */ 19f3f0262cSandifunction io_cacheParse($file){ 20a2d649c4Sandi trigger_error("deprecated io_cacheParse called"); 21a2d649c4Sandi 22f3f0262cSandi global $conf; 23f3f0262cSandi global $CACHEGROUP; 24f3f0262cSandi global $parser; //we read parser options 25f3f0262cSandi $parsed = ''; 269afe4dbfSjan $cache = $conf['datadir'].'/_cache/'; 27f3f0262cSandi $cache .= md5($file.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'].$CACHEGROUP); 289afe4dbfSjan $purge = $conf['datadir'].'/_cache/purgefile'; 29f3f0262cSandi 30f3f0262cSandi // check if cache can be used 31f3f0262cSandi $cachetime = @filemtime($cache); 32f3f0262cSandi 33f3f0262cSandi if( @file_exists($cache) // does the cachefile exist 34f3f0262cSandi && @file_exists($file) // and does the source exist 35f3f0262cSandi && !isset($_REQUEST['purge']) // no purge param was set 36f3f0262cSandi && filesize($cache) // and contains the cachefile any data 37f3f0262cSandi && ((time() - $cachetime) < $conf['cachetime']) // and is cachefile young enough 38f3f0262cSandi && ($cachetime > filemtime($file)) // and newer than the source 39f3f0262cSandi && ($cachetime > @filemtime($purge)) // and newer than the purgefile 40f3f0262cSandi && ($cachetime > filemtime('conf/dokuwiki.php')) // and newer than the config file 41f3f0262cSandi && ($cachetime > @filemtime('conf/local.php')) // and newer than the local config file 42f3f0262cSandi && ($cachetime > filemtime('inc/parser.php')) // and newer than the parser 43f3f0262cSandi && ($cachetime > filemtime('inc/format.php'))) // and newer than the formating functions 44f3f0262cSandi { 45f3f0262cSandi $parsed = io_readFile($cache); //give back cache 46f3f0262cSandi $parsed .= "\n<!-- cachefile $cache used -->\n"; 47f3f0262cSandi }elseif(@file_exists($file)){ 48f3f0262cSandi $parsed = parse(io_readFile($file)); //sets global parseroptions 49f3f0262cSandi if($parser['cache']){ 50f3f0262cSandi io_saveFile($cache,$parsed); //save cachefile 51f3f0262cSandi $parsed .= "\n<!-- no cachefile used, but created -->\n"; 52f3f0262cSandi }else{ 53f3f0262cSandi @unlink($cache); //try to delete cachefile 54f3f0262cSandi $parsed .= "\n<!-- no cachefile used, caching forbidden -->\n"; 55f3f0262cSandi } 56f3f0262cSandi } 57f3f0262cSandi 58f3f0262cSandi return $parsed; 59f3f0262cSandi} 60f3f0262cSandi 61f3f0262cSandi/** 6253d6ccfeSandi * Removes empty directories 6353d6ccfeSandi * 6453d6ccfeSandi * @todo use safemode hack 6553d6ccfeSandi * @author Andreas Gohr <andi@splitbrain.org> 6653d6ccfeSandi */ 6753d6ccfeSandifunction io_sweepNS($id){ 6853d6ccfeSandi global $conf; 6953d6ccfeSandi 7053d6ccfeSandi //scan all namespaces 7153d6ccfeSandi while(($id = getNS($id)) !== false){ 7253d6ccfeSandi $dir = $conf['datadir'].'/'.str_replace(':','/',$id); 7353d6ccfeSandi $dir = utf8_encodeFN($dir); 7453d6ccfeSandi 7553d6ccfeSandi //try to delete dir else return 7653d6ccfeSandi if(!@rmdir($dir)) return; 7753d6ccfeSandi } 7853d6ccfeSandi} 7953d6ccfeSandi 8053d6ccfeSandi/** 8115fae107Sandi * Returns content of $file as cleaned string. 8215fae107Sandi * 8315fae107Sandi * Uses gzip if extension is .gz 8415fae107Sandi * 8515fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 86f3f0262cSandi */ 87f3f0262cSandifunction io_readFile($file){ 88f3f0262cSandi $ret = ''; 89f3f0262cSandi if(@file_exists($file)){ 90f3f0262cSandi if(substr($file,-3) == '.gz'){ 91f3f0262cSandi $ret = join('',gzfile($file)); 92f3f0262cSandi }else{ 93f3f0262cSandi $ret = join('',file($file)); 94f3f0262cSandi } 95f3f0262cSandi } 96f3f0262cSandi return cleanText($ret); 97f3f0262cSandi} 98f3f0262cSandi 99f3f0262cSandi/** 10015fae107Sandi * Saves $content to $file. 101f3f0262cSandi * 10215fae107Sandi * Uses gzip if extension is .gz 10315fae107Sandi * 10415fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 10515fae107Sandi * @return bool true on success 106f3f0262cSandi */ 107f3f0262cSandifunction io_saveFile($file,$content){ 108f3f0262cSandi io_makeFileDir($file); 109f3f0262cSandi if(substr($file,-3) == '.gz'){ 110f3f0262cSandi $fh = @gzopen($file,'wb9'); 111f3f0262cSandi if(!$fh){ 112f3f0262cSandi msg("Writing $file failed",-1); 113f3f0262cSandi return false; 114f3f0262cSandi } 115f3f0262cSandi gzwrite($fh, $content); 116f3f0262cSandi gzclose($fh); 117f3f0262cSandi }else{ 118f3f0262cSandi $fh = @fopen($file,'wb'); 119f3f0262cSandi if(!$fh){ 120f3f0262cSandi msg("Writing $file failed",-1); 121f3f0262cSandi return false; 122f3f0262cSandi } 123f3f0262cSandi fwrite($fh, $content); 124f3f0262cSandi fclose($fh); 125f3f0262cSandi } 126f3f0262cSandi return true; 127f3f0262cSandi} 128f3f0262cSandi 129f3f0262cSandi/** 130f3f0262cSandi * Create the directory needed for the given file 13115fae107Sandi * 13215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 133f3f0262cSandi */ 134f3f0262cSandifunction io_makeFileDir($file){ 135f3f0262cSandi global $conf; 136f3f0262cSandi 137f3f0262cSandi $dir = dirname($file); 1383dc3a5f1Sandi if($conf['safemodehack']){ 139bce5c1daSandi $dir = preg_replace('/^'.preg_quote(realpath($conf['ftp']['root']),'/').'/','',$dir); 1403dc3a5f1Sandi } 141f3f0262cSandi umask($conf['dmask']); 142f3f0262cSandi if(!is_dir($dir)){ 143f3f0262cSandi io_mkdir_p($dir) || msg("Creating directory $dir failed",-1); 144f3f0262cSandi } 145f3f0262cSandi umask($conf['umask']); 146f3f0262cSandi} 147f3f0262cSandi 148f3f0262cSandi/** 149f3f0262cSandi * Creates a directory hierachy. 150f3f0262cSandi * 15115fae107Sandi * @link http://www.php.net/manual/en/function.mkdir.php 152f3f0262cSandi * @author <saint@corenova.com> 1533dc3a5f1Sandi * @author Andreas Gohr <andi@splitbrain.org> 154f3f0262cSandi */ 155f3f0262cSandifunction io_mkdir_p($target){ 1563dc3a5f1Sandi global $conf; 157f3f0262cSandi if (is_dir($target)||empty($target)) return 1; // best case check first 158f3f0262cSandi if (@file_exists($target) && !is_dir($target)) return 0; 1593dc3a5f1Sandi //recursion 1603dc3a5f1Sandi if (io_mkdir_p(substr($target,0,strrpos($target,'/')))){ 1613dc3a5f1Sandi if($conf['safemodehack']){ 1623dc3a5f1Sandi return io_mkdir_ftp($target); 1633dc3a5f1Sandi }else{ 164f3f0262cSandi return @mkdir($target,0777); // crawl back up & create dir tree 1653dc3a5f1Sandi } 1663dc3a5f1Sandi } 167f3f0262cSandi return 0; 168f3f0262cSandi} 169f3f0262cSandi 170f3f0262cSandi/** 1713dc3a5f1Sandi * Creates a directory using FTP 1723dc3a5f1Sandi * 1733dc3a5f1Sandi * This is used when the safemode workaround is enabled 1743dc3a5f1Sandi * 1753dc3a5f1Sandi * @author <andi@splitbrain.org> 1763dc3a5f1Sandi */ 1773dc3a5f1Sandifunction io_mkdir_ftp($dir){ 1783dc3a5f1Sandi global $conf; 1793dc3a5f1Sandi 1803dc3a5f1Sandi if(!function_exists('ftp_connect')){ 1813dc3a5f1Sandi msg("FTP support not found - safemode workaround not usable",-1); 1823dc3a5f1Sandi return false; 1833dc3a5f1Sandi } 1843dc3a5f1Sandi 1853dc3a5f1Sandi $conn = @ftp_connect($conf['ftp']['host'],$conf['ftp']['port'],10); 1863dc3a5f1Sandi if(!$conn){ 1873dc3a5f1Sandi msg("FTP connection failed",-1); 1883dc3a5f1Sandi return false; 1893dc3a5f1Sandi } 1903dc3a5f1Sandi 1913dc3a5f1Sandi if(!@ftp_login($conn, $conf['ftp']['user'], $conf['ftp']['pass'])){ 1923dc3a5f1Sandi msg("FTP login failed",-1); 1933dc3a5f1Sandi return false; 1943dc3a5f1Sandi } 1953dc3a5f1Sandi 1967b7154fbSandi//FIXME silence those commands again! 1973dc3a5f1Sandi //create directory 1987b7154fbSandi $ok = ftp_mkdir($conn, $dir); 1993dc3a5f1Sandi //set permissions (using the directory umask) 200*7879fd27Sandi ftp_site($conn,sprintf("CHMOD %04o %s",(0777 - $conf['dmask']),$dir)); 2013dc3a5f1Sandi 2023dc3a5f1Sandi ftp_close($conn); 2033dc3a5f1Sandi return $ok; 2043dc3a5f1Sandi} 2053dc3a5f1Sandi 2063dc3a5f1Sandi/** 207b625487dSandi * downloads a file from the net and saves it to the given location 208b625487dSandi * 209b625487dSandi * @author Andreas Gohr <andi@splitbrain.org> 210b625487dSandi * @todo Add size limit 211b625487dSandi */ 212b625487dSandifunction io_download($url,$file){ 213b625487dSandi $fp = @fopen($url,"rb"); 214b625487dSandi if(!$fp) return false; 215b625487dSandi 2160e33fac4Sandi $kb = 0; 2170e33fac4Sandi $now = time(); 2180e33fac4Sandi 219b625487dSandi while(!feof($fp)){ 2200e33fac4Sandi if($kb++ > 2048 || (time() - $now) > 45){ 2210e33fac4Sandi //abort on 2 MB and timeout on 45 sec 2220e33fac4Sandi return false; 2230e33fac4Sandi } 224b625487dSandi $cont.= fread($fp,1024); 225b625487dSandi } 226b625487dSandi fclose($fp); 227b625487dSandi 228b625487dSandi $fp2 = @fopen($file,"w"); 229b625487dSandi if(!$fp2) return false; 230b625487dSandi fwrite($fp2,$cont); 231b625487dSandi fclose($fp2); 232b625487dSandi return true; 233b625487dSandi} 234b625487dSandi 235b625487dSandi/** 236f3f0262cSandi * Runs an external command and returns it's output as string 23715fae107Sandi * 23815fae107Sandi * @author Harry Brueckner <harry_b@eml.cc> 23915fae107Sandi * @author Andreas Gohr <andi@splitbrain.org> 2403dc3a5f1Sandi * @deprecated 241f3f0262cSandi */ 242f3f0262cSandifunction io_runcmd($cmd){ 243f3f0262cSandi $fh = popen($cmd, "r"); 244f3f0262cSandi if(!$fh) return false; 245f3f0262cSandi $ret = ''; 246f3f0262cSandi while (!feof($fh)) { 247f3f0262cSandi $ret .= fread($fh, 8192); 248f3f0262cSandi } 249f3f0262cSandi pclose($fh); 250f3f0262cSandi return $ret; 251f3f0262cSandi} 252f3f0262cSandi 253340756e4Sandi 254340756e4Sandi//Setup VIM: ex: et ts=2 enc=utf-8 : 255