chromium/chromecast/net/socket_util.cc

// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chromecast/net/socket_util.h"

#include <sys/socket.h>

#include <utility>

#include "base/logging.h"
#include "net/base/net_errors.h"
#include "net/base/sockaddr_storage.h"
#include "net/socket/socket_posix.h"
#include "net/socket/stream_socket.h"
#include "net/socket/unix_domain_client_socket_posix.h"

namespace chromecast {

bool CreateUnnamedSocketPair(base::ScopedFD* fd1, base::ScopedFD* fd2) {
  int raw_socks[2];
  if (socketpair(AF_UNIX, SOCK_STREAM, 0, raw_socks) == -1) {
    return false;
  }
  fd1->reset(raw_socks[0]);
  fd2->reset(raw_socks[1]);
  return true;
}

std::unique_ptr<net::StreamSocket> AdoptUnnamedSocketHandle(
    base::ScopedFD socket_fd) {
  if (!socket_fd.is_valid()) {
    LOG(ERROR) << "Received invalid socket descriptor: " << socket_fd.get();
    return nullptr;
  }

  net::SockaddrStorage address;
  auto socket_posix = std::make_unique<net::SocketPosix>();
  if (socket_posix->AdoptConnectedSocket(socket_fd.release(), address) !=
      net::OK) {
    LOG(ERROR) << "Cannot adopt connected socket.";
    return nullptr;
  }
  return std::make_unique<net::UnixDomainClientSocket>(std::move(socket_posix));
}

}  // namespace chromecast