Home | History | Annotate | Download | only in updater
      1 /*
      2  * Copyright (C) 2009 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "updater/install.h"
     18 
     19 #include <ctype.h>
     20 #include <errno.h>
     21 #include <fcntl.h>
     22 #include <ftw.h>
     23 #include <inttypes.h>
     24 #include <stdarg.h>
     25 #include <stdio.h>
     26 #include <stdlib.h>
     27 #include <string.h>
     28 #include <sys/capability.h>
     29 #include <sys/mount.h>
     30 #include <sys/stat.h>
     31 #include <sys/types.h>
     32 #include <sys/wait.h>
     33 #include <sys/xattr.h>
     34 #include <time.h>
     35 #include <unistd.h>
     36 #include <utime.h>
     37 
     38 #include <memory>
     39 #include <string>
     40 #include <vector>
     41 
     42 #include <android-base/file.h>
     43 #include <android-base/logging.h>
     44 #include <android-base/parsedouble.h>
     45 #include <android-base/parseint.h>
     46 #include <android-base/properties.h>
     47 #include <android-base/stringprintf.h>
     48 #include <android-base/strings.h>
     49 #include <applypatch/applypatch.h>
     50 #include <bootloader_message/bootloader_message.h>
     51 #include <cutils/android_reboot.h>
     52 #include <ext4_utils/make_ext4fs.h>
     53 #include <ext4_utils/wipe.h>
     54 #include <openssl/sha.h>
     55 #include <selinux/label.h>
     56 #include <selinux/selinux.h>
     57 #include <ziparchive/zip_archive.h>
     58 
     59 #include "edify/expr.h"
     60 #include "error_code.h"
     61 #include "mounts.h"
     62 #include "ota_io.h"
     63 #include "otautil/DirUtil.h"
     64 #include "otautil/ZipUtil.h"
     65 #include "print_sha1.h"
     66 #include "tune2fs.h"
     67 #include "updater/updater.h"
     68 
     69 // Send over the buffer to recovery though the command pipe.
     70 static void uiPrint(State* state, const std::string& buffer) {
     71   UpdaterInfo* ui = static_cast<UpdaterInfo*>(state->cookie);
     72 
     73   // "line1\nline2\n" will be split into 3 tokens: "line1", "line2" and "".
     74   // So skip sending empty strings to UI.
     75   std::vector<std::string> lines = android::base::Split(buffer, "\n");
     76   for (auto& line : lines) {
     77     if (!line.empty()) {
     78       fprintf(ui->cmd_pipe, "ui_print %s\n", line.c_str());
     79     }
     80   }
     81 
     82   // On the updater side, we need to dump the contents to stderr (which has
     83   // been redirected to the log file). Because the recovery will only print
     84   // the contents to screen when processing pipe command ui_print.
     85   LOG(INFO) << buffer;
     86 }
     87 
     88 void uiPrintf(State* _Nonnull state, const char* _Nonnull format, ...) {
     89   std::string error_msg;
     90 
     91   va_list ap;
     92   va_start(ap, format);
     93   android::base::StringAppendV(&error_msg, format, ap);
     94   va_end(ap);
     95 
     96   uiPrint(state, error_msg);
     97 }
     98 
     99 static bool is_dir(const std::string& dirpath) {
    100   struct stat st;
    101   return stat(dirpath.c_str(), &st) == 0 && S_ISDIR(st.st_mode);
    102 }
    103 
    104 // Create all parent directories of name, if necessary.
    105 static bool make_parents(const std::string& name) {
    106   size_t prev_end = 0;
    107   while (prev_end < name.size()) {
    108     size_t next_end = name.find('/', prev_end + 1);
    109     if (next_end == std::string::npos) {
    110       break;
    111     }
    112     std::string dir_path = name.substr(0, next_end);
    113     if (!is_dir(dir_path)) {
    114       int result = mkdir(dir_path.c_str(), 0700);
    115       if (result != 0) {
    116         PLOG(ERROR) << "failed to mkdir " << dir_path << " when make parents for " << name;
    117         return false;
    118       }
    119 
    120       LOG(INFO) << "created [" << dir_path << "]";
    121     }
    122     prev_end = next_end;
    123   }
    124   return true;
    125 }
    126 
    127 // mount(fs_type, partition_type, location, mount_point)
    128 // mount(fs_type, partition_type, location, mount_point, mount_options)
    129 
    130 //    fs_type="ext4"   partition_type="EMMC"    location=device
    131 Value* MountFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    132   if (argv.size() != 4 && argv.size() != 5) {
    133     return ErrorAbort(state, kArgsParsingFailure, "%s() expects 4-5 args, got %zu", name,
    134                       argv.size());
    135   }
    136 
    137   std::vector<std::string> args;
    138   if (!ReadArgs(state, argv, &args)) {
    139     return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name);
    140   }
    141   const std::string& fs_type = args[0];
    142   const std::string& partition_type = args[1];
    143   const std::string& location = args[2];
    144   const std::string& mount_point = args[3];
    145   std::string mount_options;
    146 
    147   if (argv.size() == 5) {
    148     mount_options = args[4];
    149   }
    150 
    151   if (fs_type.empty()) {
    152     return ErrorAbort(state, kArgsParsingFailure, "fs_type argument to %s() can't be empty", name);
    153   }
    154   if (partition_type.empty()) {
    155     return ErrorAbort(state, kArgsParsingFailure, "partition_type argument to %s() can't be empty",
    156                       name);
    157   }
    158   if (location.empty()) {
    159     return ErrorAbort(state, kArgsParsingFailure, "location argument to %s() can't be empty", name);
    160   }
    161   if (mount_point.empty()) {
    162     return ErrorAbort(state, kArgsParsingFailure, "mount_point argument to %s() can't be empty",
    163                       name);
    164   }
    165 
    166   {
    167     char* secontext = nullptr;
    168 
    169     if (sehandle) {
    170       selabel_lookup(sehandle, &secontext, mount_point.c_str(), 0755);
    171       setfscreatecon(secontext);
    172     }
    173 
    174     mkdir(mount_point.c_str(), 0755);
    175 
    176     if (secontext) {
    177       freecon(secontext);
    178       setfscreatecon(nullptr);
    179     }
    180   }
    181 
    182   if (mount(location.c_str(), mount_point.c_str(), fs_type.c_str(),
    183             MS_NOATIME | MS_NODEV | MS_NODIRATIME, mount_options.c_str()) < 0) {
    184     uiPrintf(state, "%s: failed to mount %s at %s: %s\n", name, location.c_str(),
    185              mount_point.c_str(), strerror(errno));
    186     return StringValue("");
    187   }
    188 
    189   return StringValue(mount_point);
    190 }
    191 
    192 // is_mounted(mount_point)
    193 Value* IsMountedFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    194   if (argv.size() != 1) {
    195     return ErrorAbort(state, kArgsParsingFailure, "%s() expects 1 arg, got %zu", name, argv.size());
    196   }
    197 
    198   std::vector<std::string> args;
    199   if (!ReadArgs(state, argv, &args)) {
    200     return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name);
    201   }
    202   const std::string& mount_point = args[0];
    203   if (mount_point.empty()) {
    204     return ErrorAbort(state, kArgsParsingFailure,
    205                       "mount_point argument to unmount() can't be empty");
    206   }
    207 
    208   scan_mounted_volumes();
    209   MountedVolume* vol = find_mounted_volume_by_mount_point(mount_point.c_str());
    210   if (vol == nullptr) {
    211     return StringValue("");
    212   }
    213 
    214   return StringValue(mount_point);
    215 }
    216 
    217 Value* UnmountFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    218   if (argv.size() != 1) {
    219     return ErrorAbort(state, kArgsParsingFailure, "%s() expects 1 arg, got %zu", name, argv.size());
    220   }
    221   std::vector<std::string> args;
    222   if (!ReadArgs(state, argv, &args)) {
    223     return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name);
    224   }
    225   const std::string& mount_point = args[0];
    226   if (mount_point.empty()) {
    227     return ErrorAbort(state, kArgsParsingFailure,
    228                       "mount_point argument to unmount() can't be empty");
    229   }
    230 
    231   scan_mounted_volumes();
    232   MountedVolume* vol = find_mounted_volume_by_mount_point(mount_point.c_str());
    233   if (vol == nullptr) {
    234     uiPrintf(state, "unmount of %s failed; no such volume\n", mount_point.c_str());
    235     return nullptr;
    236   } else {
    237     int ret = unmount_mounted_volume(vol);
    238     if (ret != 0) {
    239       uiPrintf(state, "unmount of %s failed (%d): %s\n", mount_point.c_str(), ret, strerror(errno));
    240     }
    241   }
    242 
    243   return StringValue(mount_point);
    244 }
    245 
    246 static int exec_cmd(const char* path, char* const argv[]) {
    247   pid_t child;
    248   if ((child = vfork()) == 0) {
    249     execv(path, argv);
    250     _exit(EXIT_FAILURE);
    251   }
    252 
    253   int status;
    254   waitpid(child, &status, 0);
    255   if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
    256     LOG(ERROR) << path << " failed with status " << WEXITSTATUS(status);
    257   }
    258   return WEXITSTATUS(status);
    259 }
    260 
    261 // format(fs_type, partition_type, location, fs_size, mount_point)
    262 //
    263 //    fs_type="ext4"  partition_type="EMMC"  location=device  fs_size=<bytes> mount_point=<location>
    264 //    fs_type="f2fs"  partition_type="EMMC"  location=device  fs_size=<bytes> mount_point=<location>
    265 //    if fs_size == 0, then make fs uses the entire partition.
    266 //    if fs_size > 0, that is the size to use
    267 //    if fs_size < 0, then reserve that many bytes at the end of the partition (not for "f2fs")
    268 Value* FormatFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    269   if (argv.size() != 5) {
    270     return ErrorAbort(state, kArgsParsingFailure, "%s() expects 5 args, got %zu", name,
    271                       argv.size());
    272   }
    273 
    274   std::vector<std::string> args;
    275   if (!ReadArgs(state, argv, &args)) {
    276     return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name);
    277   }
    278   const std::string& fs_type = args[0];
    279   const std::string& partition_type = args[1];
    280   const std::string& location = args[2];
    281   const std::string& fs_size = args[3];
    282   const std::string& mount_point = args[4];
    283 
    284   if (fs_type.empty()) {
    285     return ErrorAbort(state, kArgsParsingFailure, "fs_type argument to %s() can't be empty", name);
    286   }
    287   if (partition_type.empty()) {
    288     return ErrorAbort(state, kArgsParsingFailure, "partition_type argument to %s() can't be empty",
    289                       name);
    290   }
    291   if (location.empty()) {
    292     return ErrorAbort(state, kArgsParsingFailure, "location argument to %s() can't be empty", name);
    293   }
    294   if (mount_point.empty()) {
    295     return ErrorAbort(state, kArgsParsingFailure, "mount_point argument to %s() can't be empty",
    296                       name);
    297   }
    298 
    299   int64_t size;
    300   if (!android::base::ParseInt(fs_size, &size)) {
    301     return ErrorAbort(state, kArgsParsingFailure, "%s: failed to parse int in %s\n", name,
    302                       fs_size.c_str());
    303   }
    304 
    305   if (fs_type == "ext4") {
    306     int status = make_ext4fs(location.c_str(), size, mount_point.c_str(), sehandle);
    307     if (status != 0) {
    308       LOG(ERROR) << name << ": make_ext4fs failed (" << status << ") on " << location;
    309       return StringValue("");
    310     }
    311     return StringValue(location);
    312   } else if (fs_type == "f2fs") {
    313     if (size < 0) {
    314       LOG(ERROR) << name << ": fs_size can't be negative for f2fs: " << fs_size;
    315       return StringValue("");
    316     }
    317     std::string num_sectors = std::to_string(size / 512);
    318 
    319     const char* f2fs_path = "/sbin/mkfs.f2fs";
    320     const char* const f2fs_argv[] = { "mkfs.f2fs", "-t", "-d1", location.c_str(),
    321                                       num_sectors.c_str(), nullptr };
    322     int status = exec_cmd(f2fs_path, const_cast<char* const*>(f2fs_argv));
    323     if (status != 0) {
    324       LOG(ERROR) << name << ": mkfs.f2fs failed (" << status << ") on " << location;
    325       return StringValue("");
    326     }
    327     return StringValue(location);
    328   } else {
    329     LOG(ERROR) << name << ": unsupported fs_type \"" << fs_type << "\" partition_type \""
    330                << partition_type << "\"";
    331   }
    332 
    333   return nullptr;
    334 }
    335 
    336 Value* ShowProgressFn(const char* name, State* state,
    337                       const std::vector<std::unique_ptr<Expr>>& argv) {
    338   if (argv.size() != 2) {
    339     return ErrorAbort(state, kArgsParsingFailure, "%s() expects 2 args, got %zu", name,
    340                       argv.size());
    341   }
    342 
    343   std::vector<std::string> args;
    344   if (!ReadArgs(state, argv, &args)) {
    345     return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name);
    346   }
    347   const std::string& frac_str = args[0];
    348   const std::string& sec_str = args[1];
    349 
    350   double frac;
    351   if (!android::base::ParseDouble(frac_str.c_str(), &frac)) {
    352     return ErrorAbort(state, kArgsParsingFailure, "%s: failed to parse double in %s\n", name,
    353                       frac_str.c_str());
    354   }
    355   int sec;
    356   if (!android::base::ParseInt(sec_str.c_str(), &sec)) {
    357     return ErrorAbort(state, kArgsParsingFailure, "%s: failed to parse int in %s\n", name,
    358                       sec_str.c_str());
    359   }
    360 
    361   UpdaterInfo* ui = static_cast<UpdaterInfo*>(state->cookie);
    362   fprintf(ui->cmd_pipe, "progress %f %d\n", frac, sec);
    363 
    364   return StringValue(frac_str);
    365 }
    366 
    367 Value* SetProgressFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    368   if (argv.size() != 1) {
    369     return ErrorAbort(state, kArgsParsingFailure, "%s() expects 1 arg, got %zu", name, argv.size());
    370   }
    371 
    372   std::vector<std::string> args;
    373   if (!ReadArgs(state, argv, &args)) {
    374     return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name);
    375   }
    376   const std::string& frac_str = args[0];
    377 
    378   double frac;
    379   if (!android::base::ParseDouble(frac_str.c_str(), &frac)) {
    380     return ErrorAbort(state, kArgsParsingFailure, "%s: failed to parse double in %s\n", name,
    381                       frac_str.c_str());
    382   }
    383 
    384   UpdaterInfo* ui = static_cast<UpdaterInfo*>(state->cookie);
    385   fprintf(ui->cmd_pipe, "set_progress %f\n", frac);
    386 
    387   return StringValue(frac_str);
    388 }
    389 
    390 // package_extract_dir(package_dir, dest_dir)
    391 //   Extracts all files from the package underneath package_dir and writes them to the
    392 //   corresponding tree beneath dest_dir. Any existing files are overwritten.
    393 //   Example: package_extract_dir("system", "/system")
    394 //
    395 //   Note: package_dir needs to be a relative path; dest_dir needs to be an absolute path.
    396 Value* PackageExtractDirFn(const char* name, State* state,
    397                            const std::vector<std::unique_ptr<Expr>>&argv) {
    398   if (argv.size() != 2) {
    399     return ErrorAbort(state, kArgsParsingFailure, "%s() expects 2 args, got %zu", name,
    400                       argv.size());
    401   }
    402 
    403   std::vector<std::string> args;
    404   if (!ReadArgs(state, argv, &args)) {
    405     return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name);
    406   }
    407   const std::string& zip_path = args[0];
    408   const std::string& dest_path = args[1];
    409 
    410   ZipArchiveHandle za = static_cast<UpdaterInfo*>(state->cookie)->package_zip;
    411 
    412   // To create a consistent system image, never use the clock for timestamps.
    413   constexpr struct utimbuf timestamp = { 1217592000, 1217592000 };  // 8/1/2008 default
    414 
    415   bool success = ExtractPackageRecursive(za, zip_path, dest_path, &timestamp, sehandle);
    416 
    417   return StringValue(success ? "t" : "");
    418 }
    419 
    420 // package_extract_file(package_file[, dest_file])
    421 //   Extracts a single package_file from the update package and writes it to dest_file,
    422 //   overwriting existing files if necessary. Without the dest_file argument, returns the
    423 //   contents of the package file as a binary blob.
    424 Value* PackageExtractFileFn(const char* name, State* state,
    425                             const std::vector<std::unique_ptr<Expr>>& argv) {
    426   if (argv.size() < 1 || argv.size() > 2) {
    427     return ErrorAbort(state, kArgsParsingFailure, "%s() expects 1 or 2 args, got %zu", name,
    428                       argv.size());
    429   }
    430 
    431   if (argv.size() == 2) {
    432     // The two-argument version extracts to a file.
    433 
    434     std::vector<std::string> args;
    435     if (!ReadArgs(state, argv, &args)) {
    436       return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse %zu args", name,
    437                         argv.size());
    438     }
    439     const std::string& zip_path = args[0];
    440     const std::string& dest_path = args[1];
    441 
    442     ZipArchiveHandle za = static_cast<UpdaterInfo*>(state->cookie)->package_zip;
    443     ZipString zip_string_path(zip_path.c_str());
    444     ZipEntry entry;
    445     if (FindEntry(za, zip_string_path, &entry) != 0) {
    446       LOG(ERROR) << name << ": no " << zip_path << " in package";
    447       return StringValue("");
    448     }
    449 
    450     unique_fd fd(TEMP_FAILURE_RETRY(
    451         ota_open(dest_path.c_str(), O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)));
    452     if (fd == -1) {
    453       PLOG(ERROR) << name << ": can't open " << dest_path << " for write";
    454       return StringValue("");
    455     }
    456 
    457     bool success = true;
    458     int32_t ret = ExtractEntryToFile(za, &entry, fd);
    459     if (ret != 0) {
    460       LOG(ERROR) << name << ": Failed to extract entry \"" << zip_path << "\" ("
    461                  << entry.uncompressed_length << " bytes) to \"" << dest_path
    462                  << "\": " << ErrorCodeString(ret);
    463       success = false;
    464     }
    465     if (ota_fsync(fd) == -1) {
    466       PLOG(ERROR) << "fsync of \"" << dest_path << "\" failed";
    467       success = false;
    468     }
    469     if (ota_close(fd) == -1) {
    470       PLOG(ERROR) << "close of \"" << dest_path << "\" failed";
    471       success = false;
    472     }
    473 
    474     return StringValue(success ? "t" : "");
    475   } else {
    476     // The one-argument version returns the contents of the file as the result.
    477 
    478     std::vector<std::string> args;
    479     if (!ReadArgs(state, argv, &args)) {
    480       return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse %zu args", name,
    481                         argv.size());
    482     }
    483     const std::string& zip_path = args[0];
    484 
    485     ZipArchiveHandle za = static_cast<UpdaterInfo*>(state->cookie)->package_zip;
    486     ZipString zip_string_path(zip_path.c_str());
    487     ZipEntry entry;
    488     if (FindEntry(za, zip_string_path, &entry) != 0) {
    489       return ErrorAbort(state, kPackageExtractFileFailure, "%s(): no %s in package", name,
    490                         zip_path.c_str());
    491     }
    492 
    493     std::string buffer;
    494     buffer.resize(entry.uncompressed_length);
    495 
    496     int32_t ret = ExtractToMemory(za, &entry, reinterpret_cast<uint8_t*>(&buffer[0]), buffer.size());
    497     if (ret != 0) {
    498       return ErrorAbort(state, kPackageExtractFileFailure,
    499                         "%s: Failed to extract entry \"%s\" (%zu bytes) to memory: %s", name,
    500                         zip_path.c_str(), buffer.size(), ErrorCodeString(ret));
    501     }
    502 
    503     return new Value(VAL_BLOB, buffer);
    504   }
    505 }
    506 
    507 Value* GetPropFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    508   if (argv.size() != 1) {
    509     return ErrorAbort(state, kArgsParsingFailure, "%s() expects 1 arg, got %zu", name, argv.size());
    510   }
    511   std::string key;
    512   if (!Evaluate(state, argv[0], &key)) {
    513     return nullptr;
    514   }
    515   std::string value = android::base::GetProperty(key, "");
    516 
    517   return StringValue(value);
    518 }
    519 
    520 // file_getprop(file, key)
    521 //
    522 //   interprets 'file' as a getprop-style file (key=value pairs, one
    523 //   per line. # comment lines, blank lines, lines without '=' ignored),
    524 //   and returns the value for 'key' (or "" if it isn't defined).
    525 Value* FileGetPropFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    526   if (argv.size() != 2) {
    527     return ErrorAbort(state, kArgsParsingFailure, "%s() expects 2 args, got %zu", name,
    528                       argv.size());
    529   }
    530 
    531   std::vector<std::string> args;
    532   if (!ReadArgs(state, argv, &args)) {
    533     return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name);
    534   }
    535   const std::string& filename = args[0];
    536   const std::string& key = args[1];
    537 
    538   struct stat st;
    539   if (stat(filename.c_str(), &st) < 0) {
    540     return ErrorAbort(state, kFileGetPropFailure, "%s: failed to stat \"%s\": %s", name,
    541                       filename.c_str(), strerror(errno));
    542   }
    543 
    544   constexpr off_t MAX_FILE_GETPROP_SIZE = 65536;
    545   if (st.st_size > MAX_FILE_GETPROP_SIZE) {
    546     return ErrorAbort(state, kFileGetPropFailure, "%s too large for %s (max %lld)",
    547                       filename.c_str(), name, static_cast<long long>(MAX_FILE_GETPROP_SIZE));
    548   }
    549 
    550   std::string buffer(st.st_size, '\0');
    551   unique_file f(ota_fopen(filename.c_str(), "rb"));
    552   if (f == nullptr) {
    553     return ErrorAbort(state, kFileOpenFailure, "%s: failed to open %s: %s", name, filename.c_str(),
    554                       strerror(errno));
    555   }
    556 
    557   if (ota_fread(&buffer[0], 1, st.st_size, f.get()) != static_cast<size_t>(st.st_size)) {
    558     ErrorAbort(state, kFreadFailure, "%s: failed to read %zu bytes from %s", name,
    559                static_cast<size_t>(st.st_size), filename.c_str());
    560     return nullptr;
    561   }
    562 
    563   ota_fclose(f);
    564 
    565   std::vector<std::string> lines = android::base::Split(buffer, "\n");
    566   for (size_t i = 0; i < lines.size(); i++) {
    567     std::string line = android::base::Trim(lines[i]);
    568 
    569     // comment or blank line: skip to next line
    570     if (line.empty() || line[0] == '#') {
    571       continue;
    572     }
    573     size_t equal_pos = line.find('=');
    574     if (equal_pos == std::string::npos) {
    575       continue;
    576     }
    577 
    578     // trim whitespace between key and '='
    579     std::string str = android::base::Trim(line.substr(0, equal_pos));
    580 
    581     // not the key we're looking for
    582     if (key != str) continue;
    583 
    584     return StringValue(android::base::Trim(line.substr(equal_pos + 1)));
    585   }
    586 
    587   return StringValue("");
    588 }
    589 
    590 // apply_patch_space(bytes)
    591 Value* ApplyPatchSpaceFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    592   if (argv.size() != 1) {
    593     return ErrorAbort(state, kArgsParsingFailure, "%s() expects 1 args, got %zu", name,
    594                       argv.size());
    595   }
    596   std::vector<std::string> args;
    597   if (!ReadArgs(state, argv, &args)) {
    598     return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name);
    599   }
    600   const std::string& bytes_str = args[0];
    601 
    602   size_t bytes;
    603   if (!android::base::ParseUint(bytes_str.c_str(), &bytes)) {
    604     return ErrorAbort(state, kArgsParsingFailure, "%s(): can't parse \"%s\" as byte count\n\n",
    605                       name, bytes_str.c_str());
    606   }
    607 
    608   return StringValue(CacheSizeCheck(bytes) ? "" : "t");
    609 }
    610 
    611 // apply_patch(src_file, tgt_file, tgt_sha1, tgt_size, patch1_sha1, patch1_blob, [...])
    612 //   Applies a binary patch to the src_file to produce the tgt_file. If the desired target is the
    613 //   same as the source, pass "-" for tgt_file. tgt_sha1 and tgt_size are the expected final SHA1
    614 //   hash and size of the target file. The remaining arguments must come in pairs: a SHA1 hash (a
    615 //   40-character hex string) and a blob. The blob is the patch to be applied when the source
    616 //   file's current contents have the given SHA1.
    617 //
    618 //   The patching is done in a safe manner that guarantees the target file either has the desired
    619 //   SHA1 hash and size, or it is untouched -- it will not be left in an unrecoverable intermediate
    620 //   state. If the process is interrupted during patching, the target file may be in an intermediate
    621 //   state; a copy exists in the cache partition so restarting the update can successfully update
    622 //   the file.
    623 Value* ApplyPatchFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    624     if (argv.size() < 6 || (argv.size() % 2) == 1) {
    625         return ErrorAbort(state, kArgsParsingFailure, "%s(): expected at least 6 args and an "
    626                           "even number, got %zu", name, argv.size());
    627     }
    628 
    629     std::vector<std::string> args;
    630     if (!ReadArgs(state, argv, &args, 0, 4)) {
    631         return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name);
    632     }
    633     const std::string& source_filename = args[0];
    634     const std::string& target_filename = args[1];
    635     const std::string& target_sha1 = args[2];
    636     const std::string& target_size_str = args[3];
    637 
    638     size_t target_size;
    639     if (!android::base::ParseUint(target_size_str.c_str(), &target_size)) {
    640         return ErrorAbort(state, kArgsParsingFailure, "%s(): can't parse \"%s\" as byte count",
    641                           name, target_size_str.c_str());
    642     }
    643 
    644     int patchcount = (argv.size()-4) / 2;
    645     std::vector<std::unique_ptr<Value>> arg_values;
    646     if (!ReadValueArgs(state, argv, &arg_values, 4, argv.size() - 4)) {
    647         return nullptr;
    648     }
    649 
    650     for (int i = 0; i < patchcount; ++i) {
    651         if (arg_values[i * 2]->type != VAL_STRING) {
    652             return ErrorAbort(state, kArgsParsingFailure, "%s(): sha-1 #%d is not string", name,
    653                               i * 2);
    654         }
    655         if (arg_values[i * 2 + 1]->type != VAL_BLOB) {
    656             return ErrorAbort(state, kArgsParsingFailure, "%s(): patch #%d is not blob", name,
    657                               i * 2 + 1);
    658         }
    659     }
    660 
    661     std::vector<std::string> patch_sha_str;
    662     std::vector<std::unique_ptr<Value>> patches;
    663     for (int i = 0; i < patchcount; ++i) {
    664         patch_sha_str.push_back(arg_values[i * 2]->data);
    665         patches.push_back(std::move(arg_values[i * 2 + 1]));
    666     }
    667 
    668     int result = applypatch(source_filename.c_str(), target_filename.c_str(),
    669                             target_sha1.c_str(), target_size,
    670                             patch_sha_str, patches, nullptr);
    671 
    672     return StringValue(result == 0 ? "t" : "");
    673 }
    674 
    675 // apply_patch_check(filename, [sha1, ...])
    676 //   Returns true if the contents of filename or the temporary copy in the cache partition (if
    677 //   present) have a SHA-1 checksum equal to one of the given sha1 values. sha1 values are
    678 //   specified as 40 hex digits. This function differs from sha1_check(read_file(filename),
    679 //   sha1 [, ...]) in that it knows to check the cache partition copy, so apply_patch_check() will
    680 //   succeed even if the file was corrupted by an interrupted apply_patch() update.
    681 Value* ApplyPatchCheckFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    682   if (argv.size() < 1) {
    683     return ErrorAbort(state, kArgsParsingFailure, "%s(): expected at least 1 arg, got %zu", name,
    684                       argv.size());
    685   }
    686 
    687   std::vector<std::string> args;
    688   if (!ReadArgs(state, argv, &args, 0, 1)) {
    689     return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name);
    690   }
    691   const std::string& filename = args[0];
    692 
    693   std::vector<std::string> sha1s;
    694   if (argv.size() > 1 && !ReadArgs(state, argv, &sha1s, 1, argv.size() - 1)) {
    695     return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name);
    696   }
    697   int result = applypatch_check(filename.c_str(), sha1s);
    698 
    699   return StringValue(result == 0 ? "t" : "");
    700 }
    701 
    702 // This is the updater side handler for ui_print() in edify script. Contents
    703 // will be sent over to the recovery side for on-screen display.
    704 Value* UIPrintFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    705   std::vector<std::string> args;
    706   if (!ReadArgs(state, argv, &args)) {
    707     return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name);
    708   }
    709 
    710   std::string buffer = android::base::Join(args, "") + "\n";
    711   uiPrint(state, buffer);
    712   return StringValue(buffer);
    713 }
    714 
    715 Value* WipeCacheFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    716   if (!argv.empty()) {
    717     return ErrorAbort(state, kArgsParsingFailure, "%s() expects no args, got %zu", name,
    718                       argv.size());
    719   }
    720   fprintf(static_cast<UpdaterInfo*>(state->cookie)->cmd_pipe, "wipe_cache\n");
    721   return StringValue("t");
    722 }
    723 
    724 Value* RunProgramFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    725   if (argv.size() < 1) {
    726     return ErrorAbort(state, kArgsParsingFailure, "%s() expects at least 1 arg", name);
    727   }
    728 
    729   std::vector<std::string> args;
    730   if (!ReadArgs(state, argv, &args)) {
    731     return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name);
    732   }
    733 
    734   char* args2[argv.size() + 1];
    735   for (size_t i = 0; i < argv.size(); i++) {
    736     args2[i] = &args[i][0];
    737   }
    738   args2[argv.size()] = nullptr;
    739 
    740   LOG(INFO) << "about to run program [" << args2[0] << "] with " << argv.size() << " args";
    741 
    742   pid_t child = fork();
    743   if (child == 0) {
    744     execv(args2[0], args2);
    745     PLOG(ERROR) << "run_program: execv failed";
    746     _exit(EXIT_FAILURE);
    747   }
    748 
    749   int status;
    750   waitpid(child, &status, 0);
    751   if (WIFEXITED(status)) {
    752     if (WEXITSTATUS(status) != 0) {
    753       LOG(ERROR) << "run_program: child exited with status " << WEXITSTATUS(status);
    754     }
    755   } else if (WIFSIGNALED(status)) {
    756     LOG(ERROR) << "run_program: child terminated by signal " << WTERMSIG(status);
    757   }
    758 
    759   return StringValue(std::to_string(status));
    760 }
    761 
    762 // sha1_check(data)
    763 //    to return the sha1 of the data (given in the format returned by
    764 //    read_file).
    765 //
    766 // sha1_check(data, sha1_hex, [sha1_hex, ...])
    767 //    returns the sha1 of the file if it matches any of the hex
    768 //    strings passed, or "" if it does not equal any of them.
    769 //
    770 Value* Sha1CheckFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    771   if (argv.size() < 1) {
    772     return ErrorAbort(state, kArgsParsingFailure, "%s() expects at least 1 arg", name);
    773   }
    774 
    775   std::vector<std::unique_ptr<Value>> args;
    776   if (!ReadValueArgs(state, argv, &args)) {
    777     return nullptr;
    778   }
    779 
    780   if (args[0]->type == VAL_INVALID) {
    781     return StringValue("");
    782   }
    783   uint8_t digest[SHA_DIGEST_LENGTH];
    784   SHA1(reinterpret_cast<const uint8_t*>(args[0]->data.c_str()), args[0]->data.size(), digest);
    785 
    786   if (argv.size() == 1) {
    787     return StringValue(print_sha1(digest));
    788   }
    789 
    790   for (size_t i = 1; i < argv.size(); ++i) {
    791     uint8_t arg_digest[SHA_DIGEST_LENGTH];
    792     if (args[i]->type != VAL_STRING) {
    793       LOG(ERROR) << name << "(): arg " << i << " is not a string; skipping";
    794     } else if (ParseSha1(args[i]->data.c_str(), arg_digest) != 0) {
    795       // Warn about bad args and skip them.
    796       LOG(ERROR) << name << "(): error parsing \"" << args[i]->data << "\" as sha-1; skipping";
    797     } else if (memcmp(digest, arg_digest, SHA_DIGEST_LENGTH) == 0) {
    798       // Found a match.
    799       return args[i].release();
    800     }
    801   }
    802 
    803   // Didn't match any of the hex strings; return false.
    804   return StringValue("");
    805 }
    806 
    807 // Read a local file and return its contents (the Value* returned
    808 // is actually a FileContents*).
    809 Value* ReadFileFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    810   if (argv.size() != 1) {
    811     return ErrorAbort(state, kArgsParsingFailure, "%s() expects 1 arg, got %zu", name, argv.size());
    812   }
    813 
    814   std::vector<std::string> args;
    815   if (!ReadArgs(state, argv, &args)) {
    816     return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name);
    817   }
    818   const std::string& filename = args[0];
    819 
    820   Value* v = new Value(VAL_INVALID, "");
    821 
    822   FileContents fc;
    823   if (LoadFileContents(filename.c_str(), &fc) == 0) {
    824     v->type = VAL_BLOB;
    825     v->data = std::string(fc.data.begin(), fc.data.end());
    826   }
    827   return v;
    828 }
    829 
    830 // write_value(value, filename)
    831 //   Writes 'value' to 'filename'.
    832 //   Example: write_value("960000", "/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq")
    833 Value* WriteValueFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    834   if (argv.size() != 2) {
    835     return ErrorAbort(state, kArgsParsingFailure, "%s() expects 2 args, got %zu", name,
    836                       argv.size());
    837   }
    838 
    839   std::vector<std::string> args;
    840   if (!ReadArgs(state, argv, &args)) {
    841     return ErrorAbort(state, kArgsParsingFailure, "%s(): Failed to parse the argument(s)", name);
    842   }
    843 
    844   const std::string& filename = args[1];
    845   if (filename.empty()) {
    846     return ErrorAbort(state, kArgsParsingFailure, "%s(): Filename cannot be empty", name);
    847   }
    848 
    849   const std::string& value = args[0];
    850   if (!android::base::WriteStringToFile(value, filename)) {
    851     PLOG(ERROR) << name << ": Failed to write to \"" << filename << "\"";
    852     return StringValue("");
    853   } else {
    854     return StringValue("t");
    855   }
    856 }
    857 
    858 // Immediately reboot the device.  Recovery is not finished normally,
    859 // so if you reboot into recovery it will re-start applying the
    860 // current package (because nothing has cleared the copy of the
    861 // arguments stored in the BCB).
    862 //
    863 // The argument is the partition name passed to the android reboot
    864 // property.  It can be "recovery" to boot from the recovery
    865 // partition, or "" (empty string) to boot from the regular boot
    866 // partition.
    867 Value* RebootNowFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    868   if (argv.size() != 2) {
    869     return ErrorAbort(state, kArgsParsingFailure, "%s() expects 2 args, got %zu", name,
    870                       argv.size());
    871   }
    872 
    873   std::vector<std::string> args;
    874   if (!ReadArgs(state, argv, &args)) {
    875     return ErrorAbort(state, kArgsParsingFailure, "%s(): Failed to parse the argument(s)", name);
    876   }
    877   const std::string& filename = args[0];
    878   const std::string& property = args[1];
    879 
    880   // Zero out the 'command' field of the bootloader message. Leave the rest intact.
    881   bootloader_message boot;
    882   std::string err;
    883   if (!read_bootloader_message_from(&boot, filename, &err)) {
    884     LOG(ERROR) << name << "(): Failed to read from \"" << filename << "\": " << err;
    885     return StringValue("");
    886   }
    887   memset(boot.command, 0, sizeof(boot.command));
    888   if (!write_bootloader_message_to(boot, filename, &err)) {
    889     LOG(ERROR) << name << "(): Failed to write to \"" << filename << "\": " << err;
    890     return StringValue("");
    891   }
    892 
    893   std::string reboot_cmd = "reboot," + property;
    894   if (android::base::GetBoolProperty("ro.boot.quiescent", false)) {
    895     reboot_cmd += ",quiescent";
    896   }
    897   android::base::SetProperty(ANDROID_RB_PROPERTY, reboot_cmd);
    898 
    899   sleep(5);
    900   return ErrorAbort(state, kRebootFailure, "%s() failed to reboot", name);
    901 }
    902 
    903 // Store a string value somewhere that future invocations of recovery
    904 // can access it.  This value is called the "stage" and can be used to
    905 // drive packages that need to do reboots in the middle of
    906 // installation and keep track of where they are in the multi-stage
    907 // install.
    908 //
    909 // The first argument is the block device for the misc partition
    910 // ("/misc" in the fstab), which is where this value is stored.  The
    911 // second argument is the string to store; it should not exceed 31
    912 // bytes.
    913 Value* SetStageFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    914   if (argv.size() != 2) {
    915     return ErrorAbort(state, kArgsParsingFailure, "%s() expects 2 args, got %zu", name,
    916                       argv.size());
    917   }
    918 
    919   std::vector<std::string> args;
    920   if (!ReadArgs(state, argv, &args)) {
    921     return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name);
    922   }
    923   const std::string& filename = args[0];
    924   const std::string& stagestr = args[1];
    925 
    926   // Store this value in the misc partition, immediately after the
    927   // bootloader message that the main recovery uses to save its
    928   // arguments in case of the device restarting midway through
    929   // package installation.
    930   bootloader_message boot;
    931   std::string err;
    932   if (!read_bootloader_message_from(&boot, filename, &err)) {
    933     LOG(ERROR) << name << "(): Failed to read from \"" << filename << "\": " << err;
    934     return StringValue("");
    935   }
    936   strlcpy(boot.stage, stagestr.c_str(), sizeof(boot.stage));
    937   if (!write_bootloader_message_to(boot, filename, &err)) {
    938     LOG(ERROR) << name << "(): Failed to write to \"" << filename << "\": " << err;
    939     return StringValue("");
    940   }
    941 
    942   return StringValue(filename);
    943 }
    944 
    945 // Return the value most recently saved with SetStageFn.  The argument
    946 // is the block device for the misc partition.
    947 Value* GetStageFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    948   if (argv.size() != 1) {
    949     return ErrorAbort(state, kArgsParsingFailure, "%s() expects 1 arg, got %zu", name, argv.size());
    950   }
    951 
    952   std::vector<std::string> args;
    953   if (!ReadArgs(state, argv, &args)) {
    954     return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name);
    955   }
    956   const std::string& filename = args[0];
    957 
    958   bootloader_message boot;
    959   std::string err;
    960   if (!read_bootloader_message_from(&boot, filename, &err)) {
    961     LOG(ERROR) << name << "(): Failed to read from \"" << filename << "\": " << err;
    962     return StringValue("");
    963   }
    964 
    965   return StringValue(boot.stage);
    966 }
    967 
    968 Value* WipeBlockDeviceFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    969   if (argv.size() != 2) {
    970     return ErrorAbort(state, kArgsParsingFailure, "%s() expects 2 args, got %zu", name,
    971                       argv.size());
    972   }
    973 
    974   std::vector<std::string> args;
    975   if (!ReadArgs(state, argv, &args)) {
    976     return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name);
    977   }
    978   const std::string& filename = args[0];
    979   const std::string& len_str = args[1];
    980 
    981   size_t len;
    982   if (!android::base::ParseUint(len_str.c_str(), &len)) {
    983     return nullptr;
    984   }
    985   unique_fd fd(ota_open(filename.c_str(), O_WRONLY, 0644));
    986   // The wipe_block_device function in ext4_utils returns 0 on success and 1
    987   // for failure.
    988   int status = wipe_block_device(fd, len);
    989   return StringValue((status == 0) ? "t" : "");
    990 }
    991 
    992 Value* EnableRebootFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
    993   if (!argv.empty()) {
    994     return ErrorAbort(state, kArgsParsingFailure, "%s() expects no args, got %zu", name,
    995                       argv.size());
    996   }
    997   UpdaterInfo* ui = static_cast<UpdaterInfo*>(state->cookie);
    998   fprintf(ui->cmd_pipe, "enable_reboot\n");
    999   return StringValue("t");
   1000 }
   1001 
   1002 Value* Tune2FsFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
   1003   if (argv.empty()) {
   1004     return ErrorAbort(state, kArgsParsingFailure, "%s() expects args, got %zu", name, argv.size());
   1005   }
   1006 
   1007   std::vector<std::string> args;
   1008   if (!ReadArgs(state, argv, &args)) {
   1009     return ErrorAbort(state, kArgsParsingFailure, "%s() could not read args", name);
   1010   }
   1011 
   1012   char* args2[argv.size() + 1];
   1013   // Tune2fs expects the program name as its args[0]
   1014   args2[0] = const_cast<char*>(name);
   1015   if (args2[0] == nullptr) {
   1016     return nullptr;
   1017   }
   1018   for (size_t i = 0; i < argv.size(); ++i) {
   1019     args2[i + 1] = &args[i][0];
   1020   }
   1021 
   1022   // tune2fs changes the file system parameters on an ext2 file system; it
   1023   // returns 0 on success.
   1024   int result = tune2fs_main(argv.size() + 1, args2);
   1025   if (result != 0) {
   1026     return ErrorAbort(state, kTune2FsFailure, "%s() returned error code %d", name, result);
   1027   }
   1028   return StringValue("t");
   1029 }
   1030 
   1031 void RegisterInstallFunctions() {
   1032   RegisterFunction("mount", MountFn);
   1033   RegisterFunction("is_mounted", IsMountedFn);
   1034   RegisterFunction("unmount", UnmountFn);
   1035   RegisterFunction("format", FormatFn);
   1036   RegisterFunction("show_progress", ShowProgressFn);
   1037   RegisterFunction("set_progress", SetProgressFn);
   1038   RegisterFunction("package_extract_dir", PackageExtractDirFn);
   1039   RegisterFunction("package_extract_file", PackageExtractFileFn);
   1040 
   1041   RegisterFunction("getprop", GetPropFn);
   1042   RegisterFunction("file_getprop", FileGetPropFn);
   1043 
   1044   RegisterFunction("apply_patch", ApplyPatchFn);
   1045   RegisterFunction("apply_patch_check", ApplyPatchCheckFn);
   1046   RegisterFunction("apply_patch_space", ApplyPatchSpaceFn);
   1047 
   1048   RegisterFunction("wipe_block_device", WipeBlockDeviceFn);
   1049 
   1050   RegisterFunction("read_file", ReadFileFn);
   1051   RegisterFunction("sha1_check", Sha1CheckFn);
   1052   RegisterFunction("write_value", WriteValueFn);
   1053 
   1054   RegisterFunction("wipe_cache", WipeCacheFn);
   1055 
   1056   RegisterFunction("ui_print", UIPrintFn);
   1057 
   1058   RegisterFunction("run_program", RunProgramFn);
   1059 
   1060   RegisterFunction("reboot_now", RebootNowFn);
   1061   RegisterFunction("get_stage", GetStageFn);
   1062   RegisterFunction("set_stage", SetStageFn);
   1063 
   1064   RegisterFunction("enable_reboot", EnableRebootFn);
   1065   RegisterFunction("tune2fs", Tune2FsFn);
   1066 }
   1067