* This file is licensed under the Licensed under the MIT license: * http://opensource.org/licenses/MIT */ namespace Icewind\SMB; use Icewind\SMB\Exception\Exception; class System implements ISystem { /** @var (string|null)[] */ private $paths = []; /** * Get the path to a file descriptor of the current process * * @param int $num the file descriptor id * @return string * @throws Exception */ public function getFD(int $num): string { $folders = [ '/proc/self/fd', '/dev/fd' ]; foreach ($folders as $folder) { if (file_exists($folder)) { return $folder . '/' . $num; } } throw new Exception('Cant find file descriptor path'); } public function getSmbclientPath(): ?string { return $this->getBinaryPath('smbclient'); } public function getNetPath(): ?string { return $this->getBinaryPath('net'); } public function getSmbcAclsPath(): ?string { return $this->getBinaryPath('smbcacls'); } public function getStdBufPath(): ?string { return $this->getBinaryPath('stdbuf'); } public function getDatePath(): ?string { return $this->getBinaryPath('date'); } public function libSmbclientAvailable(): bool { return function_exists('smbclient_state_new'); } protected function getBinaryPath(string $binary): ?string { if (!isset($this->paths[$binary])) { $result = null; $output = []; exec("which $binary 2>&1", $output, $result); $this->paths[$binary] = $result === 0 ? trim(implode('', $output)) : null; } return $this->paths[$binary]; } }