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
diff --git a/common.h b/common.h
index cba4c86..ef2fe9f 100644
--- a/common.h
+++ b/common.h
@@ -126,4 +126,7 @@
 
 } 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 @@
     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 @@
     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_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 @@
     } 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;
         }