void show_partition_menu()
{
    static char* headers[3];
	headers[0] = showpartitionheader;
	headers[1] = "\n";
	headers[2] = NULL;

    static MountMenuEntry* mount_menue = NULL;
    static FormatMenuEntry* format_menue = NULL;

    typedef char* string;

    int i, mountable_volumes, formatable_volumes;
    int num_volumes;
    Volume* device_volumes;

    num_volumes = get_num_volumes();
    device_volumes = get_device_volumes();

    string options[255];

    if(!device_volumes)
		return;

		mountable_volumes = 0;
		formatable_volumes = 0;

		mount_menue = malloc(num_volumes * sizeof(MountMenuEntry));
		format_menue = malloc(num_volumes * sizeof(FormatMenuEntry));

		for (i = 0; i < num_volumes; ++i) {
  			Volume* v = &device_volumes[i];
  			if(strcmp("ramdisk", v->fs_type) != 0 && strcmp("mtd", v->fs_type) != 0 && strcmp("emmc", v->fs_type) != 0 && strcmp("bml", v->fs_type) != 0) {
					if (is_safe_to_mount(v->mount_point)) {
						sprintf(&mount_menue[mountable_volumes].mount, "Mount %s", v->mount_point);
						sprintf(&mount_menue[mountable_volumes].unmount, "Unmount %s", v->mount_point);
						mount_menue[mountable_volumes].v = &device_volumes[i];
						++mountable_volumes;
					}
    				if (is_safe_to_format(v->mount_point)) {
      					sprintf(&format_menue[formatable_volumes].txt, "Erase %s", v->mount_point);
      					format_menue[formatable_volumes].v = &device_volumes[i];
      					++formatable_volumes;
    				}
  		  }
  		  else if (strcmp("ramdisk", v->fs_type) != 0 && strcmp("mtd", v->fs_type) == 0 && is_safe_to_format(v->mount_point))
  		  {
    				sprintf(&format_menue[formatable_volumes].txt, "Erase %s", v->mount_point);
    				format_menue[formatable_volumes].v = &device_volumes[i];
    				++formatable_volumes;
  			}
		}


    static char* confirm_format  = "Confirm format?";
    static char* confirm = "Yes - Format";
    char confirm_string[255];

    for (;;)
    {
		for (i = 0; i < mountable_volumes; i++)
		{
			MountMenuEntry* e = &mount_menue[i];
			Volume* v = e->v;
			if(is_path_mounted(v->mount_point))
				options[i] = e->unmount;
			else
				options[i] = e->mount;
		}

		for (i = 0; i < formatable_volumes; i++)
		{
			FormatMenuEntry* e = &format_menue[i];

			options[mountable_volumes+i] = e->txt;
		}

		options[mountable_volumes+formatable_volumes] = "Erase dalvik-cache";
		options[mountable_volumes+formatable_volumes + 1] = NULL;

        int chosen_item = get_menu_selection(headers, &options, 0, 0);
        if (chosen_item == GO_BACK)
            break;
        if (chosen_item == (mountable_volumes+formatable_volumes))
        {
            erase_dalvik_cache(0);
        }
        else if (chosen_item < mountable_volumes)
        {
			MountMenuEntry* e = &mount_menue[chosen_item];
            Volume* v = e->v;

            if (is_path_mounted(v->mount_point))
            {
                if (0 != ensure_path_unmounted(v->mount_point))
                    ui_print("%s %s!\n", unmounterror, v->mount_point);
            }
            else
            {
                if (0 != ensure_path_mounted(v->mount_point))
                    ui_print("%s %s!\n", mounterror, v->mount_point);
            }
        }
        else if (chosen_item < (mountable_volumes + formatable_volumes))
        {
            chosen_item = chosen_item - mountable_volumes;
            FormatMenuEntry* e = &format_menue[chosen_item];
            Volume* v = e->v;

            sprintf(confirm_string, "%s - %s", v->mount_point, confirm_format);

            if (!confirm_selection(confirm_string, confirm))
                continue;
            ui_print("Formatting %s...\n", v->mount_point);
            if (0 != format_volume(v->mount_point))
                ui_print("Error formatting %s!\n", v->mount_point);
            else
                ui_print("%s\n", done);
        }
    }
    free(mount_menue);
    free(format_menue);
}
void show_partition_menu()
{
    static char* headers[] = {  "Storage Management",
                                "",
                                NULL
    };

    static MountMenuEntry* mount_menu = NULL;
    static FormatMenuEntry* format_menu = NULL;

    typedef char* string;

    int i, mountable_volumes, formatable_volumes;
    int num_volumes;
    Volume* device_volumes;

    num_volumes = get_num_volumes();
    device_volumes = get_device_volumes();

    string options[255];

    if(!device_volumes)
        return;

    mountable_volumes = 0;
    formatable_volumes = 0;

    mount_menu = malloc(num_volumes * sizeof(MountMenuEntry));
    format_menu = malloc(num_volumes * sizeof(FormatMenuEntry));

    for (i = 0; i < num_volumes; ++i) {
        Volume* v = &device_volumes[i];
        if(strcmp("ramdisk", v->fs_type) != 0 && strcmp("mtd", v->fs_type) != 0 && strcmp("emmc", v->fs_type) != 0 && strcmp("bml", v->fs_type) != 0) {
			if(strcmp("datamedia", v->fs_type) != 0) {
				sprintf(&mount_menu[mountable_volumes].mount, "Mount %s", v->mount_point);
				sprintf(&mount_menu[mountable_volumes].unmount, "Unmount %s", v->mount_point);
				mount_menu[mountable_volumes].v = &device_volumes[i];
				++mountable_volumes;
			}
            if (is_safe_to_format(v->mount_point)) {
                sprintf(&format_menu[formatable_volumes].txt, "Format %s", v->mount_point);
                format_menu[formatable_volumes].v = &device_volumes[i];
                ++formatable_volumes;
            }
        }
        else if (strcmp("ramdisk", v->fs_type) != 0 && strcmp("mtd", v->fs_type) == 0 && is_safe_to_format(v->mount_point))
        {
            sprintf(&format_menu[formatable_volumes].txt, "Format %s", v->mount_point);
            format_menu[formatable_volumes].v = &device_volumes[i];
            ++formatable_volumes;
        }
    }

    static char* confirm_format  = "Confirm format?";
    static char* confirm = "Yes - Format";
    char confirm_string[255];

    for (;;) {
        for (i = 0; i < mountable_volumes; i++) {
            MountMenuEntry* e = &mount_menu[i];
            Volume* v = e->v;
            if(is_path_mounted(v->mount_point))
                options[i] = e->unmount;
            else
                options[i] = e->mount;
        }
        for (i = 0; i < formatable_volumes; i++) {
            FormatMenuEntry* e = &format_menu[i];
            options[mountable_volumes+i] = e->txt;
        }

        if (!is_data_media()) {
			options[mountable_volumes + formatable_volumes] = "Mount USB Storage";
			options[mountable_volumes + formatable_volumes + 1] = "Erase dalvik-cache";
        } else {
			options[mountable_volumes + formatable_volumes] = "Erase dalvik-cache";
			options[mountable_volumes + formatable_volumes + 1] = "Format /data and /data/media (/sdcard)";
        }
		if (!can_partition("/sdcard")) {
			options[mountable_volumes + formatable_volumes + 1 + 1] = NULL;
		}
		if (!can_partition("/external_sd")) {
			options[mountable_volumes + formatable_volumes + 1 + 1 + 1] = NULL;
		}
		if (!can_partition("/emmc")) {
			options[mountable_volumes + formatable_volumes + 1 + 1 + 1 + 1] = NULL;
		}
		options[mountable_volumes + formatable_volumes + 1 + 1 + 1 + 1 + 1] = NULL;


        int chosen_item = get_menu_selection(headers, &options, 0, 0);
        if (chosen_item == GO_BACK)
            break;
        if (chosen_item == (mountable_volumes+formatable_volumes)) {
			if (!is_data_media()) {
				show_mount_usb_storage_menu();
			} else {
				if(!confirm_selection("Confirm wipe?", "Yes - Wipe Dalvik Cache"))
					continue;
				erase_dalvik_cache(NULL);
			}
		} else if (chosen_item == (mountable_volumes+formatable_volumes + 1)) {
			if (!is_data_media()) {
				if(!confirm_selection("Confirm wipe?", "Yes - Wipe Dalvik Cache"))
					continue;
				erase_dalvik_cache(NULL);
			} else {
				if (!confirm_selection("format /data and /data/media (/sdcard)", "Yes - Format"))
					continue;
				handle_data_media_format(1);
				ui_print("Formatting /data...\n");

				if (0 != format_volume("/data"))
					ui_print("Error formatting /data!\n");
				else
					ui_print("Done.\n");

				handle_data_media_format(0);
			}
		} else if (chosen_item == (mountable_volumes+formatable_volumes + 1 + 1)) {
				partition_sdcard("/sdcard");
		} else if (chosen_item == (mountable_volumes+formatable_volumes + 1 + 1 + 1)) {
				partition_sdcard("/external_sd");
		} else if (chosen_item == (mountable_volumes+formatable_volumes + 1 + 1 + 1 + 1)) {
				partition_sdcard("/emmc");
        } else if (chosen_item < mountable_volumes) {
            MountMenuEntry* e = &mount_menu[chosen_item];
            Volume* v = e->v;

            if (is_path_mounted(v->mount_point)) {
                if (0 != ensure_path_unmounted(v->mount_point))
                    ui_print("Error unmounting %s!\n", v->mount_point);
            } else {
                if (0 != ensure_path_mounted(v->mount_point))
                    ui_print("Error mounting %s!\n",  v->mount_point);
            }
        }
        else if (chosen_item < (mountable_volumes + formatable_volumes)) {
            chosen_item = chosen_item - mountable_volumes;
            FormatMenuEntry* e = &format_menu[chosen_item];
            Volume* v = e->v;

            sprintf(confirm_string, "%s - %s", v->mount_point, confirm_format);

            if (!confirm_selection(confirm_string, confirm))
                continue;
            ui_print("Formatting %s...\n", v->mount_point);
            if (0 != format_volume(v->mount_point))
                ui_print("Error formatting %s!\n", v->mount_point);
            else
                ui_print("Done.\n");
        }
    }

    free(mount_menu);
    free(format_menu);
}