async function socket_create_bind_listen_async()

in src/network/_Private/socket_create_bind_listen_async.php [17:51]


async function socket_create_bind_listen_async(
  OS\SocketDomain $domain,
  OS\SocketType $type,
  int $proto,
  OS\sockaddr $addr,
  int $backlog,
  Network\SocketOptions $socket_options,
): Awaitable<OS\FileDescriptor> {
  $sock = OS\socket($domain, $type, $proto);

  if ($socket_options['SO_REUSEADDR'] ?? false) {
    _OS\wrap_impl(
      () ==> _OS\setsockopt_int($sock, _OS\SOL_SOCKET, _OS\SO_REUSEADDR, 1),
    );
  }
  $ops = OS\fcntl($sock, OS\FcntlOp::F_GETFL);
  OS\fcntl($sock, OS\FcntlOp::F_SETFL, ($ops as int) | OS\O_NONBLOCK);

  try {
    OS\bind($sock, $addr);
  } catch (OS\BlockingIOException $_) {
    await _OS\poll_async($sock, \STREAM_AWAIT_READ_WRITE, /* timeout = */ 0);

    $errno = _OS\wrap_impl(
      () ==> _OS\getsockopt_int($sock, _OS\SOL_SOCKET, _OS\SO_ERROR),
    ) as OS\Errno;
    if ($errno !== 0) {
      _OS\throw_errno($errno, 'bind() failed');
    }
  }

  OS\listen($sock, $backlog);

  return $sock;
}