diff options
Diffstat (limited to 'updater/install.cpp')
-rw-r--r-- | updater/install.cpp | 122 |
1 files changed, 66 insertions, 56 deletions
diff --git a/updater/install.cpp b/updater/install.cpp index 3e7e9285a..4c4886d51 100644 --- a/updater/install.cpp +++ b/updater/install.cpp @@ -48,9 +48,10 @@ #include "cutils/misc.h" #include "cutils/properties.h" #include "edify/expr.h" -#include "openssl/sha.h" +#include "error_code.h" #include "minzip/DirUtil.h" #include "mounts.h" +#include "openssl/sha.h" #include "ota_io.h" #include "updater.h" #include "install.h" @@ -109,7 +110,7 @@ char* PrintSha1(const uint8_t* digest) { Value* MountFn(const char* name, State* state, int argc, Expr* argv[]) { char* result = NULL; if (argc != 4 && argc != 5) { - return ErrorAbort(state, "%s() expects 4-5 args, got %d", name, argc); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects 4-5 args, got %d", name, argc); } char* fs_type; char* partition_type; @@ -132,20 +133,21 @@ Value* MountFn(const char* name, State* state, int argc, Expr* argv[]) { } if (strlen(fs_type) == 0) { - ErrorAbort(state, "fs_type argument to %s() can't be empty", name); + ErrorAbort(state, kArgsParsingFailure, "fs_type argument to %s() can't be empty", name); goto done; } if (strlen(partition_type) == 0) { - ErrorAbort(state, "partition_type argument to %s() can't be empty", + ErrorAbort(state, kArgsParsingFailure, "partition_type argument to %s() can't be empty", name); goto done; } if (strlen(location) == 0) { - ErrorAbort(state, "location argument to %s() can't be empty", name); + ErrorAbort(state, kArgsParsingFailure, "location argument to %s() can't be empty", name); goto done; } if (strlen(mount_point) == 0) { - ErrorAbort(state, "mount_point argument to %s() can't be empty", name); + ErrorAbort(state, kArgsParsingFailure, "mount_point argument to %s() can't be empty", + name); goto done; } @@ -189,14 +191,14 @@ done: Value* IsMountedFn(const char* name, State* state, int argc, Expr* argv[]) { char* result = NULL; if (argc != 1) { - return ErrorAbort(state, "%s() expects 1 arg, got %d", name, argc); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects 1 arg, got %d", name, argc); } char* mount_point; if (ReadArgs(state, argv, 1, &mount_point) < 0) { return NULL; } if (strlen(mount_point) == 0) { - ErrorAbort(state, "mount_point argument to unmount() can't be empty"); + ErrorAbort(state, kArgsParsingFailure, "mount_point argument to unmount() can't be empty"); goto done; } @@ -219,14 +221,14 @@ done: Value* UnmountFn(const char* name, State* state, int argc, Expr* argv[]) { char* result = NULL; if (argc != 1) { - return ErrorAbort(state, "%s() expects 1 arg, got %d", name, argc); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects 1 arg, got %d", name, argc); } char* mount_point; if (ReadArgs(state, argv, 1, &mount_point) < 0) { return NULL; } if (strlen(mount_point) == 0) { - ErrorAbort(state, "mount_point argument to unmount() can't be empty"); + ErrorAbort(state, kArgsParsingFailure, "mount_point argument to unmount() can't be empty"); goto done; } @@ -276,7 +278,7 @@ static int exec_cmd(const char* path, char* const argv[]) { Value* FormatFn(const char* name, State* state, int argc, Expr* argv[]) { char* result = NULL; if (argc != 5) { - return ErrorAbort(state, "%s() expects 5 args, got %d", name, argc); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects 5 args, got %d", name, argc); } char* fs_type; char* partition_type; @@ -289,21 +291,22 @@ Value* FormatFn(const char* name, State* state, int argc, Expr* argv[]) { } if (strlen(fs_type) == 0) { - ErrorAbort(state, "fs_type argument to %s() can't be empty", name); + ErrorAbort(state, kArgsParsingFailure, "fs_type argument to %s() can't be empty", name); goto done; } if (strlen(partition_type) == 0) { - ErrorAbort(state, "partition_type argument to %s() can't be empty", + ErrorAbort(state, kArgsParsingFailure, "partition_type argument to %s() can't be empty", name); goto done; } if (strlen(location) == 0) { - ErrorAbort(state, "location argument to %s() can't be empty", name); + ErrorAbort(state, kArgsParsingFailure, "location argument to %s() can't be empty", name); goto done; } if (strlen(mount_point) == 0) { - ErrorAbort(state, "mount_point argument to %s() can't be empty", name); + ErrorAbort(state, kArgsParsingFailure, "mount_point argument to %s() can't be empty", + name); goto done; } @@ -349,7 +352,7 @@ done: Value* RenameFn(const char* name, State* state, int argc, Expr* argv[]) { char* result = NULL; if (argc != 2) { - return ErrorAbort(state, "%s() expects 2 args, got %d", name, argc); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects 2 args, got %d", name, argc); } char* src_name; @@ -359,21 +362,21 @@ Value* RenameFn(const char* name, State* state, int argc, Expr* argv[]) { return NULL; } if (strlen(src_name) == 0) { - ErrorAbort(state, "src_name argument to %s() can't be empty", name); + ErrorAbort(state, kArgsParsingFailure, "src_name argument to %s() can't be empty", name); goto done; } if (strlen(dst_name) == 0) { - ErrorAbort(state, "dst_name argument to %s() can't be empty", name); + ErrorAbort(state, kArgsParsingFailure, "dst_name argument to %s() can't be empty", name); goto done; } if (make_parents(dst_name) != 0) { - ErrorAbort(state, "Creating parent of %s failed, error %s", + ErrorAbort(state, kFileRenameFailure, "Creating parent of %s failed, error %s", dst_name, strerror(errno)); } else if (access(dst_name, F_OK) == 0 && access(src_name, F_OK) != 0) { // File was already moved result = dst_name; } else if (rename(src_name, dst_name) != 0) { - ErrorAbort(state, "Rename of %s to %s failed, error %s", + ErrorAbort(state, kFileRenameFailure, "Rename of %s to %s failed, error %s", src_name, dst_name, strerror(errno)); } else { result = dst_name; @@ -416,7 +419,7 @@ Value* DeleteFn(const char* name, State* state, int argc, Expr* argv[]) { Value* ShowProgressFn(const char* name, State* state, int argc, Expr* argv[]) { if (argc != 2) { - return ErrorAbort(state, "%s() expects 2 args, got %d", name, argc); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects 2 args, got %d", name, argc); } char* frac_str; char* sec_str; @@ -437,7 +440,7 @@ Value* ShowProgressFn(const char* name, State* state, int argc, Expr* argv[]) { Value* SetProgressFn(const char* name, State* state, int argc, Expr* argv[]) { if (argc != 1) { - return ErrorAbort(state, "%s() expects 1 arg, got %d", name, argc); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects 1 arg, got %d", name, argc); } char* frac_str; if (ReadArgs(state, argv, 1, &frac_str) < 0) { @@ -456,7 +459,7 @@ Value* SetProgressFn(const char* name, State* state, int argc, Expr* argv[]) { Value* PackageExtractDirFn(const char* name, State* state, int argc, Expr* argv[]) { if (argc != 2) { - return ErrorAbort(state, "%s() expects 2 args, got %d", name, argc); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects 2 args, got %d", name, argc); } char* zip_path; char* dest_path; @@ -484,7 +487,7 @@ Value* PackageExtractDirFn(const char* name, State* state, Value* PackageExtractFileFn(const char* name, State* state, int argc, Expr* argv[]) { if (argc < 1 || argc > 2) { - return ErrorAbort(state, "%s() expects 1 or 2 args, got %d", + return ErrorAbort(state, kArgsParsingFailure, "%s() expects 1 or 2 args, got %d", name, argc); } bool success = false; @@ -592,7 +595,7 @@ static int make_parents(char* name) { // unlinks any previously existing src1, src2, etc before creating symlinks. Value* SymlinkFn(const char* name, State* state, int argc, Expr* argv[]) { if (argc == 0) { - return ErrorAbort(state, "%s() expects 1+ args, got %d", name, argc); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects 1+ args, got %d", name, argc); } char* target; target = Evaluate(state, argv[0]); @@ -628,7 +631,7 @@ Value* SymlinkFn(const char* name, State* state, int argc, Expr* argv[]) { } free(srcs); if (bad) { - return ErrorAbort(state, "%s: some symlinks failed", name); + return ErrorAbort(state, kSymlinkFailure, "%s: some symlinks failed", name); } return StringValue(strdup("")); } @@ -852,14 +855,16 @@ static Value* SetMetadataFn(const char* name, State* state, int argc, Expr* argv bool recursive = (strcmp(name, "set_metadata_recursive") == 0); if ((argc % 2) != 1) { - return ErrorAbort(state, "%s() expects an odd number of arguments, got %d", name, argc); + return ErrorAbort(state, kArgsParsingFailure, + "%s() expects an odd number of arguments, got %d", name, argc); } char** args = ReadVarArgs(state, argc, argv); if (args == NULL) return NULL; if (lstat(args[0], &sb) == -1) { - result = ErrorAbort(state, "%s: Error on lstat of \"%s\": %s", name, args[0], strerror(errno)); + result = ErrorAbort(state, kSetMetadataFailure, "%s: Error on lstat of \"%s\": %s", + name, args[0], strerror(errno)); goto done; } @@ -888,7 +893,7 @@ done: } if (bad > 0) { - return ErrorAbort(state, "%s: some changes failed", name); + return ErrorAbort(state, kSetMetadataFailure, "%s: some changes failed", name); } return StringValue(strdup("")); @@ -896,7 +901,7 @@ done: Value* GetPropFn(const char* name, State* state, int argc, Expr* argv[]) { if (argc != 1) { - return ErrorAbort(state, "%s() expects 1 arg, got %d", name, argc); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects 1 arg, got %d", name, argc); } char* key = Evaluate(state, argv[0]); if (key == NULL) return NULL; @@ -925,20 +930,22 @@ Value* FileGetPropFn(const char* name, State* state, int argc, Expr* argv[]) { struct stat st; if (stat(filename, &st) < 0) { - ErrorAbort(state, "%s: failed to stat \"%s\": %s", name, filename, strerror(errno)); + ErrorAbort(state, kFileGetPropFailure, "%s: failed to stat \"%s\": %s", name, filename, + strerror(errno)); goto done; } #define MAX_FILE_GETPROP_SIZE 65536 if (st.st_size > MAX_FILE_GETPROP_SIZE) { - ErrorAbort(state, "%s too large for %s (max %d)", filename, name, MAX_FILE_GETPROP_SIZE); + ErrorAbort(state, kFileGetPropFailure, "%s too large for %s (max %d)", filename, name, + MAX_FILE_GETPROP_SIZE); goto done; } buffer = reinterpret_cast<char*>(malloc(st.st_size+1)); if (buffer == NULL) { - ErrorAbort(state, "%s: failed to alloc %zu bytes", name, + ErrorAbort(state, kFileGetPropFailure, "%s: failed to alloc %zu bytes", name, static_cast<size_t>(st.st_size+1)); goto done; } @@ -946,12 +953,13 @@ Value* FileGetPropFn(const char* name, State* state, int argc, Expr* argv[]) { FILE* f; f = ota_fopen(filename, "rb"); if (f == NULL) { - ErrorAbort(state, "%s: failed to open %s: %s", name, filename, strerror(errno)); + ErrorAbort(state, kFileOpenFailure, "%s: failed to open %s: %s", name, filename, + strerror(errno)); goto done; } if (ota_fread(buffer, 1, st.st_size, f) != static_cast<size_t>(st.st_size)) { - ErrorAbort(state, "%s: failed to read %zu bytes from %s", + ErrorAbort(state, kFreadFailure, "%s: failed to read %zu bytes from %s", name, static_cast<size_t>(st.st_size), filename); ota_fclose(f); goto done; @@ -1015,7 +1023,8 @@ Value* ApplyPatchSpaceFn(const char* name, State* state, size_t bytes; if (!android::base::ParseUint(bytes_str, &bytes)) { - ErrorAbort(state, "%s(): can't parse \"%s\" as byte count\n\n", name, bytes_str); + ErrorAbort(state, kArgsParsingFailure, "%s(): can't parse \"%s\" as byte count\n\n", + name, bytes_str); free(bytes_str); return nullptr; } @@ -1027,9 +1036,8 @@ Value* ApplyPatchSpaceFn(const char* name, State* state, Value* ApplyPatchFn(const char* name, State* state, int argc, Expr* argv[]) { if (argc < 6 || (argc % 2) == 1) { - return ErrorAbort(state, "%s(): expected at least 6 args and an " - "even number, got %d", - name, argc); + return ErrorAbort(state, kArgsParsingFailure, "%s(): expected at least 6 args and an " + "even number, got %d", name, argc); } char* source_filename; @@ -1043,7 +1051,8 @@ Value* ApplyPatchFn(const char* name, State* state, int argc, Expr* argv[]) { size_t target_size; if (!android::base::ParseUint(target_size_str, &target_size)) { - ErrorAbort(state, "%s(): can't parse \"%s\" as byte count", name, target_size_str); + ErrorAbort(state, kArgsParsingFailure, "%s(): can't parse \"%s\" as byte count", + name, target_size_str); free(source_filename); free(target_filename); free(target_sha1); @@ -1067,11 +1076,11 @@ Value* ApplyPatchFn(const char* name, State* state, int argc, Expr* argv[]) { for (int i = 0; i < patchcount; ++i) { if (patch_shas[i]->type != VAL_STRING) { - ErrorAbort(state, "%s(): sha-1 #%d is not string", name, i); + ErrorAbort(state, kArgsParsingFailure, "%s(): sha-1 #%d is not string", name, i); return nullptr; } if (patches[i]->type != VAL_BLOB) { - ErrorAbort(state, "%s(): patch #%d is not blob", name, i); + ErrorAbort(state, kArgsParsingFailure, "%s(): patch #%d is not blob", name, i); return nullptr; } } @@ -1094,7 +1103,7 @@ Value* ApplyPatchFn(const char* name, State* state, int argc, Expr* argv[]) { Value* ApplyPatchCheckFn(const char* name, State* state, int argc, Expr* argv[]) { if (argc < 1) { - return ErrorAbort(state, "%s(): expected at least 1 arg, got %d", + return ErrorAbort(state, kArgsParsingFailure, "%s(): expected at least 1 arg, got %d", name, argc); } @@ -1139,7 +1148,7 @@ Value* UIPrintFn(const char* name, State* state, int argc, Expr* argv[]) { Value* WipeCacheFn(const char* name, State* state, int argc, Expr* argv[]) { if (argc != 0) { - return ErrorAbort(state, "%s() expects no args, got %d", name, argc); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects no args, got %d", name, argc); } fprintf(((UpdaterInfo*)(state->cookie))->cmd_pipe, "wipe_cache\n"); return StringValue(strdup("t")); @@ -1147,7 +1156,7 @@ Value* WipeCacheFn(const char* name, State* state, int argc, Expr* argv[]) { Value* RunProgramFn(const char* name, State* state, int argc, Expr* argv[]) { if (argc < 1) { - return ErrorAbort(state, "%s() expects at least 1 arg", name); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects at least 1 arg", name); } char** args = ReadVarArgs(state, argc, argv); if (args == NULL) { @@ -1201,7 +1210,7 @@ Value* RunProgramFn(const char* name, State* state, int argc, Expr* argv[]) { // Value* Sha1CheckFn(const char* name, State* state, int argc, Expr* argv[]) { if (argc < 1) { - return ErrorAbort(state, "%s() expects at least 1 arg", name); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects at least 1 arg", name); } std::unique_ptr<Value*, decltype(&free)> arg_values(ReadValueVarArgs(state, argc, argv), free); @@ -1249,7 +1258,7 @@ Value* Sha1CheckFn(const char* name, State* state, int argc, Expr* argv[]) { // is actually a FileContents*). Value* ReadFileFn(const char* name, State* state, int argc, Expr* argv[]) { if (argc != 1) { - return ErrorAbort(state, "%s() expects 1 arg, got %d", name, argc); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects 1 arg, got %d", name, argc); } char* filename; if (ReadArgs(state, argv, 1, &filename) < 0) return NULL; @@ -1285,7 +1294,7 @@ Value* ReadFileFn(const char* name, State* state, int argc, Expr* argv[]) { // partition. Value* RebootNowFn(const char* name, State* state, int argc, Expr* argv[]) { if (argc != 2) { - return ErrorAbort(state, "%s() expects 2 args, got %d", name, argc); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects 2 args, got %d", name, argc); } char* filename; @@ -1311,7 +1320,7 @@ Value* RebootNowFn(const char* name, State* state, int argc, Expr* argv[]) { sleep(5); free(property); - ErrorAbort(state, "%s() failed to reboot", name); + ErrorAbort(state, kRebootFailure, "%s() failed to reboot", name); return NULL; } @@ -1327,7 +1336,7 @@ Value* RebootNowFn(const char* name, State* state, int argc, Expr* argv[]) { // bytes. Value* SetStageFn(const char* name, State* state, int argc, Expr* argv[]) { if (argc != 2) { - return ErrorAbort(state, "%s() expects 2 args, got %d", name, argc); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects 2 args, got %d", name, argc); } char* filename; @@ -1357,7 +1366,7 @@ Value* SetStageFn(const char* name, State* state, int argc, Expr* argv[]) { // is the block device for the misc partition. Value* GetStageFn(const char* name, State* state, int argc, Expr* argv[]) { if (argc != 1) { - return ErrorAbort(state, "%s() expects 1 arg, got %d", name, argc); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects 1 arg, got %d", name, argc); } char* filename; @@ -1375,7 +1384,7 @@ Value* GetStageFn(const char* name, State* state, int argc, Expr* argv[]) { Value* WipeBlockDeviceFn(const char* name, State* state, int argc, Expr* argv[]) { if (argc != 2) { - return ErrorAbort(state, "%s() expects 2 args, got %d", name, argc); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects 2 args, got %d", name, argc); } char* filename; @@ -1397,7 +1406,7 @@ Value* WipeBlockDeviceFn(const char* name, State* state, int argc, Expr* argv[]) Value* EnableRebootFn(const char* name, State* state, int argc, Expr* argv[]) { if (argc != 0) { - return ErrorAbort(state, "%s() expects no args, got %d", name, argc); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects no args, got %d", name, argc); } UpdaterInfo* ui = (UpdaterInfo*)(state->cookie); fprintf(ui->cmd_pipe, "enable_reboot\n"); @@ -1406,12 +1415,12 @@ Value* EnableRebootFn(const char* name, State* state, int argc, Expr* argv[]) { Value* Tune2FsFn(const char* name, State* state, int argc, Expr* argv[]) { if (argc == 0) { - return ErrorAbort(state, "%s() expects args, got %d", name, argc); + return ErrorAbort(state, kArgsParsingFailure, "%s() expects args, got %d", name, argc); } char** args = ReadVarArgs(state, argc, argv); if (args == NULL) { - return ErrorAbort(state, "%s() could not read args", name); + return ErrorAbort(state, kArgsParsingFailure, "%s() could not read args", name); } char** args2 = reinterpret_cast<char**>(malloc(sizeof(char*) * (argc+1))); @@ -1429,7 +1438,8 @@ Value* Tune2FsFn(const char* name, State* state, int argc, Expr* argv[]) { free(args2[0]); free(args2); if (result != 0) { - return ErrorAbort(state, "%s() returned error code %d", name, result); + return ErrorAbort(state, kTune2FsFailure, "%s() returned error code %d", + name, result); } return StringValue(strdup("t")); } |