From 89082b2b2923af19b0b781aa98b530d7d85e7053 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 19 Oct 2023 16:33:59 +0200 Subject: [PATCH] use stat instead of attributes --- src/Native/NativeFileInfo.php | 35 ++++++++--------------------------- src/Native/NativeShare.php | 7 +++++++ src/Native/NativeStream.php | 2 +- 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/src/Native/NativeFileInfo.php b/src/Native/NativeFileInfo.php index 85fb027..60d5705 100644 --- a/src/Native/NativeFileInfo.php +++ b/src/Native/NativeFileInfo.php @@ -9,6 +9,7 @@ use Icewind\SMB\ACL; use Icewind\SMB\Exception\Exception; +use Icewind\SMB\Exception\NotFoundException; use Icewind\SMB\IFileInfo; class NativeFileInfo implements IFileInfo { @@ -18,8 +19,8 @@ class NativeFileInfo implements IFileInfo { protected $name; /** @var NativeShare */ protected $share; - /** @var array{"mode": int, "size": int, "write_time": int}|null */ - protected $attributeCache = null; + /** @var array{"mode": int, "size": int, "mtime": int}|null */ + protected $statCache = null; public function __construct(NativeShare $share, string $path, string $name) { $this->share = $share; @@ -36,33 +37,13 @@ public function getName(): string { } /** - * @return array{"mode": int, "size": int, "write_time": int} + * @return array{"mode": int, "size": int, "mtime": int} */ protected function stat(): array { - if (is_null($this->attributeCache)) { - $rawAttributes = explode(',', $this->share->getAttribute($this->path, 'system.dos_attr.*')); - $attributes = []; - foreach ($rawAttributes as $rawAttribute) { - list($name, $value) = explode(':', $rawAttribute); - $name = strtolower($name); - if ($name == 'mode') { - $attributes[$name] = (int)hexdec(substr($value, 2)); - } else { - $attributes[$name] = (int)$value; - } - } - if (!isset($attributes['mode'])) { - throw new Exception("Invalid attribute response"); - } - if (!isset($attributes['size'])) { - throw new Exception("Invalid attribute response"); - } - if (!isset($attributes['write_time'])) { - throw new Exception("Invalid attribute response"); - } - $this->attributeCache = $attributes; + if (is_null($this->statCache)) { + $this->statCache = $this->share->rawStat($this->path); } - return $this->attributeCache; + return $this->statCache; } public function getSize(): int { @@ -72,7 +53,7 @@ public function getSize(): int { public function getMTime(): int { $stat = $this->stat(); - return $stat['write_time']; + return $stat['mtime']; } /** diff --git a/src/Native/NativeShare.php b/src/Native/NativeShare.php index 8c4eab2..8bcfe56 100644 --- a/src/Native/NativeShare.php +++ b/src/Native/NativeShare.php @@ -116,6 +116,13 @@ public function stat(string $path): IFileInfo { return $info; } + /** + * @return array{"mode": int, "size": int, "mtime": int} + */ + public function rawStat(string $path): array { + return $this->getState()->stat($this->buildUrl($path)); + } + /** * Multibyte unicode safe version of basename() * diff --git a/src/Native/NativeStream.php b/src/Native/NativeStream.php index 624ef82..3fc9eb6 100644 --- a/src/Native/NativeStream.php +++ b/src/Native/NativeStream.php @@ -131,7 +131,7 @@ public function stream_seek($offset, $whence = SEEK_SET) { */ public function stream_stat() { try { - return $this->state->stat($this->url); + return $this->state->fstat($this->handle, $this->url); } catch (Exception $e) { return false; }