From 58d59129e1420982f2b184e3fc1e0f5c7c4cf601 Mon Sep 17 00:00:00 2001 From: Tianjie Xu Date: Fri, 3 May 2019 01:05:04 -0700 Subject: Add Updater class and remove UpdaterInfo The UpdaterInfo class is merely a collection of pointers and POD types. We can replace it with a Updater class that has the ownership of the resources. This also makes this class extensible as we plan to add more functionality in the host simulator. Bug: 131911365 Test: unit tests pass, run an update on cuttlefish and check last_install Change-Id: I07ca5963bbee8ae3cb85ccc184464910aa73d4e4 --- updater/include/updater/install.h | 11 +----- updater/include/updater/updater.h | 77 +++++++++++++++++++++++++++++++++------ 2 files changed, 66 insertions(+), 22 deletions(-) (limited to 'updater/include') diff --git a/updater/include/updater/install.h b/updater/include/updater/install.h index 8d6ca4728..9fe203149 100644 --- a/updater/include/updater/install.h +++ b/updater/include/updater/install.h @@ -14,15 +14,6 @@ * limitations under the License. */ -#ifndef _UPDATER_INSTALL_H_ -#define _UPDATER_INSTALL_H_ - -struct State; +#pragma once void RegisterInstallFunctions(); - -// uiPrintf function prints msg to screen as well as logs -void uiPrintf(State* _Nonnull state, const char* _Nonnull format, ...) - __attribute__((__format__(printf, 2, 3))); - -#endif diff --git a/updater/include/updater/updater.h b/updater/include/updater/updater.h index f4a2fe874..d5468292b 100644 --- a/updater/include/updater/updater.h +++ b/updater/include/updater/updater.h @@ -14,22 +14,75 @@ * limitations under the License. */ -#ifndef _UPDATER_UPDATER_H_ -#define _UPDATER_UPDATER_H_ +#pragma once +#include #include -#include -typedef struct { - FILE* cmd_pipe; - ZipArchiveHandle package_zip; - int version; +#include +#include + +#include - uint8_t* package_zip_addr; - size_t package_zip_len; -} UpdaterInfo; +#include "edify/expr.h" +#include "otautil/error_code.h" +#include "otautil/sysutil.h" struct selabel_handle; -extern struct selabel_handle *sehandle; -#endif +class Updater { + public: + ~Updater(); + + // Memory-maps the OTA package and opens it as a zip file. Also sets up the command pipe and + // selabel handle. TODO(xunchang) implement a run time environment class and move sehandle there. + bool Init(int fd, const std::string& package_filename, bool is_retry, + struct selabel_handle* sehandle); + + // Parses and evaluates the updater-script in the OTA package. Reports the error code if the + // evaluation fails. + bool RunUpdate(); + + // Writes the message to command pipe, adds a new line in the end. + void WriteToCommandPipe(const std::string& message, bool flush = false) const; + + // Sends over the message to recovery to print it on the screen. + void UiPrint(const std::string& message) const; + + ZipArchiveHandle package_handle() const { + return package_handle_; + } + struct selabel_handle* sehandle() const { + return sehandle_; + } + std::string result() const { + return result_; + } + + uint8_t* GetMappedPackageAddress() const { + return mapped_package_.addr; + } + + private: + friend class UpdaterTestBase; + friend class UpdaterTest; + // Where in the package we expect to find the edify script to execute. + // (Note it's "updateR-script", not the older "update-script".) + static constexpr const char* SCRIPT_NAME = "META-INF/com/google/android/updater-script"; + + // Reads the entry |name| in the zip archive and put the result in |content|. + bool ReadEntryToString(ZipArchiveHandle za, const std::string& entry_name, std::string* content); + + // Parses the error code embedded in state->errmsg; and reports the error code and cause code. + void ParseAndReportErrorCode(State* state); + + MemMapping mapped_package_; + ZipArchiveHandle package_handle_{ nullptr }; + std::string updater_script_; + + bool is_retry_{ false }; + std::unique_ptr cmd_pipe_{ nullptr, fclose }; + struct selabel_handle* sehandle_{ nullptr }; + + std::string result_; +}; -- cgit v1.2.3