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
This commit is contained in:
parent
3ed8e18721
commit
469243e536
3
common.h
3
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
|
||||
|
26
install.c
26
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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
5
roots.c
5
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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user