fstab_rec* volume_for_label(const char* label) { int i; for (i = 0; i < get_num_volumes(); i++) { fstab_rec* v = get_device_volumes() + i; if (v->label && !strcmp(v->label, label)) { return v; } } return NULL; }
int get_num_extra_volumes() { int num = 0; int i; for (i = 0; i < get_num_volumes(); i++) { Volume* v = get_device_volumes() + i; if ((strcmp("/external_sd", v->mount_point) == 0) || ((strcmp(get_primary_storage_path(), v->mount_point) != 0) && fs_mgr_is_voldmanaged(v) && vold_is_volume_available(v->mount_point))) num++; } return num; }
void setup_data_media() { int i; char* mount_point = "/sdcard"; for (i = 0; i < get_num_volumes(); i++) { Volume* vol = get_device_volumes() + i; if (strcmp(vol->fs_type, "datamedia") == 0) { mount_point = vol->mount_point; break; } } rmdir(mount_point); mkdir("/data/media", 0755); symlink("/data/media", mount_point); }
int is_data_media() { int i; int has_sdcard = 0; for (i = 0; i < get_num_volumes(); i++) { Volume* vol = get_device_volumes() + i; if (strcmp(vol->fs_type, "datamedia") == 0) return 1; if (strcmp(vol->mount_point, "/sdcard") == 0) has_sdcard = 1; if (fs_mgr_is_voldmanaged(vol) && (strcmp(vol->mount_point, "/storage/sdcard0") == 0)) has_sdcard = 1; } return !has_sdcard; }
storage_item* get_storage_items() { storage_item* items = (storage_item*)calloc(MAX_NUM_MANAGED_VOLUMES+1, sizeof(storage_item)); int i; storage_item* item = items; if (is_data_media()) { item->vol = volume_for_path("/data"); item->label = strdup("internal storage"); item->path = strdup("/data/media"); ++item; } for (i = 0; i < get_num_volumes(); i++) { fstab_rec* v = get_device_volumes() + i; // Internal storage was allocated above if (strcmp(v->fs_type, "datamedia") == 0) continue; if (strcmp(v->mount_point, "/external_sd") == 0 || strncmp(v->mount_point, "/sdcard", 7) == 0) { item->vol = v; item->label = strdup(&v->mount_point[1]); item->path = strdup(v->mount_point); ++item; } else if (strncmp(v->mount_point, "/mnt/media_rw/sdcard", 20) == 0) { item->vol = v; item->label = strdup(&v->mount_point[14]); item->path = strdup(v->mount_point); ++item; } else if (fs_mgr_is_voldmanaged(v) && strncmp(v->label, "sdcard", 6) == 0) { char* path = (char*)malloc(9+strlen(v->label)+1); sprintf(path, "/storage/%s", v->label); if (vold_is_volume_available(path)) { item->vol = v; item->label = strdup(v->label); item->path = strdup(path); ++item; } free(path); } } return items; }
void show_partition_menu() { static char* headers[] = { "Mounts and Storage Menu", "", 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] = NULL; } else { options[mountable_volumes + formatable_volumes] = "format /data and /data/media (/sdcard)"; 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)) { if (!is_data_media()) { show_mount_usb_storage_menu(); } else { if (!confirm_selection("format /data and /data/media (/sdcard)", confirm)) continue; ignore_data_media_workaround(1); ui_print("Formatting /data...\n"); if (0 != format_volume("/data")) ui_print("Error formatting /data!\n"); else ui_print("Done.\n"); ignore_data_media_workaround(0); } } 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); }
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[] = { "分区挂载和U盘模式", "", 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, "挂载 %s", v->mount_point); sprintf(&mount_menu[mountable_volumes].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, "格式化 %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, "格式化 %s", v->mount_point); format_menu[formatable_volumes].v = &device_volumes[i]; ++formatable_volumes; } } static char* confirm_format = "确定格式化?"; static char* confirm = "是 - 格式化该分区"; 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] = "挂载U盘模式"; options[mountable_volumes + formatable_volumes + 1] = NULL; } else { options[mountable_volumes + formatable_volumes] = "格式化 /data and /data/media (/sdcard)"; 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)) { if (!is_data_media()) { show_mount_usb_storage_menu(); } else { if (!confirm_selection("格式化 /data 和 /data/media (/sdcard)", confirm)) continue; handle_data_media_format(1); ui_print("格式化DATA分区(/data)...\n"); if (0 != format_volume("/data")) ui_print("格式化DATA(/data)分区失败!\n"); else ui_print("格式化完成!\n"); handle_data_media_format(0); } } 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("卸载%s失败!\n", v->mount_point); } else { if (0 != ensure_path_mounted(v->mount_point)) ui_print("挂载%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("正在格式化%s...\n", v->mount_point); if (0 != format_volume(v->mount_point)) ui_print("格式化%s失败!\n", v->mount_point); else ui_print("格式化完成!\n"); } } free(mount_menu); free(format_menu); }