xref: /dokuwiki/inc/io.php (revision 15fae1076f4439c7cd1302494a48e24f707a3020)
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