allow toggling of software back menu item. add recovery checkpoint file. mount auto now uses busybox mount.
diff --git a/Android.mk b/Android.mk
index 55f7de7..9ecc2de 100644
--- a/Android.mk
+++ b/Android.mk
@@ -26,7 +26,7 @@
 
 LOCAL_FORCE_STATIC_EXECUTABLE := true
 
-RECOVERY_VERSION := ClockworkMod Recovery v2.0.2.2
+RECOVERY_VERSION := ClockworkMod Recovery v2.0.2.4
 LOCAL_CFLAGS := -DRECOVERY_VERSION="$(RECOVERY_VERSION)"
 RECOVERY_API_VERSION := 2
 LOCAL_CFLAGS += -DRECOVERY_API_VERSION=$(RECOVERY_API_VERSION)
diff --git a/common.h b/common.h
index 81d9029..6c60d07 100644
--- a/common.h
+++ b/common.h
@@ -47,6 +47,9 @@
 // statements will be displayed.
 void ui_end_menu();
 
+int ui_get_showing_back_button();
+void ui_set_showing_back_button(int showBackButton);
+
 // Set the icon (normally the only thing visible besides the progress bar).
 enum {
   BACKGROUND_ICON_NONE,
diff --git a/default_recovery_ui.c b/default_recovery_ui.c
index f189da4..8ee1239 100644
--- a/default_recovery_ui.c
+++ b/default_recovery_ui.c
@@ -37,11 +37,10 @@
     if (alt && key_code == KEY_L)
         return 1;
     // allow toggling of the display if the correct key is pressed, and the display toggle is allowed or the display is currently off
-#ifdef KEY_POWER_IS_SELECT_ITEM
-    return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_END);
-#else
+    if (ui_get_showing_back_button()) {
+        return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_END);
+    }
     return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_POWER || key_code == KEY_END);
