summaryrefslogtreecommitdiffstats
path: root/apps/files_external/3rdparty/icewind/smb/src/RawConnection.php
diff options
context:
space:
mode:
Diffstat (limited to 'apps/files_external/3rdparty/icewind/smb/src/RawConnection.php')
-rw-r--r--apps/files_external/3rdparty/icewind/smb/src/RawConnection.php165
1 files changed, 165 insertions, 0 deletions
diff --git a/apps/files_external/3rdparty/icewind/smb/src/RawConnection.php b/apps/files_external/3rdparty/icewind/smb/src/RawConnection.php
new file mode 100644
index 00000000000..926ce3714cf
--- /dev/null
+++ b/apps/files_external/3rdparty/icewind/smb/src/RawConnection.php
@@ -0,0 +1,165 @@
+<?php
+/**
+ * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Licensed under the MIT license:
+ * http://opensource.org/licenses/MIT
+ */
+
+namespace Icewind\SMB;
+
+use Icewind\SMB\Exception\ConnectionException;
+
+class RawConnection {
+ /**
+ * @var string
+ */
+ private $command;
+
+ /**
+ * @var string[]
+ */
+ private $env;
+
+ /**
+ * @var resource[] $pipes
+ *
+ * $pipes[0] holds STDIN for smbclient
+ * $pipes[1] holds STDOUT for smbclient
+ */
+ private $pipes;
+
+ /**
+ * @var resource $process
+ */
+ private $process;
+
+ public function __construct($command, $env = array()) {
+ $this->command = $command;
+ $this->env = $env;
+ $this->connect();
+ }
+
+ private function connect() {
+ $descriptorSpec = array(
+ 0 => array('pipe', 'r'), // child reads from stdin
+ 1 => array('pipe', 'w'), // child writes to stdout
+ 2 => array('pipe', 'w'), // child writes to stderr
+ 3 => array('pipe', 'r'), // child reads from fd#3
+ 4 => array('pipe', 'r'), // child reads from fd#4
+ 5 => array('pipe', 'w') // child writes to fd#5
+ );
+ setlocale(LC_ALL, Server::LOCALE);
+ $env = array_merge($this->env, array(
+ 'CLI_FORCE_INTERACTIVE' => 'y', // Needed or the prompt isn't displayed!!
+ 'LC_ALL' => Server::LOCALE,
+ 'LANG' => Server::LOCALE,
+ 'COLUMNS' => 8192 // prevent smbclient from line-wrapping it's output
+ ));
+ $this->process = proc_open($this->command, $descriptorSpec, $this->pipes, '/', $env);
+ if (!$this->isValid()) {
+ throw new ConnectionException();
+ }
+ }
+
+ /**
+ * check if the connection is still active
+ *
+ * @return bool
+ */
+ public function isValid() {
+ if (is_resource($this->process)) {
+ $status = proc_get_status($this->process);
+ return $status['running'];
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * send input to the process
+ *
+ * @param string $input
+ */
+ public function write($input) {
+ fwrite($this->getInputStream(), $input);
+ fflush($this->getInputStream());
+ }
+
+ /**
+ * read a line of output
+ *
+ * @return string
+ */
+ public function readLine() {
+ return stream_get_line($this->getOutputStream(), 4086, "\n");
+ }
+
+ /**
+ * get all output until the process closes
+ *
+ * @return array
+ */
+ public function readAll() {
+ $output = array();
+ while ($line = $this->readLine()) {
+ $output[] = $line;
+ }
+ return $output;
+ }
+
+ public function getInputStream() {
+ return $this->pipes[0];
+ }
+
+ public function getOutputStream() {
+ return $this->pipes[1];
+ }
+
+ public function getErrorStream() {
+ return $this->pipes[2];
+ }
+
+ public function getAuthStream() {
+ return $this->pipes[3];
+ }
+
+ public function getFileInputStream() {
+ return $this->pipes[4];
+ }
+
+ public function getFileOutputStream() {
+ return $this->pipes[5];
+ }
+
+ public function writeAuthentication($user, $password) {
+ $auth = ($password === false)
+ ? "username=$user"
+ : "username=$user\npassword=$password";
+
+ if (fwrite($this->getAuthStream(), $auth) === false) {
+ fclose($this->getAuthStream());
+ return false;
+ }
+ fclose($this->getAuthStream());
+ return true;
+ }
+
+ public function close($terminate = true) {
+ if (!is_resource($this->process)) {
+ return;
+ }
+ if ($terminate) {
+ proc_terminate($this->process);
+ }
+ proc_close($this->process);
+ }
+
+ public function reconnect() {
+ $this->close();
+ $this->connect();
+ }
+
+ public function __destruct() {
+ $this->close();
+ }
+}