Skip to content

Commit

Permalink
Automated rollback of commit 4ae281b.
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 567287128
Change-Id: Ia12646e9ad1ebc94f6e26ae1b893b885c0908ca9
  • Loading branch information
Sandboxed API Team authored and copybara-github committed Sep 21, 2023
1 parent 4ae281b commit ee7b76f
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 0 deletions.
54 changes: 54 additions & 0 deletions sandboxed_api/sandbox2/comms.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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);
Expand All @@ -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
Expand All @@ -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;

Expand Down
20 changes: 20 additions & 0 deletions sandboxed_api/sandbox2/comms.h
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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();
Expand Down
8 changes: 8 additions & 0 deletions sandboxed_api/sandbox2/comms_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit ee7b76f

Please sign in to comment.