Automated rollback of commit 4ae281b6a2.

PiperOrigin-RevId: 567287128
Change-Id: Ia12646e9ad1ebc94f6e26ae1b893b885c0908ca9
pull/171/head
Sandboxed API Team 2023-09-21 06:17:00 -07:00 committed by Copybara-Service
parent 4ae281b6a2
commit ee7b76f592
3 changed files with 82 additions and 0 deletions

View File

@ -109,6 +109,9 @@ socklen_t CreateSockaddrUn(const std::string& socket_name, bool abstract_uds,
}
} // namespace
Comms::Comms(const std::string& socket_name, bool abstract_uds)
: name_(socket_name), abstract_uds_(abstract_uds) {}
Comms::Comms(int fd, absl::string_view name) : connection_fd_(fd) {
// Generate a unique and meaningful socket name for this FD.
// Note: getpid()/gettid() are non-blocking syscalls.
@ -160,6 +163,23 @@ absl::Status ListeningComms::Listen() {
return absl::OkStatus();
}
bool Comms::Listen() {
if (IsConnected()) {
return true;
}
absl::StatusOr<ListeningComms> listening_comms =
ListeningComms::Create(name_, abstract_uds_);
if (!listening_comms.ok()) {
SAPI_RAW_LOG(ERROR, "Listening failed: %s",
std::string(listening_comms.status().message()).c_str());
return false;
}
listening_comms_ =
std::make_unique<ListeningComms>(*std::move(listening_comms));
return true;
}
absl::StatusOr<Comms> ListeningComms::Accept() {
sockaddr_un suc;
socklen_t len = sizeof(suc);
@ -177,6 +197,25 @@ absl::StatusOr<Comms> ListeningComms::Accept() {
return Comms(connection_fd, socket_name_);
}
bool Comms::Accept() {
if (IsConnected()) {
return true;
}
if (listening_comms_ == nullptr) {
SAPI_RAW_LOG(ERROR, "Comms::Listen needs to be called first");
return false;
}
absl::StatusOr<Comms> comms = listening_comms_->Accept();
if (!comms.ok()) {
SAPI_RAW_LOG(ERROR, "%s", std::string(comms.status().message()).c_str());
return false;
}
*this = *std::move(comms);
return true;
}
absl::StatusOr<Comms> Comms::Connect(const std::string& socket_name,
bool abstract_uds) {
FDCloser connection_fd(socket(AF_UNIX, SOCK_STREAM, 0)); // Non-blocking
@ -201,6 +240,21 @@ absl::StatusOr<Comms> Comms::Connect(const std::string& socket_name,
return Comms(connection_fd.Release(), socket_name);
}
bool Comms::Connect() {
if (IsConnected()) {
return true;
}
absl::StatusOr<Comms> connected = Connect(name_, abstract_uds_);
if (!connected.ok()) {
SAPI_RAW_LOG(ERROR, "%s",
std::string(connected.status().message()).c_str());
return false;
}
*this = *std::move(connected);
return true;
}
void Comms::Terminate() {
state_ = State::kTerminated;

View File

@ -98,6 +98,12 @@ class Comms {
static absl::StatusOr<Comms> Connect(const std::string& socket_name,
bool abstract_uds = true);
// This object will have to be connected later on.
// When not specified the constructor uses abstract unix domain sockets.
ABSL_DEPRECATED(
"Use ListeningComms or absl::StatusOr<Comms> Connect() instead")
explicit Comms(const std::string& socket_name, bool abstract_uds = true);
Comms(Comms&& other) { *this = std::move(other); }
Comms& operator=(Comms&& other) {
if (this != &other) {
@ -120,6 +126,20 @@ class Comms {
~Comms();
// Binds to an address and make it listen to connections.
ABSL_DEPRECATED("Use ListeningComms::Create() instead")
bool Listen();
// Accepts the connection.
ABSL_DEPRECATED("Use ListeningComms::Accept() instead")
bool Accept();
// Connects to a remote socket.
ABSL_DEPRECATED(
"Use absl::StatusOr<Comms> Comms::Connect(std::string& socket_name, bool "
"abstract_uds) instead")
bool Connect();
// Terminates all underlying file descriptors, and sets the status of the
// Comms object to TERMINATED.
void Terminate();

View File

@ -371,4 +371,12 @@ TEST(CommsTest, TestSendRecvBytes) {
HandleCommunication(a, b);
}
// We cannot test this in the Client or Server tests, as the endpoint needs to
// be unconnected.
TEST(CommsTest, TestMsgSize) {
// There will be no actual connection to this socket.
const std::string socket_name = "sandbox2_comms_msg_size_test";
Comms c(socket_name);
}
} // namespace sandbox2