1--TEST--
2proc_open() with output socketpairs
3--FILE--
4<?php
5
6$cmd = [
7    getenv("TEST_PHP_EXECUTABLE"),
8    __DIR__ . '/proc_open_sockets1.inc'
9];
10
11$spec = [
12    ['null'],
13    ['socket'],
14    ['socket']
15];
16
17$proc = proc_open($cmd, $spec, $pipes);
18
19foreach ($pipes as $pipe) {
20    var_dump(stream_set_blocking($pipe, false));
21}
22
23while ($pipes) {
24    $r = $pipes;
25    $w = null;
26    $e = null;
27
28    if (!stream_select($r, $w, $e, null, 0)) {
29        throw new Error("Select failed");
30    }
31
32    foreach ($r as $i => $pipe) {
33        if (!is_resource($pipe) || feof($pipe)) {
34            unset($pipes[$i]);
35            continue;
36        }
37
38        $chunk = @fread($pipe, 8192);
39
40        if ($chunk === false) {
41            throw new Error("Failed to read: " . (error_get_last()['message'] ?? 'N/A'));
42        }
43
44        if ($chunk !== '') {
45            echo "PIPE {$i} << {$chunk}\n";
46        }
47    }
48}
49
50?>
51--EXPECTF--
52bool(true)
53bool(true)
54PIPE 1 << hello
55PIPE 2 << SOME ERROR
56PIPE 1 << world
57