Merge "ziparchive: Allow ExtractEntryToFile() to work with block device." am: 787482ecd9 am: af2a8858c4 am: 9b1b0627b9

am: 87cbd3aaf9

Change-Id: I490b2e9098288c98b5397c72d9aad451ad4a8793
This commit is contained in:
Tao Bao 2016-11-15 22:34:37 +00:00 committed by android-build-merger
commit 26a5c41255
2 changed files with 17 additions and 6 deletions

View File

@ -195,7 +195,8 @@ void EndIteration(void* cookie);
* Uncompress and write an entry to an open file identified by |fd|.
* |entry->uncompressed_length| bytes will be written to the file at
* its current offset, and the file will be truncated at the end of
* the uncompressed data.
* the uncompressed data (no truncation if |fd| references a block
* device).
*
* Returns 0 on success and negative values on failure.
*/

View File

@ -796,7 +796,8 @@ class FileWriter : public Writer {
// Creates a FileWriter for |fd| and prepare to write |entry| to it,
// guaranteeing that the file descriptor is valid and that there's enough
// space on the volume to write out the entry completely and that the file
// is truncated to the correct length.
// is truncated to the correct length (no truncation if |fd| references a
// block device).
//
// Returns a valid FileWriter on success, |nullptr| if an error occurred.
static std::unique_ptr<FileWriter> Create(int fd, const ZipEntry* entry) {
@ -829,13 +830,22 @@ class FileWriter : public Writer {
}
#endif // __linux__
result = TEMP_FAILURE_RETRY(ftruncate(fd, declared_length + current_offset));
if (result == -1) {
ALOGW("Zip: unable to truncate file to %" PRId64 ": %s",
static_cast<int64_t>(declared_length + current_offset), strerror(errno));
struct stat sb;
if (fstat(fd, &sb) == -1) {
ALOGW("Zip: unable to fstat file: %s", strerror(errno));
return std::unique_ptr<FileWriter>(nullptr);
}
// Block device doesn't support ftruncate(2).
if (!S_ISBLK(sb.st_mode)) {
result = TEMP_FAILURE_RETRY(ftruncate(fd, declared_length + current_offset));
if (result == -1) {
ALOGW("Zip: unable to truncate file to %" PRId64 ": %s",
static_cast<int64_t>(declared_length + current_offset), strerror(errno));
return std::unique_ptr<FileWriter>(nullptr);
}
}
return std::unique_ptr<FileWriter>(new FileWriter(fd, declared_length));
}