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