summaryrefslogtreecommitdiffstats
path: root/install.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'install.cpp')
-rw-r--r--install.cpp60
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;
}