-#endif
 }
 
 int device_reboot_now(volatile char* key_pressed, int key_code) {
@@ -59,9 +58,13 @@
             case KEY_VOLUMEUP:
                 return HIGHLIGHT_UP;
 
-#ifdef KEY_POWER_IS_SELECT_ITEM
             case KEY_POWER:
-#endif
+                if (ui_get_showing_back_button()) {
+                    return SELECT_ITEM;
+                }
+                if (!get_allow_toggle_display())
+                    return GO_BACK;
+                break;
             case KEY_ENTER:
             case BTN_MOUSE:
             case KEY_CENTER:
@@ -70,9 +73,6 @@
             case KEY_SEND:
                 return SELECT_ITEM;
             
-#ifndef KEY_POWER_IS_SELECT_ITEM
-            case KEY_POWER:
-#endif
             case KEY_END:
             case KEY_BACKSPACE:
             case KEY_BACK:
diff --git a/extendedcommands.c b/extendedcommands.c
index 9310d21..baa72c5 100644
--- a/extendedcommands.c
+++ b/extendedcommands.c
@@ -627,6 +627,7 @@
     char tmp[PATH_MAX];
     sprintf(tmp, "cp %s /tmp/%s", EXTENDEDCOMMAND_SCRIPT, basename(EXTENDEDCOMMAND_SCRIPT));
     __system(tmp);
+    __system("rm /sdcard/clockworkmod/.recoverycheckpoint");
     remove(EXTENDEDCOMMAND_SCRIPT);
     int i = 0;
     for (i = 20; i > 0; i--) {
diff --git a/recovery.c b/recovery.c
index 344ed46..34e02ab 100644
--- a/recovery.c
+++ b/recovery.c
@@ -317,12 +317,19 @@
     int selected = 0;
     int chosen_item = -1;
 
+    // Some users with dead enter keys need a way to turn on power to select.
+    // Jiggering across the wrapping menu is one "secret" way to enable it.
+    // We can't rely on /cache or /sdcard since they may not be available.
+    int wrap_count = 0;
+
     while (chosen_item < 0 && chosen_item != GO_BACK) {
         int key = ui_wait_key();
         int visible = ui_text_visible();
 
         int action = device_handle_key(key, visible);
 
+        int old_selected = selected;
+
         if (action < 0) {
             switch (action) {
                 case HIGHLIGHT_UP:
@@ -335,11 +342,11 @@
                     break;
                 case SELECT_ITEM:
                     chosen_item = selected;
-#ifdef KEY_POWER_IS_SELECT_ITEM
-                    if (chosen_item == item_count) {
-                        chosen_item = GO_BACK;
+                    if (ui_get_showing_back_button()) {
+                        if (chosen_item == item_count) {
+                            chosen_item = GO_BACK;
+                        }
                     }
-#endif
                     break;
                 case NO_ACTION:
                     break;
@@ -350,6 +357,21 @@
         } else if (!menu_only) {
             chosen_item = action;
         }
+
+        if (abs(selected - old_selected) > 1) {
+            wrap_count++;
+            if (wrap_count == 3) {
+                wrap_count = 0;
+                if (ui_get_showing_back_button()) {
+                    ui_print("Back button disabled.\n");
+                    ui_set_showing_back_button(0);
+                }
+                else {
+                    ui_print("Back button enabled.\n");
+                    ui_set_showing_back_button(1);
+                }
+            }
+        }
     }
 
     ui_end_menu();
diff --git a/roots.c b/roots.c
index d54de2d..da10ee7 100644
--- a/roots.c
+++ b/roots.c
@@ -21,6 +21,8 @@
 #include <sys/types.h>
 #include <unistd.h>
 
+#include <limits.h>
+
 #include "mtdutils/mtdutils.h"
 #include "mtdutils/mounts.h"
 #include "minzip/Zip.h"
@@ -205,6 +207,18 @@
     return internal_root_mounted(info) >= 0;
 }
 
+static int mount_internal(const char* device, const char* mount_point, const char* filesystem)
+{
+    if (strcmp(filesystem, "auto") != 0) {
+        return mount(device, mount_point, filesystem, MS_NOATIME | MS_NODEV | MS_NODIRATIME, "");
+    }
+    else {
+        char mount_cmd[PATH_MAX];
+        sprintf(mount_cmd, "mount -onoatime,nodiratime,nodev %s %s", device, mount_point);
+        return __system(mount_cmd);
+    }
+}
+
 int
 ensure_root_path_mounted(const char *root_path)
 {
@@ -245,8 +259,7 @@
     }
 
     mkdir(info->mount_point, 0755);  // in case it doesn't already exist
-    if (mount(info->device, info->mount_point, info->filesystem,
-            MS_NOATIME | MS_NODEV | MS_NODIRATIME, "")) {
+    if (mount_internal(info->device, info->mount_point, info->filesystem)) {
         if (info->device2 == NULL) {
             LOGE("Can't mount %s\n(%s)\n", info->device, strerror(errno));
             return -1;
diff --git a/roots.h b/roots.h
index 40aef87..e777093 100644
--- a/roots.h
+++ b/roots.h
@@ -33,7 +33,7 @@
 #endif
 
 #ifndef SDEXT_FILESYSTEM
-#define SDEXT_FILESYSTEM "ext4"
+#define SDEXT_FILESYSTEM "auto"
 #endif
 
 #ifndef DATA_DEVICE
diff --git a/ui.c b/ui.c
index 2e0ff83..fe56c5d 100644
--- a/ui.c
+++ b/ui.c
@@ -29,6 +29,12 @@
 #include "minui/minui.h"
 #include "recovery_ui.h"
 
+#ifdef KEY_POWER_IS_SELECT_ITEM
+static int gShowBackButton = 1;
+#else
+static int gShowBackButton = 0;
+#endif
+
 #define MAX_COLS 64
 #define MAX_ROWS 32 
 
@@ -511,10 +517,11 @@
             strncpy(menu[i] + MENU_ITEM_HEADER_LENGTH, items[i-menu_top], text_cols-1 - MENU_ITEM_HEADER_LENGTH);
             menu[i][text_cols-1] = '\0';
         }
-#ifdef KEY_POWER_IS_SELECT_ITEM
-        strcpy(menu[i], " - +++++Go Back+++++");
-        ++i;
-#endif
+
+        if (gShowBackButton) {
+            strcpy(menu[i], " - +++++Go Back+++++");
+            ++i;
+        }
 
         menu_items = i - menu_top;
         show_menu = 1;
@@ -522,11 +529,10 @@
         update_screen_locked();
     }
     pthread_mutex_unlock(&gUpdateMutex);
-#ifdef KEY_POWER_IS_SELECT_ITEM
-    return menu_items - 1;
-#else
+    if (gShowBackButton) {
+        return menu_items - 1;
+    }
     return menu_items;
-#endif
 }
 
 int ui_menu_select(int sel) {
@@ -602,3 +608,11 @@
 void ui_set_show_text(int value) {
     show_text = value;
 }
+
+void ui_set_showing_back_button(int showBackButton) {
+    gShowBackButton = showBackButton;
+}
+
+int ui_get_showing_back_button() {
+    return gShowBackButton;
+}
\ No newline at end of file