diff options
-rw-r--r-- | aidl/android/gsi/IGsiService.aidl | 4 | ||||
-rw-r--r-- | gsi_service.cpp | 8 | ||||
-rw-r--r-- | gsi_service.h | 6 | ||||
-rw-r--r-- | gsi_tool.cpp | 4 |
4 files changed, 13 insertions, 9 deletions
diff --git a/aidl/android/gsi/IGsiService.aidl b/aidl/android/gsi/IGsiService.aidl index fea9507..09e2d79 100644 --- a/aidl/android/gsi/IGsiService.aidl +++ b/aidl/android/gsi/IGsiService.aidl @@ -16,6 +16,8 @@ package android.gsi; +import android.os.ParcelFileDescriptor; + /** {@hide} */ interface IGsiService { /** @@ -34,7 +36,7 @@ interface IGsiService { * @param bytes Number of bytes that can be read from stream. * @return true on success, false otherwise. */ - boolean commitGsiChunkFromStream(FileDescriptor stream, long bytes); + boolean commitGsiChunkFromStream(in ParcelFileDescriptor stream, long bytes); /** * Write bytes from memory to the on-disk GSI. diff --git a/gsi_service.cpp b/gsi_service.cpp index 7e7f827..6d8df25 100644 --- a/gsi_service.cpp +++ b/gsi_service.cpp @@ -81,11 +81,11 @@ binder::Status GsiService::startGsiInstall(int64_t gsiSize, int64_t userdataSize return binder::Status::ok(); } -binder::Status GsiService::commitGsiChunkFromStream(const android::base::unique_fd& stream, +binder::Status GsiService::commitGsiChunkFromStream(const android::os::ParcelFileDescriptor& stream, int64_t bytes, bool* _aidl_return) { std::lock_guard<std::mutex> guard(main_lock_); - *_aidl_return = CommitGsiChunk(stream, bytes); + *_aidl_return = CommitGsiChunk(stream.get(), bytes); return binder::Status::ok(); } @@ -251,7 +251,7 @@ fiemap_writer::FiemapUniquePtr GsiService::CreateFiemapWriter(const std::string& return file; } -bool GsiService::CommitGsiChunk(const android::base::unique_fd& stream, int64_t bytes) { +bool GsiService::CommitGsiChunk(int stream_fd, int64_t bytes) { if (bytes < 0) { LOG(ERROR) << "chunk size " << bytes << " is negative"; return false; @@ -263,7 +263,7 @@ bool GsiService::CommitGsiChunk(const android::base::unique_fd& stream, int64_t while (remaining) { // :TODO: check file pin status! size_t max_to_read = std::min(system_block_size_, remaining); - ssize_t rv = TEMP_FAILURE_RETRY(read(stream, buffer.get(), max_to_read)); + ssize_t rv = TEMP_FAILURE_RETRY(read(stream_fd, buffer.get(), max_to_read)); if (rv < 0) { LOG(ERROR) << "read: " << strerror(errno); return false; diff --git a/gsi_service.h b/gsi_service.h index c7e7784..1b20fd6 100644 --- a/gsi_service.h +++ b/gsi_service.h @@ -38,8 +38,8 @@ class GsiService : public BinderService<GsiService>, public BnGsiService { binder::Status startGsiInstall(int64_t gsiSize, int64_t userdataSize, bool* _aidl_return) override; - binder::Status commitGsiChunkFromStream(const ::android::base::unique_fd& stream, int64_t bytes, - bool* _aidl_return) override; + binder::Status commitGsiChunkFromStream(const ::android::os::ParcelFileDescriptor& stream, + int64_t bytes, bool* _aidl_return) override; binder::Status commitGsiChunkFromMemory(const ::std::vector<uint8_t>& bytes, bool* _aidl_return) override; binder::Status setGsiBootable(bool* _aidl_return) override; @@ -56,7 +56,7 @@ class GsiService : public BinderService<GsiService>, public BnGsiService { bool PerformSanityChecks(); bool PreallocateFiles(); bool FormatUserdata(); - bool CommitGsiChunk(const android::base::unique_fd& stream, int64_t bytes); + bool CommitGsiChunk(int stream_fd, int64_t bytes); bool CommitGsiChunk(const void* data, size_t bytes); bool SetGsiBootable(); bool RemoveGsiInstall(); diff --git a/gsi_tool.cpp b/gsi_tool.cpp index fec0265..24f83a8 100644 --- a/gsi_tool.cpp +++ b/gsi_tool.cpp @@ -106,7 +106,9 @@ static int Install(sp<IGsiService> gsid, int argc, char** argv) { return EX_SOFTWARE; } - status = gsid->commitGsiChunkFromStream(input, gsi_size, &ok); + android::os::ParcelFileDescriptor stream(std::move(input)); + + status = gsid->commitGsiChunkFromStream(stream, gsi_size, &ok); if (!status.isOk() || !ok) { std::cout << "Could not commit live image data"; return EX_SOFTWARE; |