Exemple #1
1
<?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);
Exemple #3
0
/**
 * 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);
Exemple #8
0
 /**
  * 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);
 }
Exemple #9
0
 /**
  * (PHP 5 &gt;=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);
 }