diff options
Diffstat (limited to 'install.cpp')
-rw-r--r-- | install.cpp | 60 |
1 files changed, 41 insertions, 19 deletions
diff --git a/install.cpp b/install.cpp index 02c845cb8..e144d9b29 100644 --- a/install.cpp +++ b/install.cpp @@ -30,6 +30,7 @@ #include <string> #include <vector> +#include <android-base/file.h> #include <android-base/parseint.h> #include <android-base/stringprintf.h> #include <android-base/strings.h> @@ -54,6 +55,7 @@ static constexpr const char* AB_OTA_PAYLOAD_PROPERTIES = "payload_properties.txt static constexpr const char* AB_OTA_PAYLOAD = "payload.bin"; #define PUBLIC_KEYS_FILE "/res/keys" static constexpr const char* METADATA_PATH = "META-INF/com/android/metadata"; +static constexpr const char* UNCRYPT_STATUS = "/cache/recovery/uncrypt_status"; // Default allocation of progress bar segments to operations static const int VERIFICATION_PROGRESS_TIME = 60; @@ -371,6 +373,14 @@ try_update_binary(const char* path, ZipArchive* zip, bool* wipe_cache, } pid_t pid = fork(); + + if (pid == -1) { + close(pipefd[0]); + close(pipefd[1]); + LOGE("Failed to fork update binary: %s\n", strerror(errno)); + return INSTALL_ERROR; + } + if (pid == 0) { umask(022); close(pipefd[0]); @@ -511,13 +521,6 @@ install_package(const char* path, bool* wipe_cache, const char* install_file, modified_flash = true; auto start = std::chrono::system_clock::now(); - FILE* install_log = fopen_path(install_file, "w"); - if (install_log) { - fputs(path, install_log); - fputc('\n', install_log); - } else { - LOGE("failed to open last_install: %s\n", strerror(errno)); - } int result; std::vector<std::string> log_buffer; if (setup_install_mounts() != 0) { @@ -526,21 +529,40 @@ install_package(const char* path, bool* wipe_cache, const char* install_file, } else { result = really_install_package(path, wipe_cache, needs_mount, log_buffer, retry_count); } - if (install_log != nullptr) { - fputc(result == INSTALL_SUCCESS ? '1' : '0', install_log); - fputc('\n', install_log); - std::chrono::duration<double> duration = std::chrono::system_clock::now() - start; - int count = static_cast<int>(duration.count()); - // Report the time spent to apply OTA update in seconds. - fprintf(install_log, "time_total: %d\n", count); - fprintf(install_log, "retry: %d\n", retry_count); - - for (const auto& s : log_buffer) { - fprintf(install_log, "%s\n", s.c_str()); + + // Measure the time spent to apply OTA update in seconds. + std::chrono::duration<double> duration = std::chrono::system_clock::now() - start; + int time_total = static_cast<int>(duration.count()); + + if (ensure_path_mounted(UNCRYPT_STATUS) != 0) { + LOGW("Can't mount %s\n", UNCRYPT_STATUS); + } else { + std::string uncrypt_status; + if (!android::base::ReadFileToString(UNCRYPT_STATUS, &uncrypt_status)) { + LOGW("failed to read uncrypt status: %s\n", strerror(errno)); + } else if (!android::base::StartsWith(uncrypt_status, "uncrypt_")) { + LOGW("corrupted uncrypt_status: %s: %s\n", uncrypt_status.c_str(), strerror(errno)); + } else { + log_buffer.push_back(android::base::Trim(uncrypt_status)); } + } - fclose(install_log); + // The first two lines need to be the package name and install result. + std::vector<std::string> log_header = { + path, + result == INSTALL_SUCCESS ? "1" : "0", + "time_total: " + std::to_string(time_total), + "retry: " + std::to_string(retry_count), + }; + std::string log_content = android::base::Join(log_header, "\n") + "\n" + + android::base::Join(log_buffer, "\n"); + if (!android::base::WriteStringToFile(log_content, install_file)) { + LOGE("failed to write %s: %s\n", install_file, strerror(errno)); } + + // Write a copy into last_log. + LOGI("%s\n", log_content.c_str()); + return result; } |