1--TEST-- 2recvmsg(): receive SCM_CREDENTIALS messages 3--SKIPIF-- 4<?php 5if (!extension_loaded('sockets')) { 6die('skip sockets extension not available.'); 7} 8if (strtolower(substr(PHP_OS, 0, 3)) == 'win') { 9die('skip not for Microsoft Windows'); 10} 11if (strtolower(substr(PHP_OS, 0, 3)) == 'aix') { 12die('skip not for AIX'); 13} 14--FILE-- 15<?php 16include __DIR__."/mcast_helpers.php.inc"; 17$path = sys_get_temp_dir() . "/socket_cmsg_rights.sock"; 18 19@unlink($path); 20 21echo "creating send socket\n"; 22$sends1 = socket_create(AF_UNIX, SOCK_DGRAM, 0) or die("err"); 23var_dump($sends1); 24socket_set_nonblock($sends1) or die("Could not put in non-blocking mode"); 25 26echo "creating receive socket\n"; 27$s = socket_create(AF_UNIX, SOCK_DGRAM, 0) or die("err"); 28var_dump($s); 29$br = socket_bind($s, $path) or die("err"); 30var_dump($br); 31socket_set_nonblock($s) or die("Could not put in non-blocking mode"); 32 33$r = socket_sendmsg($sends1, [ 34 "name" => [ "path" => $path ], 35 "iov" => ["test ", "thing", "\n"], 36 "control" => [ 37 [ 38 "level" => SOL_SOCKET, 39 "type" => SCM_RIGHTS, 40 "data" => [$sends1, STDIN, STDOUT, STDERR], 41 ] 42 ] 43], 0); 44var_dump($r); 45checktimeout($s, 500); 46 47$data = [ 48 "name" => [], 49 "buffer_size" => 2000, 50 "controllen" => socket_cmsg_space(SOL_SOCKET, SCM_RIGHTS, 4) 51]; 52var_dump($data); 53if (!socket_recvmsg($s, $data, 0)) die("recvmsg"); 54 55if ($data["control"]) { 56 $control = $data["control"][0]; 57 if ($control["level"] == SOL_SOCKET && 58 $control["type"] == SCM_RIGHTS) { 59 foreach ($control["data"] as $resource) { 60 if (!is_resource($resource)) { 61 echo "FAIL RES\n"; 62 var_dump($data); 63 exit; 64 } 65 } 66 echo "OK"; 67 } else { 68 echo "FAIL RIGHTS\n"; 69 var_dump($data); 70 exit; 71 } 72} else { 73 echo "FAIL CONTROL\n"; 74 var_dump($data); 75} 76?> 77--CLEAN-- 78<?php 79$path = sys_get_temp_dir() . "/socket_cmsg_rights.sock"; 80@unlink($path); 81--EXPECTF-- 82creating send socket 83object(Socket)#%d (0) { 84} 85creating receive socket 86object(Socket)#%d (0) { 87} 88bool(true) 89int(11) 90array(3) { 91 ["name"]=> 92 array(0) { 93 } 94 ["buffer_size"]=> 95 int(2000) 96 ["controllen"]=> 97 int(%d) 98} 99OK 100