summaryrefslogblamecommitdiffstats
path: root/updater/include/updater/updater.h
blob: 8676b603848a9fee34b4e3180c22520a3e9302d6 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16















                                                                           
            
 
                   
                  
 

                 
                      

                                   
 
                       
                                    

                               
 
                                         
        


                                                                     
                      

                                                                                              

                                                                            





                                                                                              
                                                                                             

                                                                  
                                                              
 



                                                                              
   

                                                      
   
                                          

                   
                                                     

                                


                                                  













                                                                                                   

                                                    





                                                                        

                      
                                              
  
/*
 * Copyright (C) 2009 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <stdint.h>
#include <stdio.h>

#include <memory>
#include <string>
#include <string_view>

#include <ziparchive/zip_archive.h>

#include "edify/expr.h"
#include "edify/updater_interface.h"
#include "otautil/error_code.h"
#include "otautil/sysutil.h"

class Updater : public UpdaterInterface {
 public:
  explicit Updater(std::unique_ptr<UpdaterRuntimeInterface> run_time)
      : runtime_(std::move(run_time)) {}

  ~Updater() override;

  // Memory-maps the OTA package and opens it as a zip file. Also sets up the command pipe and
  // UpdaterRuntime.
  bool Init(int fd, const std::string_view package_filename, bool is_retry);

  // 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_view message, bool flush = false) const override;

  // Sends over the message to recovery to print it on the screen.
  void UiPrint(const std::string_view message) const override;

  std::string FindBlockDeviceName(const std::string_view name) const override;

  UpdaterRuntimeInterface* GetRuntime() const override {
    return runtime_.get();
  }
  ZipArchiveHandle GetPackageHandle() const override {
    return package_handle_;
  }
  std::string GetResult() const override {
    return result_;
  }
  uint8_t* GetMappedPackageAddress() const override {
    return mapped_package_.addr;
  }
  size_t GetMappedPackageLength() const override {
    return mapped_package_.length;
  }

 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);

  std::unique_ptr<UpdaterRuntimeInterface> runtime_;

  MemMapping mapped_package_;
  ZipArchiveHandle package_handle_{ nullptr };
  std::string updater_script_;

  bool is_retry_{ false };
  std::unique_ptr<FILE, decltype(&fclose)> cmd_pipe_{ nullptr, fclose };

  std::string result_;
  std::vector<std::string> skipped_functions_;
};