Use libcuttlefish_utils' Proxy for ADB

Bug: 222749636
Test: locally
Change-Id: I55e87972474f6f0dd8bfe15b10e84c6d5f090f37
diff --git a/common/frontend/socket_vsock_proxy/Android.bp b/common/frontend/socket_vsock_proxy/Android.bp
index f04251b..427d9c2 100644
--- a/common/frontend/socket_vsock_proxy/Android.bp
+++ b/common/frontend/socket_vsock_proxy/Android.bp
@@ -33,6 +33,7 @@
     ],
     static_libs: [
         "libgflags",
+        "libcuttlefish_utils",
     ],
     target: {
         host: {
diff --git a/common/frontend/socket_vsock_proxy/main.cpp b/common/frontend/socket_vsock_proxy/main.cpp
index cf68821..5d08790 100644
--- a/common/frontend/socket_vsock_proxy/main.cpp
+++ b/common/frontend/socket_vsock_proxy/main.cpp
@@ -15,19 +15,17 @@
  */
 
 #include <set>
-#include <thread>
 #include <android-base/logging.h>
 #include <gflags/gflags.h>
 
 #include "common/libs/fs/shared_fd.h"
+#include "common/libs/utils/socket2socket_proxy.h"
 #include "host/commands/kernel_log_monitor/utils.h"
 
 #ifdef CUTTLEFISH_HOST
 #include "host/libs/config/logging.h"
 #endif // CUTTLEFISH_HOST
 
-constexpr std::size_t kMaxPacketSize = 8192;
-
 DEFINE_string(server, "",
               "The type of server to host, `vsock` or `tcp`. When hosting a server "
               "of one type, the proxy will take inbound connections of this type and "
@@ -46,109 +44,6 @@
     "server and the corresponding port flag will be ignored");
 
 namespace {
-// Sends packets, Shutdown(SHUT_WR) on destruction
-class SocketSender {
- public:
-  explicit SocketSender(cuttlefish::SharedFD socket) : socket_{socket} {}
-
-  SocketSender(SocketSender&&) = default;
-  SocketSender& operator=(SocketSender&&) = default;
-
-  SocketSender(const SocketSender&&) = delete;
-  SocketSender& operator=(const SocketSender&) = delete;
-
-  ~SocketSender() {
-    if (socket_.operator->()) {  // check that socket_ was not moved-from
-      socket_->Shutdown(SHUT_WR);
-    }
-  }
-
-  ssize_t SendAll(const char* packet, ssize_t length) {
-    ssize_t written{};
-    while (written < length) {
-      if (!socket_->IsOpen()) {
-        return -1;
-      }
-      auto just_written =
-          socket_->Send(packet + written,
-                        length - written, MSG_NOSIGNAL);
-      if (just_written <= 0) {
-        LOG(WARNING) << "Couldn't write to client: "
-                     << strerror(socket_->GetErrno());
-        return just_written;
-      }
-      written += just_written;
-    }
-    return written;
-  }
-
- private:
-  cuttlefish::SharedFD socket_;
-};
-
-class SocketReceiver {
- public:
-  explicit SocketReceiver(cuttlefish::SharedFD socket) : socket_{socket} {}
-
-  SocketReceiver(SocketReceiver&&) = default;
-  SocketReceiver& operator=(SocketReceiver&&) = default;
-
-  SocketReceiver(const SocketReceiver&&) = delete;
-  SocketReceiver& operator=(const SocketReceiver&) = delete;
-
-  // return value will be 0 if Read returns 0 or error
-  ssize_t Recv(char* packet, ssize_t length) {
-    auto size = socket_->Read(packet, length);
-    if (size < 0) {
-      size = 0;
-    }
-
-    return size;
-  }
-
- private:
-  cuttlefish::SharedFD socket_;
-};
-
-void SocketToVsock(SocketReceiver socket_receiver,
-                   SocketSender vsock_sender) {
-  char packet[kMaxPacketSize] = {};
-
-  while (true) {
-    ssize_t length = socket_receiver.Recv(packet, kMaxPacketSize);
-    if (length == 0 || vsock_sender.SendAll(packet, length) < 0) {
-      break;
-    }
-  }
-  LOG(DEBUG) << "Socket to vsock exiting";
-}
-
-void VsockToSocket(SocketSender socket_sender,
-                   SocketReceiver vsock_receiver) {
-  char packet[kMaxPacketSize] = {};
-
-  while (true) {
-    ssize_t length = vsock_receiver.Recv(packet, kMaxPacketSize);
-    if (length == 0) {
-      break;
-    }
-    if (socket_sender.SendAll(packet, length) < 0) {
-      break;
-    }
-  }
-  LOG(DEBUG) << "Vsock to socket exiting";
-}
-
-// One thread for reading from shm and writing into a socket.
-// One thread for reading from a socket and writing into shm.
-void HandleConnection(cuttlefish::SharedFD vsock,
-                      cuttlefish::SharedFD socket) {
-  auto socket_to_vsock =
-      std::thread(SocketToVsock, SocketReceiver{socket}, SocketSender{vsock});
-  VsockToSocket(SocketSender{socket}, SocketReceiver{vsock});
-  socket_to_vsock.join();
-}
-
 void WaitForAdbdToBeStarted(int events_fd) {
   auto evt_shared_fd = cuttlefish::SharedFD::Dup(events_fd);
   close(events_fd);
@@ -170,7 +65,7 @@
 }
 
 // intented to run as cuttlefish host service
-[[noreturn]] void TcpServer() {
+void TcpServer() {
   LOG(DEBUG) << "starting TCP server on " << FLAGS_tcp_port
              << " for vsock port " << FLAGS_vsock_port;
   cuttlefish::SharedFD server;
@@ -184,10 +79,8 @@
   CHECK(server->IsOpen()) << "Could not start server on " << FLAGS_tcp_port;
   LOG(DEBUG) << "Accepting client connections";
   int last_failure_reason = 0;
-  while (true) {
-    auto client_socket = cuttlefish::SharedFD::Accept(*server);
-    CHECK(client_socket->IsOpen()) << "error creating client socket";
-    cuttlefish::SharedFD vsock_socket = cuttlefish::SharedFD::VsockClient(
+  cuttlefish::Proxy(server, [&last_failure_reason]() {
+    auto vsock_socket = cuttlefish::SharedFD::VsockClient(
         FLAGS_vsock_cid, FLAGS_vsock_port, SOCK_STREAM);
     if (vsock_socket->IsOpen()) {
       last_failure_reason = 0;
@@ -200,12 +93,9 @@
         LOG(ERROR) << "Unable to connect to vsock server: "
                    << vsock_socket->StrError();
       }
-      continue;
     }
-    auto thread = std::thread(HandleConnection, std::move(vsock_socket),
-                              std::move(client_socket));
-    thread.detach();
-  }
+    return vsock_socket;
+  });
 }
 
 cuttlefish::SharedFD OpenSocketConnection() {
@@ -232,7 +122,7 @@
 }
 
 // intended to run inside Android guest
-[[noreturn]] void VsockServer() {
+void VsockServer() {
   LOG(DEBUG) << "Starting vsock server on " << FLAGS_vsock_port;
   cuttlefish::SharedFD vsock;
   if (FLAGS_server_fd < 0) {
@@ -248,17 +138,12 @@
     close(FLAGS_server_fd);
   }
   CHECK(vsock->IsOpen()) << "Could not start server on " << FLAGS_vsock_port;
-  while (true) {
-    LOG(DEBUG) << "waiting for vsock connection";
-    auto vsock_client = cuttlefish::SharedFD::Accept(*vsock);
-    CHECK(vsock_client->IsOpen()) << "error creating vsock socket";
+  cuttlefish::Proxy(vsock, []() {
     LOG(DEBUG) << "vsock socket accepted";
     auto client = OpenSocketConnection();
     CHECK(client->IsOpen()) << "error connecting to guest client";
-    auto thread = std::thread(HandleConnection, std::move(vsock_client),
-                              std::move(client));
-    thread.detach();
-  }
+    return client;
+  });
 }
 
 }  // namespace