<?php include __DIR__ . "/mcast_helpers.php.inc"; $path = __DIR__ . "/unix_sock"; @unlink($path); echo "creating send socket\n"; $sends1 = socket_create(AF_UNIX, SOCK_DGRAM, 0) or die("err"); var_dump($sends1); socket_set_nonblock($sends1) or die("Could not put in non-blocking mode"); echo "creating receive socket\n"; $s = socket_create(AF_UNIX, SOCK_DGRAM, 0) or die("err"); var_dump($s); $br = socket_bind($s, $path) or die("err"); var_dump($br); socket_set_nonblock($s) or die("Could not put in non-blocking mode"); $r = socket_sendmsg($sends1, ["name" => ["path" => $path], "iov" => ["test ", "thing", "\n"], "control" => [["level" => SOL_SOCKET, "type" => SCM_RIGHTS, "data" => [$sends1, STDIN, STDOUT, STDERR]]]], 0); var_dump($r); checktimeout($s, 500); $data = ["name" => [], "buffer_size" => 2000, "controllen" => socket_cmsg_space(SOL_SOCKET, SCM_RIGHTS, 3)]; var_dump($data); if (!socket_recvmsg($s, $data, 0)) { die("recvmsg"); } print_r($data); error_reporting(0); $path = __DIR__ . "/unix_sock"; @unlink($path);
<?php include __DIR__ . "/mcast_helpers.php.inc"; $addr = '::1'; echo "creating send socket\n"; $sends1 = socket_create(AF_INET6, SOCK_DGRAM, SOL_UDP) or die("err"); var_dump($sends1); $br = socket_bind($sends1, '::', 7001) or die("err"); var_dump($br); socket_set_nonblock($sends1) or die("Could not put in non-blocking mode"); echo "creating receive socket\n"; $s = socket_create(AF_INET6, SOCK_DGRAM, SOL_UDP) or die("err"); var_dump($s); $br = socket_bind($s, '::0', 3000) or die("err"); var_dump($br); socket_set_option($s, IPPROTO_IPV6, IPV6_RECVPKTINFO, 1) or die("err"); socket_set_option($s, IPPROTO_IPV6, IPV6_RECVTCLASS, 1) or die("err"); $r = socket_sendmsg($sends1, ["name" => ["addr" => "::1", "port" => 3000], "iov" => ["test ", "thing", "\n"], "control" => [["level" => IPPROTO_IPV6, "type" => IPV6_PKTINFO, "data" => ['addr' => '::1', 'ifindex' => 1]]]], 0); var_dump($r); checktimeout($s, 500); $data = ["name" => ["family" => AF_INET6, "addr" => "::1"], "buffer_size" => 2000, "controllen" => socket_cmsg_space(IPPROTO_IPV6, IPV6_PKTINFO) + socket_cmsg_space(IPPROTO_IPV6, IPV6_TCLASS)]; if (!socket_recvmsg($s, $data, 0)) { die("recvmsg"); } print_r($data);
/** * sd_pid_notify_with_fds PHP implementation * * @param int $pid FIXME currently not usable! * @param bool $unset_environment * @param string $state * @param array $fds * * @return int * * @link https://github.com/systemd/systemd/blob/master/src/libsystemd/sd-daemon/sd-daemon.c */ function sd_pid_notify_with_fds($pid, $unset_environment, $state, array $fds) { $state = trim($state); if ('' === $state) { $r = -EINVAL; goto finish; } $e = getenv('NOTIFY_SOCKET'); if (!$e) { return 0; } /* Must be an abstract socket, or an absolute path */ if (strlen($e) < 2 || strpos($e, '@') !== 0 && strpos($e, '/') !== 0) { $r = -EINVAL; goto finish; } $fd = socket_create(AF_UNIX, SOCK_DGRAM, 0); if (!$fd) { $r = -1 * socket_last_error(); goto finish; } $msghdr = ['name' => ['path' => $e], 'iov' => [$state . "\n"], 'control' => []]; if (strpos($msghdr['name']['path'], '@') === 0) { $msghdr['name'][0] = ""; } $pid = (int) $pid; $have_pid = $pid && getmypid() !== $pid; if (count($fds) > 0 || $have_pid) { if (count($fds)) { $msghdr['control'][] = ['level' => SOL_SOCKET, 'type' => SCM_RIGHTS, 'data' => $fds]; } if ($have_pid) { $msghdr['control'][] = ['level' => SOL_SOCKET, 'type' => SCM_CREDENTIALS, 'data' => ['pid' => $pid, 'uid' => getmyuid(), 'gid' => getmygid()]]; } } /* First try with fake ucred data, as requested */ if (@socket_sendmsg($fd, $msghdr, MSG_NOSIGNAL) !== false) { $r = 1; goto finish; } /* If that failed, try with our own ucred instead */ if ($have_pid) { $msghdr['control'] = []; if (@socket_sendmsg($fd, $msghdr, MSG_NOSIGNAL) !== false) { $r = 1; goto finish; } } $r = -1 * socket_last_error($fd); finish: if (isset($fd) && $fd) { socket_close($fd); } if ($unset_environment) { putenv('NOTIFY_SOCKET'); } return $r; }
<?php include __DIR__ . "/mcast_helpers.php.inc"; $path = "/bar_foo"; echo "creating send socket\n"; $sends1 = socket_create(AF_UNIX, SOCK_DGRAM, 0) or die("err"); socket_set_nonblock($sends1) or die("Could not put in non-blocking mode"); echo "creating receive socket\n"; $s = socket_create(AF_UNIX, SOCK_DGRAM, 0) or die("err"); socket_bind($s, $path) or die("err"); $r = socket_sendmsg($sends1, ["name" => ["path" => $path], "iov" => ["test ", "thing", "\n"]], 0); var_dump($r); checktimeout($s, 500); if (!socket_recv($s, $buf, 20, 0)) { die("recv"); } print_r($buf);
<?php include __DIR__ . "/mcast_helpers.php.inc"; $addr = '::1'; echo "creating send socket\n"; $sends1 = socket_create(AF_INET6, SOCK_DGRAM, SOL_UDP) or die("err"); var_dump($sends1); $br = socket_bind($sends1, '::', 7001) or die("err"); var_dump($br); socket_set_nonblock($sends1) or die("Could not put in non-blocking mode"); echo "creating receive socket\n"; $s = socket_create(AF_INET6, SOCK_DGRAM, SOL_UDP) or die("err"); var_dump($s); $br = socket_bind($s, '::0', 3000) or die("err"); var_dump($br); socket_set_option($s, IPPROTO_IPV6, IPV6_RECVPKTINFO, 1) or die("err"); socket_set_option($s, IPPROTO_IPV6, IPV6_RECVTCLASS, 1) or die("err"); $r = socket_sendmsg($sends1, ["name" => ["addr" => "::1", "port" => 3000], "iov" => ["test ", "thing", "\n"], "control" => [["level" => IPPROTO_IPV6, "type" => IPV6_TCLASS, "data" => 40]]], 0); var_dump($r); checktimeout($s, 500); $data = ["name" => ["family" => AF_INET6, "addr" => "::1"], "buffer_size" => 2000, "controllen" => socket_cmsg_space(IPPROTO_IPV6, IPV6_PKTINFO) + socket_cmsg_space(IPPROTO_IPV6, IPV6_TCLASS)]; if (!socket_recvmsg($s, $data, 0)) { die("recvmsg"); } print_r($data);
/** * Send a message * * @param resource $socket * @param array $message * @param int $flags * * @return int */ public function socketSendmsg($socket, array $message, int $flags) : int { return socket_sendmsg($socket, $message, $flags); }
<?php include __DIR__ . "/mcast_helpers.php.inc"; $path = "/foo_bar"; echo "creating server socket\n"; $servers = socket_create(AF_UNIX, SOCK_STREAM, 0) or die("err"); socket_bind($servers, $path) or die("Could not bind"); socket_listen($servers) or die("Could not listen"); socket_set_nonblock($servers) or die("Could not put in non-blocking mode"); echo "creating client socket\n"; $clients = socket_create(AF_UNIX, SOCK_STREAM, 0) or die("err"); socket_connect($clients, $path) or die("Error connecting"); $conns = socket_accept($servers) or die("Could not accept connection"); $r = socket_sendmsg($clients, ["iov" => ["test ", "thing", "\n"]], 0); var_dump($r); checktimeout($conns, 500); if (!socket_recv($conns, $buf, 20, 0)) { die("recv"); } print_r($buf);
/** * Send a message (undocumented on PHP.net) * * @param array $message [description] * @param int $flags [description] * @return int */ public final function socketSendmsg(array $message, $flags) { return socket_sendmsg($this->socket, $message, $flags); }
/** * (PHP 5 >=5.5.0)<br/> * Send a message * * @link http://www.php.net/manual/en/function.socket-sendmsg.php * * @param resource $socket * @param array $message * @param int $flags * * @return int */ public function sendMessage($socket, array $message, $flags) { return socket_sendmsg($socket, $message, $flags); }