diff options
author | Tom Marshall <tdm.code@gmail.com> | 2017-10-25 20:27:08 +0200 |
---|---|---|
committer | Dees Troy <dees_troy@teamw.in> | 2018-05-25 18:47:50 +0200 |
commit | 981118ec5f6a79df64545ba44132a1be438eb19b (patch) | |
tree | 47843fe7a8422ad11fc0c3b6e48c49835405974e /updater | |
parent | Enable arm64 neon scrypt implementation (diff) | |
download | android_bootable_recovery-981118ec5f6a79df64545ba44132a1be438eb19b.tar android_bootable_recovery-981118ec5f6a79df64545ba44132a1be438eb19b.tar.gz android_bootable_recovery-981118ec5f6a79df64545ba44132a1be438eb19b.tar.bz2 android_bootable_recovery-981118ec5f6a79df64545ba44132a1be438eb19b.tar.lz android_bootable_recovery-981118ec5f6a79df64545ba44132a1be438eb19b.tar.xz android_bootable_recovery-981118ec5f6a79df64545ba44132a1be438eb19b.tar.zst android_bootable_recovery-981118ec5f6a79df64545ba44132a1be438eb19b.zip |
Diffstat (limited to '')
-rw-r--r-- | updater/install.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/updater/install.cpp b/updater/install.cpp index 0d473fce4..86359d9e0 100644 --- a/updater/install.cpp +++ b/updater/install.cpp @@ -74,6 +74,7 @@ #endif #include "otautil/DirUtil.h" +#include "otautil/ZipUtil.h" #include "print_sha1.h" #include "tune2fs.h" #include "updater/updater.h" @@ -423,6 +424,36 @@ Value* SetProgressFn(const char* name, State* state, const std::vector<std::uniq return StringValue(frac_str); } +// package_extract_dir(package_dir, dest_dir) +// Extracts all files from the package underneath package_dir and writes them to the +// corresponding tree beneath dest_dir. Any existing files are overwritten. +// Example: package_extract_dir("system", "/system") +// +// Note: package_dir needs to be a relative path; dest_dir needs to be an absolute path. +Value* PackageExtractDirFn(const char* name, State* state, + const std::vector<std::unique_ptr<Expr>>&argv) { + if (argv.size() != 2) { + return ErrorAbort(state, kArgsParsingFailure, "%s() expects 2 args, got %zu", name, + argv.size()); + } + + std::vector<std::string> args; + if (!ReadArgs(state, argv, &args)) { + return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name); + } + const std::string& zip_path = args[0]; + const std::string& dest_path = args[1]; + + ZipArchiveHandle za = static_cast<UpdaterInfo*>(state->cookie)->package_zip; + + // To create a consistent system image, never use the clock for timestamps. + constexpr struct utimbuf timestamp = { 1217592000, 1217592000 }; // 8/1/2008 default + + bool success = ExtractPackageRecursive(za, zip_path, dest_path, ×tamp, sehandle); + + return StringValue(success ? "t" : ""); +} + // package_extract_file(package_file[, dest_file]) // Extracts a single package_file from the update package and writes it to dest_file, // overwriting existing files if necessary. Without the dest_file argument, returns the @@ -1045,6 +1076,7 @@ void RegisterInstallFunctions() { RegisterFunction("format", FormatFn); RegisterFunction("show_progress", ShowProgressFn); RegisterFunction("set_progress", SetProgressFn); + RegisterFunction("package_extract_dir", PackageExtractDirFn); RegisterFunction("package_extract_file", PackageExtractFileFn); RegisterFunction("getprop", GetPropFn); |