// Copyright 2019 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // The sandbox2::IPC class provides routines for exchanging data between sandbox // and the sandboxee. #ifndef SANDBOXED_API_SANDBOX2_IPC_H_ #define SANDBOXED_API_SANDBOX2_IPC_H_ #include #include #include #include #include "absl/strings/string_view.h" #include "sandboxed_api/sandbox2/comms.h" namespace sandbox2 { class IPC final { public: IPC() = default; IPC(const IPC&) = delete; IPC& operator=(const IPC&) = delete; ~IPC() { InternalCleanupFdMap(); } ABSL_DEPRECATED("Use Sandbox2::comms() instead") Comms* comms() const { return comms_.get(); } // Marks local_fd so that it should be sent to the remote process (sandboxee), // and duplicated onto remote_fd in it. The local_fd will be closed after // being sent (in SendFdsOverComms() which is called by the Monitor class when // Sandbox2::RunAsync() is called), so local_fd should not be used from that // point on. The application must not close local_fd after calling MapFd(). void MapFd(int local_fd, int remote_fd); // Similar to MapFd(), except local_fd remains available for use in the // application even after Sandbox2::RunAsync() is called; the application // retains responsibility for closing local_fd and may do so at any time after // calling MapDupedFd(). void MapDupedFd(int local_fd, int remote_fd); // Creates and returns a socketpair endpoint. The other endpoint of the // socketpair is marked as to be sent to the remote process (sandboxee) with // SendFdsOverComms() as with MapFd(). // If a name is specified, uses the Client::GetMappedFD api to retrieve the // corresponding file descriptor in the sandboxee. int ReceiveFd(int remote_fd, absl::string_view name); int ReceiveFd(int remote_fd); int ReceiveFd(absl::string_view name); // Enable sandboxee logging, this will start a thread that waits for log // messages from the sandboxee. You'll also have to call // Client::SendLogsToSupervisor in the sandboxee. void EnableLogServer(); private: friend class Executor; friend class MonitorBase; friend class IpcPeer; // For testing // Uses a pre-connected file descriptor. void SetUpServerSideComms(int fd); // Sends file descriptors to the sandboxee. Close the local FDs (e.g. passed // in MapFd()) - they cannot be used anymore. bool SendFdsOverComms(); void InternalCleanupFdMap(); // Tuple of file descriptor pairs which will be sent to the sandboxee: in the // form of tuple: // local_fd: local fd which should be sent to sandboxee // remote_fd: it will be overwritten by local_fd. std::vector> fd_map_; // Comms channel used to exchange data with the sandboxee. std::unique_ptr comms_; }; } // namespace sandbox2 #endif // SANDBOXED_API_SANDBOX2_IPC_H_