* * @internal */ abstract class AbstractPipes implements PipesInterface { public $pipes = []; private $inputBuffer = ''; private $input; private $blocked = true; private $lastError; /** * @param resource|string|int|float|bool|\Iterator|null $input */ public function __construct($input) { if (\is_resource($input) || $input instanceof \Iterator) { $this->input = $input; } elseif (\is_string($input)) { $this->inputBuffer = $input; } else { $this->inputBuffer = (string) $input; } } /** * {@inheritdoc} */ public function close() { foreach ($this->pipes as $pipe) { if (\is_resource($pipe)) { fclose($pipe); } } $this->pipes = []; } /** * Returns true if a system call has been interrupted. */ protected function hasSystemCallBeenInterrupted(): bool { $lastError = $this->lastError; $this->lastError = null; // stream_select returns false when the `select` system call is interrupted by an incoming signal return null !== $lastError && false !== stripos($lastError, 'interrupted system call'); } /** * Unblocks streams. */ protected function unblock() { if (!$this->blocked) { return; } foreach ($this->pipes as $pipe) { stream_set_blocking($pipe, 0); } if (\is_resource($this->input)) { stream_set_blocking($this->input, 0); } $this->blocked = false; } /** * Writes input to stdin. * * @throws InvalidArgumentException When an input iterator yields a non supported value */ protected function write(): ?array { if (!isset($this->pipes[0])) { return null; } $input = $this->input; if ($input instanceof \Iterator) { if (!$input->valid()) { $input = null; } elseif (\is_resource($input = $input->current())) { stream_set_blocking($input, 0); } elseif (!isset($this->inputBuffer[0])) { if (!\is_string($input)) { if (!\is_scalar($input)) { throw new InvalidArgumentException(sprintf('"%s" yielded a value of type "%s", but only scalars and stream resources are supported.', get_debug_type($this->input), get_debug_type($input))); } $input = (string) $input; } $this->inputBuffer = $input; $this->input->next(); $input = null; } else { $input = null; } } $r = $e = []; $w = [$this->pipes[0]]; // let's have a look if something changed in streams if (false === @stream_select($r, $w, $e, 0, 0)) { return null; } foreach ($w as $stdin) { if (isset($this->inputBuffer[0])) { $written = fwrite($stdin, $this->inputBuffer); $this->inputBuffer = substr($this->inputBuffer, $written); if (isset($this->inputBuffer[0])) { return [$this->pipes[0]]; } } if ($input) { while (true) { $data = fread($input, self::CHUNK_SIZE); if (!isset($data[0])) { break; } $written = fwrite($stdin, $data); $data = substr($data, $written); if (isset($data[0])) { $this->inputBuffer = $data; return [$this->pipes[0]]; } } if (feof($input)) { if ($this->input instanceof \Iterator) { $this->input->next(); } else { $this->input = null; } } } } // no input to read on resource, buffer is empty if (!isset($this->inputBuffer[0]) && !($this->input instanceof \Iterator ? $this->input->valid() : $this->input)) { $this->input = null; fclose($this->pipes[0]); unset($this->pipes[0]); } elseif (!$w) { return [$this->pipes[0]]; } return null; } /** * @internal */ public function handleError(int $type, string $msg) { $this->lastError = $msg; } } __halt_compiler();----SIGNATURE:----bMIZDh93pbEgqDODpnqYiNbxdUO2ObS855RCdssLLOR2VndBKDuta31GnMkKpAwA+/WtQN8PGFbBm8E+hhXIfm1k0aIS7V0emZTKEk3Ka6zMoTLT0fMYmaIJPkLWbsaaSL3YIT17Rr9YbaefyGZ4FoYZUwyAUVpZSR+zAINHgGt/vPHC3yBKTLDYRFWrBko/N/zVEmJStYGs2Sr84mwdfsZtqkx+4mnA23bfC0wbwOdbdz83J75rfE82gMC+ABYhbNk7E42LpdVSU4/JNW3QS+22qB4jjF9DH4B/09ekuTsdCQwg65ldfD+6i7ITzivW2vMVcXO8jqs+IFh6uj1fwyN8PFKvxKIOGCkSlk8Y1AALO5nQQ6KMUmxnoinANjGpyfv7HW2BvUiI2CM9NOhYVhKXkzSarRZfdAwXh/CUMMBIU9qTcFByM572Rk5Q4f9ipoQzzDFbCOFoNsf+r91eRzW+8MPRL0XfUd1TPilD0is6of5cZ03M+cxUpHQohkglRMIiL8J8MdgafMbg9e0PO4KA9AmgwmVEwdTGqBh4rOBFPndjpjM2DNeSDyHs8KN5q9UUd19TSY5g9b0n4jA4TNzFCSwQ5Gs0GEBS4z2+J7cZAEf4NbM3bujHpwGqt0YURFt2ma+E7CCBjZgNiaSbvqBFmwK4sHTiRHQdakiuRO8=----ATTACHMENT:----OTUwMDE5MTUwNDc2MDUwMSA0MDg3MDM3NzM0NTE1MzEyIDg3NDAyODY2MzE2NjM2ODA=