= count($filename_parts) ||
$equal_number >= count($base_dir_parts))
break;
if ($filename_parts[$equal_number] != $base_dir_parts[$equal_number])
break;
}
$relative_dir = str_repeat('../', count($base_dir_parts) - $equal_number);
$relative_dir .= implode('/', array_slice($filename_parts, $equal_number));
return $relative_dir;
}
/**
* Returns open basedirs
*
* @return array
*/
function w3_get_open_basedirs() {
$open_basedir_ini = ini_get('open_basedir');
$open_basedirs = (W3TC_WIN ? preg_split('~[;,]~', $open_basedir_ini) : explode(':', $open_basedir_ini));
$result = array();
foreach ($open_basedirs as $open_basedir) {
$open_basedir = trim($open_basedir);
if (!empty($open_basedir) && $open_basedir != '') {
$result[] = w3_realpath($open_basedir);
}
}
return $result;
}
/**
* Checks if path is restricted by open_basedir
*
* @param string $path
* @return boolean
*/
function w3_check_open_basedir($path) {
$path = w3_realpath($path);
$open_basedirs = w3_get_open_basedirs();
if (!count($open_basedirs)) {
return true;
}
foreach ($open_basedirs as $open_basedir) {
if (strstr($path, $open_basedir) !== false) {
return true;
}
}
return false;
}
function w3_get_file_permissions($file) {
if (function_exists('fileperms') && $fileperms = @fileperms($file)) {
$fileperms = 0777 & $fileperms;
} else {
clearstatcache();
$stat=@stat($file);
if ($stat)
$fileperms = 0777 & $stat['mode'];
else
$fileperms = 0;
}
return $fileperms;
}
function w3_get_file_owner($file = '') {
$fileowner = $filegroup = 'unknown';
if ($file) {
if (function_exists('fileowner') && function_exists('fileowner')) {
$fileowner = @fileowner($file);
$filegroup = @filegroup($file);
if (function_exists('posix_getpwuid') && function_exists('posix_getgrgid')) {
$fileowner = @posix_getpwuid($fileowner);
$fileowner = $fileowner['name'];
$filegroup = @posix_getgrgid($filegroup);
$filegroup = $filegroup['name'];
}
}
} else {
if (function_exists('getmyuid') && function_exists('getmygid')) {
$fileowner = @getmyuid();
$filegroup = @getmygid();
if (function_exists('posix_getpwuid') && function_exists('posix_getgrgid')) {
$fileowner = @posix_getpwuid($fileowner);
$fileowner = $fileowner['name'];
$filegroup = @posix_getgrgid($filegroup);
$filegroup = $filegroup['name'];
}
}
}
return $fileowner . ':' . $filegroup;
}
/**
* Atomically writes file inside W3TC_CACHE_DIR dir
* @param $filename
* @param $content
* @throws Exception
* @return void
**/
function w3_file_put_contents_atomic($filename, $content) {
if (!is_dir(W3TC_CACHE_TMP_DIR) || !is_writable(W3TC_CACHE_TMP_DIR)) {
w3_mkdir_from(W3TC_CACHE_TMP_DIR, W3TC_CACHE_DIR);
if (!is_dir(W3TC_CACHE_TMP_DIR) || !is_writable(W3TC_CACHE_TMP_DIR)) {
throw new Exception('Can\'t create folder ' .
W3TC_CACHE_TMP_DIR . '');
}
}
$temp = tempnam(W3TC_CACHE_TMP_DIR, 'temp');
try {
if (!($f = @fopen($temp, 'wb'))) {
if (file_exists($temp))
@unlink($temp);
throw new Exception('Can\'t write to temporary file ' .
$temp . '');
}
fwrite($f, $content);
fclose($f);
if (!@rename($temp, $filename)) {
@unlink($filename);
if (!@rename($temp, $filename)) {
w3_mkdir_from(dirname($filename), W3TC_CACHE_DIR);
if (!@rename($temp, $filename)) {
throw new Exception('Can\'t write to file ' .
$filename . '');
}
}
}
$chmod = 0644;
if (defined('FS_CHMOD_FILE'))
$chmod = FS_CHMOD_FILE;
@chmod($filename, $chmod);
} catch (Exception $ex) {
if (file_exists($temp))
@unlink($temp);
throw $ex;
}
}