| // 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 |