| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/virtualization/lib/grpc/grpc_vsock_stub.h" |
| |
| #include <lib/fit/bridge.h> |
| #include <lib/syslog/cpp/macros.h> |
| |
| #include "src/virtualization/lib/grpc/fdio_util.h" |
| |
| fit::promise<zx::socket, zx_status_t> ConnectToGrpcVsockService( |
| const fuchsia::virtualization::HostVsockEndpointPtr& socket_endpoint, uint32_t cid, |
| uint32_t port) { |
| // Create the socket for the connection. |
| zx::socket h1, h2; |
| zx_status_t status = zx::socket::create(ZX_SOCKET_STREAM, &h1, &h2); |
| if (status != ZX_OK) { |
| FX_LOGS(ERROR) << "Failed to create socket"; |
| return fit::make_result_promise<zx::socket, zx_status_t>(fit::error(status)); |
| } |
| |
| // Establish connection, hand first socket endpoint over to the guest. |
| fit::bridge<zx::socket, zx_status_t> bridge; |
| socket_endpoint->Connect( |
| cid, port, std::move(h1), |
| [completer = std::move(bridge.completer), h2 = std::move(h2)](zx_status_t status) mutable { |
| if (status != ZX_OK) { |
| FX_LOGS(ERROR) << "Failed to connect: " << status; |
| completer.complete_error(status); |
| } else { |
| completer.complete_ok(std::move(h2)); |
| } |
| }); |
| return bridge.consumer.promise(); |
| } |