summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--aidl/android/gsi/IGsiService.aidl4
-rw-r--r--gsi_service.cpp8
-rw-r--r--gsi_service.h6
-rw-r--r--gsi_tool.cpp4
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;