Loading recovery.cpp +85 −95 Original line number Diff line number Diff line Loading @@ -512,12 +512,11 @@ static void finish_recovery() { sync(); // For good measure. } typedef struct _saved_log_file { char* name; struct stat st; unsigned char* data; struct _saved_log_file* next; } saved_log_file; struct saved_log_file { std::string name; struct stat sb; std::string data; }; static bool erase_volume(const char* volume) { bool is_cache = (strcmp(volume, CACHE_ROOT) == 0); Loading @@ -526,7 +525,7 @@ static bool erase_volume(const char* volume) { ui->SetBackground(RecoveryUI::ERASING); ui->SetProgressType(RecoveryUI::INDETERMINATE); saved_log_file* head = NULL; std::vector<saved_log_file> log_files; if (is_cache) { // If we're reformatting /cache, we load any past logs Loading @@ -536,39 +535,32 @@ static bool erase_volume(const char* volume) { ensure_path_mounted(volume); DIR* d; struct dirent* de; d = opendir(CACHE_LOG_DIR); std::unique_ptr<DIR, decltype(&closedir)> d(opendir(CACHE_LOG_DIR), closedir); if (d) { char path[PATH_MAX]; strcpy(path, CACHE_LOG_DIR); strcat(path, "/"); int path_len = strlen(path); while ((de = readdir(d)) != NULL) { while ((de = readdir(d.get())) != nullptr) { if (strncmp(de->d_name, "last_", 5) == 0 || strcmp(de->d_name, "log") == 0) { saved_log_file* p = (saved_log_file*) malloc(sizeof(saved_log_file)); strcpy(path+path_len, de->d_name); p->name = strdup(path); if (stat(path, &(p->st)) == 0) { std::string path = android::base::StringPrintf("%s/%s", CACHE_LOG_DIR, de->d_name); struct stat sb; if (stat(path.c_str(), &sb) == 0) { // truncate files to 512kb if (p->st.st_size > (1 << 19)) { p->st.st_size = 1 << 19; if (sb.st_size > (1 << 19)) { sb.st_size = 1 << 19; } p->data = (unsigned char*) malloc(p->st.st_size); FILE* f = fopen(path, "rb"); fread(p->data, 1, p->st.st_size, f); std::string data(sb.st_size, '\0'); FILE* f = fopen(path.c_str(), "rb"); fread(&data[0], 1, data.size(), f); fclose(f); p->next = head; head = p; } else { free(p); log_files.emplace_back(saved_log_file{ path, sb, data }); } } } closedir(d); } else { if (errno != ENOENT) { printf("opendir failed: %s\n", strerror(errno)); PLOG(ERROR) << "Failed to opendir " << CACHE_LOG_DIR; } } } Loading Loading @@ -600,19 +592,17 @@ static bool erase_volume(const char* volume) { } if (is_cache) { while (head) { FILE* f = fopen_path(head->name, "wb"); if (f) { fwrite(head->data, 1, head->st.st_size, f); fclose(f); chmod(head->name, head->st.st_mode); chown(head->name, head->st.st_uid, head->st.st_gid); } free(head->name); free(head->data); saved_log_file* temp = head->next; free(head); head = temp; // Re-create the log dir and write back the log entries. if (ensure_path_mounted(CACHE_LOG_DIR) == 0 && dirCreateHierarchy(CACHE_LOG_DIR, 0777, nullptr, false, sehandle) == 0) { for (const auto& log : log_files) { if (!android::base::WriteStringToFile(log.data, log.name, log.sb.st_mode, log.sb.st_uid, log.sb.st_gid)) { PLOG(ERROR) << "Failed to write to " << log.name; } } } else { PLOG(ERROR) << "Failed to mount / create " << CACHE_LOG_DIR; } // Any part of the log we'd copied to cache is now gone. Loading Loading
recovery.cpp +85 −95 Original line number Diff line number Diff line Loading @@ -512,12 +512,11 @@ static void finish_recovery() { sync(); // For good measure. } typedef struct _saved_log_file { char* name; struct stat st; unsigned char* data; struct _saved_log_file* next; } saved_log_file; struct saved_log_file { std::string name; struct stat sb; std::string data; }; static bool erase_volume(const char* volume) { bool is_cache = (strcmp(volume, CACHE_ROOT) == 0); Loading @@ -526,7 +525,7 @@ static bool erase_volume(const char* volume) { ui->SetBackground(RecoveryUI::ERASING); ui->SetProgressType(RecoveryUI::INDETERMINATE); saved_log_file* head = NULL; std::vector<saved_log_file> log_files; if (is_cache) { // If we're reformatting /cache, we load any past logs Loading @@ -536,39 +535,32 @@ static bool erase_volume(const char* volume) { ensure_path_mounted(volume); DIR* d; struct dirent* de; d = opendir(CACHE_LOG_DIR); std::unique_ptr<DIR, decltype(&closedir)> d(opendir(CACHE_LOG_DIR), closedir); if (d) { char path[PATH_MAX]; strcpy(path, CACHE_LOG_DIR); strcat(path, "/"); int path_len = strlen(path); while ((de = readdir(d)) != NULL) { while ((de = readdir(d.get())) != nullptr) { if (strncmp(de->d_name, "last_", 5) == 0 || strcmp(de->d_name, "log") == 0) { saved_log_file* p = (saved_log_file*) malloc(sizeof(saved_log_file)); strcpy(path+path_len, de->d_name); p->name = strdup(path); if (stat(path, &(p->st)) == 0) { std::string path = android::base::StringPrintf("%s/%s", CACHE_LOG_DIR, de->d_name); struct stat sb; if (stat(path.c_str(), &sb) == 0) { // truncate files to 512kb if (p->st.st_size > (1 << 19)) { p->st.st_size = 1 << 19; if (sb.st_size > (1 << 19)) { sb.st_size = 1 << 19; } p->data = (unsigned char*) malloc(p->st.st_size); FILE* f = fopen(path, "rb"); fread(p->data, 1, p->st.st_size, f); std::string data(sb.st_size, '\0'); FILE* f = fopen(path.c_str(), "rb"); fread(&data[0], 1, data.size(), f); fclose(f); p->next = head; head = p; } else { free(p); log_files.emplace_back(saved_log_file{ path, sb, data }); } } } closedir(d); } else { if (errno != ENOENT) { printf("opendir failed: %s\n", strerror(errno)); PLOG(ERROR) << "Failed to opendir " << CACHE_LOG_DIR; } } } Loading Loading @@ -600,19 +592,17 @@ static bool erase_volume(const char* volume) { } if (is_cache) { while (head) { FILE* f = fopen_path(head->name, "wb"); if (f) { fwrite(head->data, 1, head->st.st_size, f); fclose(f); chmod(head->name, head->st.st_mode); chown(head->name, head->st.st_uid, head->st.st_gid); } free(head->name); free(head->data); saved_log_file* temp = head->next; free(head); head = temp; // Re-create the log dir and write back the log entries. if (ensure_path_mounted(CACHE_LOG_DIR) == 0 && dirCreateHierarchy(CACHE_LOG_DIR, 0777, nullptr, false, sehandle) == 0) { for (const auto& log : log_files) { if (!android::base::WriteStringToFile(log.data, log.name, log.sb.st_mode, log.sb.st_uid, log.sb.st_gid)) { PLOG(ERROR) << "Failed to write to " << log.name; } } } else { PLOG(ERROR) << "Failed to mount / create " << CACHE_LOG_DIR; } // Any part of the log we'd copied to cache is now gone. Loading