summaryrefslogtreecommitdiffstats
path: root/updater
diff options
context:
space:
mode:
authorTom Marshall <tdm.code@gmail.com>2017-10-25 20:27:08 +0200
committerDees Troy <dees_troy@teamw.in>2018-05-25 18:47:50 +0200
commit981118ec5f6a79df64545ba44132a1be438eb19b (patch)
tree47843fe7a8422ad11fc0c3b6e48c49835405974e /updater
parentEnable arm64 neon scrypt implementation (diff)
downloadandroid_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 'updater')
-rw-r--r--updater/install.cpp32
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, &timestamp, 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);