Fallback to use COM or exec('stat ..') is only executed if stat or filesize return negative values.

Special case of BSD has been added as stat syntax differs
In addition unknown OS is logged
remotes/origin/stable5
Thomas Mueller 12 years ago
parent dfc8d757b5
commit cedec593ee

@ -29,22 +29,15 @@ class OC_Filestorage_Local extends OC_Filestorage_Common{
return is_file($this->datadir.$path);
}
public function stat($path) {
$fullPath = $this->datadir.$path;
$fullPath = $this->datadir . $path;
$statResult = stat($fullPath);
// special case for 32-bit systems
if (PHP_INT_SIZE===4) {
if (!(strtoupper(substr(PHP_OS, 0, 3)) == 'WIN'))
$size = (float)exec('stat -c %s '. escapeshellarg ($fullPath));
else{
$fsobj = new COM("Scripting.FileSystemObject");
$f = $fsobj->GetFile($fullPath);
$size = $f->Size;
}
if ($statResult['size'] < 0) {
$size = self::getFileSizeFromOS($fullPath);
$statResult['size'] = $size;
$statResult[7] = $size;
}
return $statResult;
return $statResult;
}
@ -59,7 +52,13 @@ class OC_Filestorage_Local extends OC_Filestorage_Common{
if($this->is_dir($path)) {
return 0;
}else{
return filesize($this->datadir.$path);
$fullPath = $this->datadir . $path;
$fileSize = filesize($fullPath);
if ($fileSize < 0) {
return self::getFileSizeFromOS($fullPath);
}
return $fileSize;
}
}
public function isReadable($path) {
@ -173,6 +172,30 @@ class OC_Filestorage_Local extends OC_Filestorage_Common{
return $return;
}
private static function getFileSizeFromOS($fullPath) {
$name = strtolower(php_uname('s'));
// Windows OS: we use COM to access the filesystem
if (strpos($name, 'win') !== false) {
if (class_exists('COM')) {
$fsobj = new COM("Scripting.FileSystemObject");
$f = $fsobj->GetFile($fullPath);
return $f->Size;
}
} else if (strpos($name, 'bsd') !== false) {
if (\OC_Helper::is_function_enabled('exec')) {
return (float)exec('stat -f %z ' . escapeshellarg($fullPath));
}
} else if (strpos($name, 'linux') !== false) {
if (\OC_Helper::is_function_enabled('exec')) {
return (float)exec('stat -c %s ' . escapeshellarg($fullPath));
}
} else {
OC_Log::write('core', 'Unknown OS: '.$name, OC_Log::ERROR);
}
return 0;
}
public function hash($path, $type, $raw=false) {
return hash_file($type, $this->datadir.$path, $raw);
}

Loading…
Cancel
Save