xref: /dokuwiki/inc/io.php (revision 9afe4dbf2e0907d016556ca89d08115ab99ab903)
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');
11ed7b5f09Sandi  require_once(DOKU_INC.'inc/parser.php');
12f3f0262cSandi
13f3f0262cSandi/**
14f3f0262cSandi * Returns the parsed text from the given sourcefile. Uses cache
15f3f0262cSandi * if exists. Creates it if not.
1615fae107Sandi *
1715fae107Sandi * @author  Andreas Gohr <andi@splitbrain.org>
18f3f0262cSandi */
19f3f0262cSandifunction io_cacheParse($file){
20f3f0262cSandi  global $conf;
21f3f0262cSandi  global $CACHEGROUP;
22f3f0262cSandi  global $parser; //we read parser options
23f3f0262cSandi  $parsed = '';
24*9afe4dbfSjan  $cache  = $conf['datadir'].'/_cache/';
25f3f0262cSandi  $cache .= md5($file.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'].$CACHEGROUP);
26*9afe4dbfSjan  $purge  = $conf['datadir'].'/_cache/purgefile';
27f3f0262cSandi
28f3f0262cSandi  // check if cache can be used
29f3f0262cSandi  $cachetime = @filemtime($cache);
30f3f0262cSandi
31f3f0262cSandi  if(   @file_exists($cache)                          // does the cachefile exist
32f3f0262cSandi     && @file_exists($file)                           // and does the source exist
33f3f0262cSandi     && !isset($_REQUEST['purge'])                    // no purge param was set
34f3f0262cSandi     && filesize($cache)                              // and contains the cachefile any data
35f3f0262cSandi     && ((time() - $cachetime) < $conf['cachetime'])  // and is cachefile young enough
36f3f0262cSandi     && ($cachetime > filemtime($file))               // and newer than the source
37f3f0262cSandi     && ($cachetime > @filemtime($purge))             // and newer than the purgefile
38f3f0262cSandi     && ($cachetime > filemtime('conf/dokuwiki.php')) // and newer than the config file
39f3f0262cSandi     && ($cachetime > @filemtime('conf/local.php'))   // and newer than the local config file
40f3f0262cSandi     && ($cachetime > filemtime('inc/parser.php'))    // and newer than the parser
41f3f0262cSandi     && ($cachetime > filemtime('inc/format.php')))   // and newer than the formating functions
42f3f0262cSandi  {
43f3f0262cSandi    $parsed  = io_readFile($cache); //give back cache
44f3f0262cSandi    $parsed .= "\n<!-- cachefile $cache used -->\n";
45f3f0262cSandi  }elseif(@file_exists($file)){
46f3f0262cSandi    $parsed = parse(io_readFile($file)); //sets global parseroptions
47f3f0262cSandi    if($parser['cache']){
48f3f0262cSandi      io_saveFile($cache,$parsed); //save cachefile
49f3f0262cSandi      $parsed .= "\n<!-- no cachefile used, but created -->\n";
50f3f0262cSandi    }else{
51f3f0262cSandi      @unlink($cache); //try to delete cachefile
52f3f0262cSandi      $parsed .= "\n<!-- no cachefile used, caching forbidden -->\n";
53f3f0262cSandi    }
54f3f0262cSandi  }
55f3f0262cSandi
56f3f0262cSandi  return $parsed;
57f3f0262cSandi}
58f3f0262cSandi
59f3f0262cSandi/**
6053d6ccfeSandi * Removes empty directories
6153d6ccfeSandi *
6253d6ccfeSandi * @todo use safemode hack
6353d6ccfeSandi * @author  Andreas Gohr <andi@splitbrain.org>
6453d6ccfeSandi */
6553d6ccfeSandifunction io_sweepNS($id){
6653d6ccfeSandi  global $conf;
6753d6ccfeSandi
6853d6ccfeSandi  //scan all namespaces
6953d6ccfeSandi  while(($id = getNS($id)) !== false){
7053d6ccfeSandi		$dir = $conf['datadir'].'/'.str_replace(':','/',$id);
7153d6ccfeSandi    $dir = utf8_encodeFN($dir);
7253d6ccfeSandi
7353d6ccfeSandi    //try to delete dir else return
7453d6ccfeSandi    if(!@rmdir($dir)) return;
7553d6ccfeSandi  }
7653d6ccfeSandi}
7753d6ccfeSandi
7853d6ccfeSandi/**
7915fae107Sandi * Returns content of $file as cleaned string.
8015fae107Sandi *
8115fae107Sandi * Uses gzip if extension is .gz
8215fae107Sandi *
8315fae107Sandi * @author  Andreas Gohr <andi@splitbrain.org>
84f3f0262cSandi */
85f3f0262cSandifunction io_readFile($file){
86f3f0262cSandi  $ret = '';
87f3f0262cSandi  if(@file_exists($file)){
88f3f0262cSandi    if(substr($file,-3) == '.gz'){
89f3f0262cSandi      $ret = join('',gzfile($file));
90f3f0262cSandi    }else{
91f3f0262cSandi      $ret = join('',file($file));
92f3f0262cSandi    }
93f3f0262cSandi  }
94f3f0262cSandi  return cleanText($ret);
95f3f0262cSandi}
96f3f0262cSandi
97f3f0262cSandi/**
9815fae107Sandi * Saves $content to $file.
99f3f0262cSandi *
10015fae107Sandi * Uses gzip if extension is .gz
10115fae107Sandi *
10215fae107Sandi * @author  Andreas Gohr <andi@splitbrain.org>
10315fae107Sandi * @return bool true on success
104f3f0262cSandi */
105f3f0262cSandifunction io_saveFile($file,$content){
106f3f0262cSandi  io_makeFileDir($file);
107f3f0262cSandi  if(substr($file,-3) == '.gz'){
108f3f0262cSandi    $fh = @gzopen($file,'wb9');
109f3f0262cSandi    if(!$fh){
110f3f0262cSandi      msg("Writing $file failed",-1);
111f3f0262cSandi      return false;
112f3f0262cSandi    }
113f3f0262cSandi    gzwrite($fh, $content);
114f3f0262cSandi    gzclose($fh);
115f3f0262cSandi  }else{
116f3f0262cSandi    $fh = @fopen($file,'wb');
117f3f0262cSandi    if(!$fh){
118f3f0262cSandi      msg("Writing $file failed",-1);
119f3f0262cSandi      return false;
120f3f0262cSandi    }
121f3f0262cSandi    fwrite($fh, $content);
122f3f0262cSandi    fclose($fh);
123f3f0262cSandi  }
124f3f0262cSandi  return true;
125f3f0262cSandi}
126f3f0262cSandi
127f3f0262cSandi/**
128f3f0262cSandi * Create the directory needed for the given file
12915fae107Sandi *
13015fae107Sandi * @author  Andreas Gohr <andi@splitbrain.org>
131f3f0262cSandi */
132f3f0262cSandifunction io_makeFileDir($file){
133f3f0262cSandi  global $conf;
134f3f0262cSandi
135f3f0262cSandi  $dir = dirname($file);
1363dc3a5f1Sandi  if($conf['safemodehack']){
1373dc3a5f1Sandi    preg_replace('/^'.preg_quote(realpath($conf['ftp']['root']),'/').'/','',$dir);
1383dc3a5f1Sandi  }
139f3f0262cSandi  umask($conf['dmask']);
140f3f0262cSandi  if(!is_dir($dir)){
141f3f0262cSandi    io_mkdir_p($dir) || msg("Creating directory $dir failed",-1);
142f3f0262cSandi  }
143f3f0262cSandi  umask($conf['umask']);
144f3f0262cSandi}
145f3f0262cSandi
146f3f0262cSandi/**
147f3f0262cSandi * Creates a directory hierachy.
148f3f0262cSandi *
14915fae107Sandi * @link    http://www.php.net/manual/en/function.mkdir.php
150f3f0262cSandi * @author  <saint@corenova.com>
1513dc3a5f1Sandi * @author  Andreas Gohr <andi@splitbrain.org>
152f3f0262cSandi */
153f3f0262cSandifunction io_mkdir_p($target){
1543dc3a5f1Sandi  global $conf;
155f3f0262cSandi  if (is_dir($target)||empty($target)) return 1; // best case check first
156f3f0262cSandi  if (@file_exists($target) && !is_dir($target)) return 0;
1573dc3a5f1Sandi  //recursion
1583dc3a5f1Sandi  if (io_mkdir_p(substr($target,0,strrpos($target,'/')))){
1593dc3a5f1Sandi    if($conf['safemodehack']){
1603dc3a5f1Sandi      return io_mkdir_ftp($target);
1613dc3a5f1Sandi    }else{
162f3f0262cSandi      return @mkdir($target,0777); // crawl back up & create dir tree
1633dc3a5f1Sandi    }
1643dc3a5f1Sandi  }
165f3f0262cSandi  return 0;
166f3f0262cSandi}
167f3f0262cSandi
168f3f0262cSandi/**
1693dc3a5f1Sandi * Creates a directory using FTP
1703dc3a5f1Sandi *
1713dc3a5f1Sandi * This is used when the safemode workaround is enabled
1723dc3a5f1Sandi *
1733dc3a5f1Sandi * @author <andi@splitbrain.org>
1743dc3a5f1Sandi */
1753dc3a5f1Sandifunction io_mkdir_ftp($dir){
1763dc3a5f1Sandi  global $conf;
1773dc3a5f1Sandi
1783dc3a5f1Sandi  if(!function_exists('ftp_connect')){
1793dc3a5f1Sandi    msg("FTP support not found - safemode workaround not usable",-1);
1803dc3a5f1Sandi    return false;
1813dc3a5f1Sandi  }
1823dc3a5f1Sandi
1833dc3a5f1Sandi  $conn = @ftp_connect($conf['ftp']['host'],$conf['ftp']['port'],10);
1843dc3a5f1Sandi  if(!$conn){
1853dc3a5f1Sandi    msg("FTP connection failed",-1);
1863dc3a5f1Sandi    return false;
1873dc3a5f1Sandi  }
1883dc3a5f1Sandi
1893dc3a5f1Sandi  if(!@ftp_login($conn, $conf['ftp']['user'], $conf['ftp']['pass'])){
1903dc3a5f1Sandi    msg("FTP login failed",-1);
1913dc3a5f1Sandi    return false;
1923dc3a5f1Sandi  }
1933dc3a5f1Sandi
1943dc3a5f1Sandi  //create directory
1953dc3a5f1Sandi  $ok = @ftp_mkdir($conn, $dir);
1963dc3a5f1Sandi  //set permissions (using the directory umask)
1973dc3a5f1Sandi  @ftp_site($conn,sprintf("CHMOD %04o %s",$perm & (0777 - $conf['dmask']),$dir));
1983dc3a5f1Sandi
1993dc3a5f1Sandi  ftp_close($conn);
2003dc3a5f1Sandi  return $ok;
2013dc3a5f1Sandi}
2023dc3a5f1Sandi
2033dc3a5f1Sandi/**
204f3f0262cSandi * Runs an external command and returns it's output as string
20515fae107Sandi *
20615fae107Sandi * @author Harry Brueckner <harry_b@eml.cc>
20715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
2083dc3a5f1Sandi * @deprecated
209f3f0262cSandi */
210f3f0262cSandifunction io_runcmd($cmd){
211f3f0262cSandi  $fh = popen($cmd, "r");
212f3f0262cSandi  if(!$fh) return false;
213f3f0262cSandi  $ret = '';
214f3f0262cSandi  while (!feof($fh)) {
215f3f0262cSandi    $ret .= fread($fh, 8192);
216f3f0262cSandi  }
217f3f0262cSandi  pclose($fh);
218f3f0262cSandi  return $ret;
219f3f0262cSandi}
220f3f0262cSandi
221f3f0262cSandi?>
222