diff options
author | Dees_Troy <dees_troy@teamw.in> | 2013-09-03 21:39:41 +0200 |
---|---|---|
committer | Dees_Troy <dees_troy@teamw.in> | 2013-09-05 15:06:16 +0200 |
commit | 512376ccc75a2564fe8df671e4e05a3b100b5ee5 (patch) | |
tree | 2c435577fc5608f8a63e0e515df3c4dab404e8ee /twinstall.cpp | |
parent | Update to latest AOSP master (diff) | |
download | android_bootable_recovery-512376ccc75a2564fe8df671e4e05a3b100b5ee5.tar android_bootable_recovery-512376ccc75a2564fe8df671e4e05a3b100b5ee5.tar.gz android_bootable_recovery-512376ccc75a2564fe8df671e4e05a3b100b5ee5.tar.bz2 android_bootable_recovery-512376ccc75a2564fe8df671e4e05a3b100b5ee5.tar.lz android_bootable_recovery-512376ccc75a2564fe8df671e4e05a3b100b5ee5.tar.xz android_bootable_recovery-512376ccc75a2564fe8df671e4e05a3b100b5ee5.tar.zst android_bootable_recovery-512376ccc75a2564fe8df671e4e05a3b100b5ee5.zip |
Diffstat (limited to 'twinstall.cpp')
-rw-r--r-- | twinstall.cpp | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/twinstall.cpp b/twinstall.cpp index 041c78d63..8af709915 100644 --- a/twinstall.cpp +++ b/twinstall.cpp @@ -55,13 +55,44 @@ static int Run_Update_Binary(const char *path, ZipArchive *Zip, int* wipe_cache) ret_val = mzExtractZipEntryToFile(Zip, binary_location, binary_fd); close(binary_fd); - mzCloseZipArchive(Zip); if (!ret_val) { + mzCloseZipArchive(Zip); LOGERR("Could not extract '%s'\n", ASSUMED_UPDATE_BINARY_NAME); return INSTALL_ERROR; } + // If exists, extract file_contexts from the zip file + const ZipEntry* selinx_contexts = mzFindZipEntry(Zip, "file_contexts"); + if (selinx_contexts == NULL) { + mzCloseZipArchive(Zip); + LOGINFO("Zip does not contain SELinux file_contexts file in its root.\n"); + } else { + string output_filename = "/file_contexts"; + LOGINFO("Zip contains SELinux file_contexts file in its root. Extracting to %s\n", output_filename.c_str()); + // Delete any file_contexts + if (TWFunc::Path_Exists(output_filename) && unlink(output_filename.c_str()) != 0) { + LOGINFO("Unable to unlink '%s'\n", output_filename.c_str()); + } + + int file_contexts_fd = creat(output_filename.c_str(), 0644); + if (file_contexts_fd < 0) { + mzCloseZipArchive(Zip); + LOGERR("Could not extract file_contexts to '%s'\n", output_filename.c_str()); + return INSTALL_ERROR; + } + + ret_val = mzExtractZipEntryToFile(Zip, selinx_contexts, file_contexts_fd); + close(file_contexts_fd); + + if (!ret_val) { + mzCloseZipArchive(Zip); + LOGERR("Could not extract '%s'\n", ASSUMED_UPDATE_BINARY_NAME); + return INSTALL_ERROR; + } + } + mzCloseZipArchive(Zip); + pipe(pipe_fd); args[0] = Temp_Binary.c_str(); |