From 469243e53689b6f312d20813444dc00d83528758 Mon Sep 17 00:00:00 2001 From: Doug Zongker Date: Tue, 12 Apr 2011 09:28:10 -0700 Subject: [PATCH] save a last_install file with the result of the last package install attempt When installing a package, create /cache/recovery/last_install, which contains the filename of the package and a 1 or 0 for success or failure. Also, don't mount ext4 and vfat filesystems as read-only (on devices where /cache is ext4, we need it to be read-write). Change-Id: I0cf2a1921bbd65e06343aa74e2006577fac77c2c --- common.h | 3 +++ install.c | 26 ++++++++++++++++++++++++-- recovery.c | 2 +- roots.c | 5 ++--- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/common.h b/common.h index cba4c86..ef2fe9f 100644 --- a/common.h +++ b/common.h @@ -126,4 +126,7 @@ typedef struct { } UIParameters; +// fopen a file, mounting volumes and making parent dirs as necessary. +FILE* fopen_path(const char *path, const char *mode); + #endif // RECOVERY_COMMON_H diff --git a/install.c b/install.c index 5bb3a78..707cda4 100644 --- a/install.c +++ b/install.c @@ -36,6 +36,8 @@ #define ASSUMED_UPDATE_BINARY_NAME "META-INF/com/google/android/update-binary" #define PUBLIC_KEYS_FILE "/res/keys" +static const char *LAST_INSTALL_FILE = "/cache/recovery/last_install"; + // If the package contains an update binary, extract it and run it. static int try_update_binary(const char *path, ZipArchive *zip) { @@ -233,8 +235,8 @@ exit: return NULL; } -int -install_package(const char *path) +static int +really_install_package(const char *path) { ui_set_background(BACKGROUND_ICON_INSTALLING); ui_print("Finding update package...\n"); @@ -285,3 +287,23 @@ install_package(const char *path) ui_print("Installing update...\n"); return try_update_binary(path, &zip); } + +int +install_package(const char* path) +{ + FILE* install_log = fopen_path(LAST_INSTALL_FILE, "w"); + if (install_log) { + fputs(path, install_log); + fputc('\n', install_log); + } else { + LOGE("failed to open last_install: %s\n", strerror(errno)); + } + int result = really_install_package(path); + if (install_log) { + fputc(result == INSTALL_SUCCESS ? '1' : '0', install_log); + fputc('\n', install_log); + fclose(install_log); + chmod(LAST_INSTALL_FILE, 0644); + } + return result; +} diff --git a/recovery.c b/recovery.c index fd7ce42..3a412d5 100644 --- a/recovery.c +++ b/recovery.c @@ -120,7 +120,7 @@ static const int MAX_ARG_LENGTH = 4096; static const int MAX_ARGS = 100; // open a given path, mounting partitions as necessary -static FILE* +FILE* fopen_path(const char *path, const char *mode) { if (ensure_path_mounted(path) != 0) { LOGE("Can't mount %s\n", path); diff --git a/roots.c b/roots.c index 1143b76..cb7e067 100644 --- a/roots.c +++ b/roots.c @@ -177,15 +177,14 @@ int ensure_path_mounted(const char* path) { } else if (strcmp(v->fs_type, "ext4") == 0 || strcmp(v->fs_type, "vfat") == 0) { result = mount(v->device, v->mount_point, v->fs_type, - MS_NOATIME | MS_NODEV | MS_NODIRATIME | MS_RDONLY, ""); + MS_NOATIME | MS_NODEV | MS_NODIRATIME, ""); if (result == 0) return 0; if (v->device2) { LOGW("failed to mount %s (%s); trying %s\n", v->device, strerror(errno), v->device2); result = mount(v->device2, v->mount_point, v->fs_type, - MS_NOATIME | MS_NODEV | - MS_NODIRATIME | MS_RDONLY, ""); + MS_NOATIME | MS_NODEV | MS_NODIRATIME, ""); if (result == 0) return 0; }