support backup and restore on internal sdcard

Change-Id: I6295b5bb7ada967ca223758be58d555c1a2ff462
diff --git a/extendedcommands.c b/extendedcommands.c
index 2b6d5c3..9e63782 100644
--- a/extendedcommands.c
+++ b/extendedcommands.c
@@ -333,10 +333,10 @@
         install_zip(file);
 }
 
-void show_nandroid_restore_menu()
+void show_nandroid_restore_menu(const char* path)
 {
-    if (ensure_path_mounted("/sdcard") != 0) {
-        LOGE ("Can't mount /sdcard\n");
+    if (ensure_path_mounted(path) != 0) {
+        LOGE("Can't mount %s\n", path);
         return;
     }
 
@@ -345,7 +345,9 @@
                                 NULL
     };
 
-    char* file = choose_file_menu("/sdcard/clockworkmod/backup/", NULL, headers);
+    char tmp[PATH_MAX];
+    sprintf(tmp, "%s/clockworkmod/backup/", path);
+    char* file = choose_file_menu(tmp, NULL, headers);
     if (file == NULL)
         return;
 
@@ -713,7 +715,7 @@
 
 }
 
-void show_nandroid_advanced_restore_menu()
+void show_nandroid_advanced_restore_menu(const char* path)
 {
     if (ensure_path_mounted("/sdcard") != 0) {
         LOGE ("Can't mount /sdcard\n");
@@ -792,12 +794,18 @@
                                 NULL
     };
 
-    static char* list[] = { "Backup",
-                            "Restore",
-                            "Advanced Restore",
+    static char* list[] = { "backup",
+                            "restore",
+                            "advanced restore",
+                            "backup to internal sdcard",
+                            "restore from internal sdcard",
+                            "advanced restore from internal sdcard",
                             NULL
     };
 
+    if (volume_for_path("/emmc") == NULL)
+        INSTALL_MENU_ITEMS[3] = NULL;
+
     int chosen_item = get_menu_selection(headers, list, 0, 0);
     switch (chosen_item)
     {
@@ -820,10 +828,34 @@
             }
             break;
         case 1:
-            show_nandroid_restore_menu();
+            show_nandroid_restore_menu("/sdcard");
             break;
         case 2:
-            show_nandroid_advanced_restore_menu();
+            show_nandroid_advanced_restore_menu("/sdcard");
+            break;
+        case 3:
+            {
+                char backup_path[PATH_MAX];
+                time_t t = time(NULL);
+                struct tm *tmp = localtime(&t);
+                if (tmp == NULL)
+                {
+                    struct timeval tp;
+                    gettimeofday(&tp, NULL);
+                    sprintf(backup_path, "/emmc/clockworkmod/backup/%d", tp.tv_sec);
+                }
+                else
+                {
+                    strftime(backup_path, sizeof(backup_path), "/emmc/clockworkmod/backup/%F.%H.%M.%S", tmp);
+                }
+                nandroid_backup(backup_path);
+            }
+            break;
+        case 4:
+            show_nandroid_restore_menu("/emmc");
+            break;
+        case 5:
+            show_nandroid_advanced_restore_menu("/emmc");
             break;
     }
 }
@@ -1048,9 +1080,8 @@
          write_fstab_root("/boot", file);
     write_fstab_root("/cache", file);
     write_fstab_root("/data", file);
-    if (has_datadata()) {
-        write_fstab_root("/datadata", file);
-    }
+    write_fstab_root("/datadata", file);
+    write_fstab_root("/emmc", file);
     write_fstab_root("/system", file);
     write_fstab_root("/sdcard", file);
     write_fstab_root("/sd-ext", file);