readd ext2/ext3 format support.

Change-Id: I58652abaea8f7a52b70bc1b14aec5b530fe70382
diff --git a/extendedcommands.c b/extendedcommands.c
index d9589a4..a6db1d5 100644
--- a/extendedcommands.c
+++ b/extendedcommands.c
@@ -390,8 +390,69 @@
     return chosen_item == 7;
 }
 
-int format_unknown_device(const char* path)
+#define MKE2FS_BIN      "/sbin/mke2fs"
+#define TUNE2FS_BIN     "/sbin/tune2fs"
+#define E2FSCK_BIN      "/sbin/e2fsck"
+
+static int
+format_ext3_device (const char *device) {
+    // Run mke2fs
+    char *const mke2fs[] = {MKE2FS_BIN, "-j", device, NULL};
+    if(run_exec_process(mke2fs))
+        return -1;
+
+    // Run tune2fs
+    char *const tune2fs[] = {TUNE2FS_BIN, "-j", "-C", "1", device, NULL};
+    if(run_exec_process(tune2fs))
+        return -1;
+
+    // Run e2fsck
+    char *const e2fsck[] = {E2FSCK_BIN, "-fy", device, NULL};
+    if(run_exec_process(e2fsck))
+        return -1;
+
+    return 0;
+}
+
+static int
+format_ext2_device (const char *device) {
+    // Run mke2fs
+    char *const mke2fs[] = {MKE2FS_BIN, device, NULL};
+    if(run_exec_process(mke2fs))
+        return -1;
+
+    // Run tune2fs
+    char *const tune2fs[] = {TUNE2FS_BIN, "-C", "1", device, NULL};
+    if(run_exec_process(tune2fs))
+        return -1;
+
+    // Run e2fsck
+    char *const e2fsck[] = {E2FSCK_BIN, "-fy", device, NULL};
+    if(run_exec_process(e2fsck))
+        return -1;
+
+    return 0;
+}
+
+
+int format_unknown_device(const char *device, const char* path, const char *fs_type)
 {
+    // device may simply be a name, like "system"
+    if (device[0] != '/')
+        return erase_partition(device, fs_type);
+    
+    if (strcmp("ext3", device) == 0) {
+        if (0 != ensure_path_unmounted(path))
+            return -11;
+        return format_ext3_device(device);
+    }
+    
+    if (strcmp("ext2", device) == 0) {
+        if (0 != ensure_path_unmounted(path))
+            return -12;
+        return format_ext2_device(device);
+    }
+
     // if this is SDEXT:, don't worry about it.
     if (0 == strcmp(path, "/sd-ext"))
     {
diff --git a/extendedcommands.h b/extendedcommands.h
index e9d7cc4..9297f83 100644
--- a/extendedcommands.h
+++ b/extendedcommands.h
@@ -37,8 +37,7 @@
 void
 show_advanced_menu();
 
-int
-format_unknown_device(const char* root);
+int format_unknown_device(const char *device, const char* path, const char *fs_type);
 
 void
 wipe_battery_stats();
diff --git a/mmcutils/mmcutils.c b/mmcutils/mmcutils.c
index 44fdcf2..de66090 100644
--- a/mmcutils/mmcutils.c
+++ b/mmcutils/mmcutils.c
@@ -299,7 +299,7 @@
 #define TUNE2FS_BIN     "/sbin/tune2fs"
 #define E2FSCK_BIN      "/sbin/e2fsck"
 
-static int
+int
 run_exec_process ( char **argv) {
     pid_t pid;
     int status;
diff --git a/roots.c b/roots.c
index 45e0727..61c7498 100644
--- a/roots.c
+++ b/roots.c
@@ -217,7 +217,8 @@
         LOGE("can't give path \"%s\" to format_volume\n", volume);
         return -1;
 #endif
-        return format_unknown_device(volume);
+        printf("Formatting volume %s of fs type %s\n", volume, v->fs_type);
+        return format_unknown_device(v->device, volume, v->fs_type);
     }
 
     if (ensure_path_unmounted(volume) != 0) {