static int do_cmdline(int argc, char *argv[]) { int i; char *inject_path = NULL; char *mrom_dir = NULL; int force_inject = 0; for(i = 1; i < argc; ++i) { if(strcmp(argv[i], "-v") == 0) { printf("%d\n", VERSION_TRAMPOLINE); fflush(stdout); return 0; } else if(strstartswith(argv[i], "--inject=")) inject_path = argv[i] + strlen("--inject="); else if(strstartswith(argv[i], "--mrom_dir=")) mrom_dir = argv[i] + strlen("--mrom_dir="); else if(strcmp(argv[i], "-f") == 0) force_inject = 1; } if(inject_path) { if(!mrom_dir) { printf("--mrom_dir=[path to multirom's data dir] needs to be specified!\n"); fflush(stdout); return 1; } mrom_set_dir(mrom_dir); mrom_set_log_tag("trampoline_inject"); return inject_bootimg(inject_path, force_inject); } printf("Usage: trampoline -v\n"); printf(" trampoline --inject=<path to boot.img> --mrom_dir=<path to multirom's data dir> [-f]\n"); return 1; }
int main(int argc, char *argv[]) { mrom_set_log_tag("fw_mounter"); struct fstab *f = fstab_load(FW_MOUNTER_FSTAB, 0); if(!f) { ERROR("Failed to load %s\n", FW_MOUNTER_FSTAB); return -1; } struct fstab_part *fw_part = fstab_find_first_by_path(f, "/firmware"); if(!fw_part) { ERROR("Unable to find partition /firmware in %s!\n", FW_MOUNTER_FSTAB); return -1; } ERROR("Mounting %s to %s\n", fw_part->device, fw_part->path); return mount_image(fw_part->device, fw_part->path, fw_part->type, fw_part->mountflags, fw_part->options); }
int main(int argc, const char *argv[]) { int i; const char *rom_to_boot = NULL; for(i = 1; i < argc; ++i) { if(strcmp(argv[i], "-v") == 0) { printf("%d%s apkL%d\n", VERSION_MULTIROM, VERSION_DEV_FIX, VERSION_APKL); fflush(stdout); return 0; } else if(strcmp(argv[i], "-apkL") == 0) { // Return all (internal and external) installed ROMs needed for the MultiROM Manager app // external partitions will be mounted to /mnt/mrom/APK and kept mounted so the app // can manipulate them, use "multirom -apkU" to unmount them when no longer needed // unmount everything in /mnt/mrom/APK first //multirom_apk_umount_usb(); int i; struct multirom_status s; memset(&s, 0, sizeof(struct multirom_status)); multirom_apk_get_roms(&s); for(i = 0; s.roms && s.roms[i]; ++i) { if (!s.roms[i]->partition) { // Internal ROMs printf("ROM: name=%s base=%s icon=%s\n", s.roms[i]->name, s.roms[i]->base_path, s.roms[i]->icon_path); } else { // External ROMs printf("ROM: name=%s base=%s icon=%s part_name=%s part_mount=%s part_uuid=%s part_fs=%s\n", s.roms[i]->name, s.roms[i]->base_path, s.roms[i]->icon_path, s.roms[i]->partition->name, s.roms[i]->partition->mount_path, s.roms[i]->partition->uuid, s.roms[i]->partition->fs); } } fflush(stdout); multirom_free_status(&s); return 0; } else if(strcmp(argv[i], "-apkU") == 0) { // Unmount all partitions mounted in /mnt/mrom/APK multirom_apk_umount_usb(); return 0; } else if(strncmp(argv[i], "--boot-rom=", sizeof("--boot-rom")) == 0) { rom_to_boot = argv[i] + sizeof("--boot-rom"); } } srand(time(0)); klog_init(); // output all messages to dmesg, // but it is possible to filter out INFO messages klog_set_level(6); mrom_set_log_tag("multirom"); ERROR("Running MultiROM v%d%s\n", VERSION_MULTIROM, VERSION_DEV_FIX); // root is mounted read only in android and MultiROM uses // it to store some temp files, so remount it. // Yes, there is better solution to this. if(rom_to_boot) mount(NULL, "/", NULL, MS_REMOUNT, NULL); int exit = multirom(rom_to_boot); if(rom_to_boot) mount(NULL, "/", NULL, MS_RDONLY | MS_REMOUNT, NULL); if(exit >= 0) { if(exit & EXIT_REBOOT_RECOVERY) do_reboot(REBOOT_RECOVERY); else if(exit & EXIT_REBOOT_BOOTLOADER) do_reboot(REBOOT_BOOTLOADER); else if(exit & EXIT_SHUTDOWN) do_reboot(REBOOT_SHUTDOWN); else if(exit & EXIT_REBOOT) do_reboot(REBOOT_SYSTEM); if(exit & EXIT_KEXEC) { do_kexec(); return 0; } // indicates trampoline to keep /realdata mounted if(!(exit & EXIT_UMOUNT)) close(open(KEEP_REALDATA, O_WRONLY | O_CREAT, 0000)); } return 0; }
int main(int argc, char *argv[]) { if (argc > 1) return do_cmdline(argc, argv); int res; static char *const cmd[] = { "/init", NULL }; umask(000); // Init only the little we need, leave the rest for real init mkdir("/dev", 0755); mkdir("/dev/pts", 0755); mkdir("/dev/socket", 0755); mkdir("/proc", 0755); mkdir("/sys", 0755); mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755"); mount("devpts", "/dev/pts", "devpts", 0, NULL); mount("proc", "/proc", "proc", 0, NULL); mount("sysfs", "/sys", "sysfs", 0, NULL); mount("pstore", "/sys/fs/pstore", "pstore", 0, NULL); #if MR_USE_DEBUGFS_MOUNT // Mount the debugfs kernel sysfs mkdir("/sys/kernel/debug", 0755); mount("debugfs", "/sys/kernel/debug", "debugfs", 0, NULL); #endif klog_init(); // output all messages to dmesg, // but it is possible to filter out INFO messages klog_set_level(6); mrom_set_log_tag("trampoline"); INFO("Running trampoline v%d\n", VERSION_TRAMPOLINE); if(is_charger_mode()) { INFO("Charger mode detected, skipping multirom\n"); goto run_main_init; } #if MR_DEVICE_HOOKS >= 3 tramp_hook_before_device_init(); #endif INFO("Initializing devices...\n"); devices_init(); INFO("Done initializing\n"); run_core(); // close and destroy everything devices_close(); run_main_init: umount("/dev/pts"); rmdir("/dev/pts"); rmdir("/dev/socket"); if(access(KEEP_REALDATA, F_OK) < 0) { umount("/dev"); } #if MR_USE_DEBUGFS_MOUNT umount("/sys/kernel/debug"); #endif umount("/proc"); umount("/sys/fs/pstore"); umount("/sys"); INFO("Running main_init\n"); fixup_symlinks(); chmod("/main_init", EXEC_MASK); rename("/main_init", "/init"); res = execve(cmd[0], cmd, NULL); ERROR("execve returned %d %d %s\n", res, errno, strerror(errno)); return 0; }
int main(int argc, const char *argv[]) { int i; const char *rom_to_boot = NULL; for(i = 1; i < argc; ++i) { if(strcmp(argv[i], "-v") == 0) { printf("%d%s\n", VERSION_MULTIROM, VERSION_DEV_FIX); fflush(stdout); return 0; } else if(strncmp(argv[i], "--boot-rom=", sizeof("--boot-rom")) == 0) { rom_to_boot = argv[i] + sizeof("--boot-rom"); } } srand(time(0)); klog_init(); // output all messages to dmesg, // but it is possible to filter out INFO messages klog_set_level(6); mrom_set_log_tag("multirom"); ERROR("Running MultiROM v%d%s\n", VERSION_MULTIROM, VERSION_DEV_FIX); // root is mounted read only in android and MultiROM uses // it to store some temp files, so remount it. // Yes, there is better solution to this. if(rom_to_boot) mount(NULL, "/", NULL, MS_REMOUNT, NULL); int exit = multirom(rom_to_boot); if(rom_to_boot) mount(NULL, "/", NULL, MS_RDONLY | MS_REMOUNT, NULL); if(exit >= 0) { if(exit & EXIT_REBOOT_RECOVERY) do_reboot(REBOOT_RECOVERY); else if(exit & EXIT_REBOOT_BOOTLOADER) do_reboot(REBOOT_BOOTLOADER); else if(exit & EXIT_SHUTDOWN) do_reboot(REBOOT_SHUTDOWN); else if(exit & EXIT_REBOOT) do_reboot(REBOOT_SYSTEM); if(exit & EXIT_KEXEC) { do_kexec(); return 0; } // indicates trampoline to keep /realdata mounted if(!(exit & EXIT_UMOUNT)) close(open(KEEP_REALDATA, O_WRONLY | O_CREAT, 0000)); } vt_set_mode(0); return 0; }
int main(int argc, char *argv[]) { int i, res; static char *const cmd[] = { "/init", NULL }; struct fstab *fstab = NULL; char *inject_path = NULL; char *mrom_dir = NULL; int force_inject = 0; for(i = 1; i < argc; ++i) { if(strcmp(argv[i], "-v") == 0) { printf("%d\n", VERSION_TRAMPOLINE); fflush(stdout); return 0; } else if(strstartswith(argv[i], "--inject=")) inject_path = argv[i] + strlen("--inject="); else if(strstartswith(argv[i], "--mrom_dir=")) mrom_dir = argv[i] + strlen("--mrom_dir="); else if(strcmp(argv[i], "-f") == 0) force_inject = 1; } if(inject_path) { if(!mrom_dir) { printf("--mrom_dir=[path to multirom's data dir] needs to be specified!\n"); fflush(stdout); return 1; } mrom_set_dir(mrom_dir); mrom_set_log_tag("trampoline_inject"); return inject_bootimg(inject_path, force_inject); } umask(000); // Init only the little we need, leave the rest for real init mkdir("/dev", 0755); mkdir("/dev/pts", 0755); mkdir("/dev/socket", 0755); mkdir("/proc", 0755); mkdir("/sys", 0755); mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755"); mount("devpts", "/dev/pts", "devpts", 0, NULL); mount("proc", "/proc", "proc", 0, NULL); mount("sysfs", "/sys", "sysfs", 0, NULL); mount("pstore", "/sys/fs/pstore", "pstore", 0, NULL); #if MR_USE_DEBUGFS_MOUNT // Mount the debugfs kernel sysfs mkdir("/sys/kernel/debug", 0755); mount("debugfs", "/sys/kernel/debug", "debugfs", 0, NULL); #endif klog_init(); // output all messages to dmesg, // but it is possible to filter out INFO messages klog_set_level(6); mrom_set_log_tag("trampoline"); INFO("Running trampoline v%d\n", VERSION_TRAMPOLINE); if(is_charger_mode()) { INFO("Charger mode detected, skipping multirom\n"); goto run_main_init; } #if MR_DEVICE_HOOKS >= 3 tramp_hook_before_device_init(); #endif INFO("Initializing devices...\n"); devices_init(); INFO("Done initializing\n"); if(wait_for_file("/dev/graphics/fb0", 5) < 0) { ERROR("Waiting too long for fb0"); goto exit; } #ifdef MR_POPULATE_BY_NAME_PATH //nkk71 M7 hack Populate_ByName_using_emmc(); #endif fstab = fstab_auto_load(); if(!fstab) goto exit; #if 0 fstab_dump(fstab); //debug #endif // mount and run multirom from sdcard if(mount_and_run(fstab) < 0 && mrom_is_second_boot()) { ERROR("This is second boot and we couldn't mount /data, reboot!\n"); sync(); android_reboot(ANDROID_RB_RESTART, 0, 0); while(1) sleep(1); } exit: if(fstab) fstab_destroy(fstab); // close and destroy everything devices_close(); run_main_init: umount("/dev/pts"); rmdir("/dev/pts"); rmdir("/dev/socket"); if(access(KEEP_REALDATA, F_OK) < 0) { umount(REALDATA); umount("/dev"); rmdir(REALDATA); encryption_destroy(); } encryption_cleanup(); #if MR_USE_DEBUGFS_MOUNT umount("/sys/kernel/debug"); #endif umount("/proc"); umount("/sys/fs/pstore"); umount("/sys"); INFO("Running main_init\n"); fixup_symlinks(); chmod("/main_init", EXEC_MASK); rename("/main_init", "/init"); res = execve(cmd[0], cmd, NULL); ERROR("execve returned %d %d %s\n", res, errno, strerror(errno)); return 0; }
int main(int argc, char *argv[]) { int i; int res = 1; int cmd = CMD_NONE; int stdout_fd; char footer_location[256]; struct fstab *fstab; struct fstab_part *p; char *argument = NULL; klog_init(); // output all messages to dmesg, // but it is possible to filter out INFO messages klog_set_level(6); mrom_set_log_tag("trampoline_encmnt"); mrom_set_dir("/mrom_enc/"); for(i = 1; i < argc; ++i) { if(!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) { print_help(argv); return 0; } else if(cmd == CMD_NONE) { if(strcmp(argv[i], "decrypt") == 0) cmd = CMD_DECRYPT; else if(strcmp(argv[i], "remove") == 0) cmd = CMD_REMOVE; else if(strcmp(argv[i], "pwtype") == 0) cmd = CMD_PWTYPE; } else if(!argument) { argument = argv[i]; } } if(argc == 1 || cmd == CMD_NONE) { print_help(argv); return 0; } fstab = fstab_auto_load(); if(!fstab) { ERROR("Failed to load fstab!"); return 1; } p = fstab_find_first_by_path(fstab, "/data"); if(!p) { ERROR("Failed to find /data partition in fstab\n"); goto exit; } strcpy(footer_location, ""); if(p->options != NULL && get_footer_from_opts(footer_location, sizeof(footer_location), p->options) < 0) goto exit; if(p->options2 != NULL && strcmp(footer_location, "") == 0 && get_footer_from_opts(footer_location, sizeof(footer_location), p->options2) < 0) goto exit; INFO("Setting encrypted partition data to %s %s %s\n", p->device, footer_location, p->type); set_partition_data(p->device, footer_location, p->type); // cryptfs prints informations, we don't want that stdout_fd = dup(1); freopen("/dev/null", "ae", stdout); switch(cmd) { case CMD_PWTYPE: if(handle_pwtype(stdout_fd) < 0) goto exit; break; case CMD_DECRYPT: if(handle_decrypt(stdout_fd, argument) < 0) goto exit; break; case CMD_REMOVE: if(handle_remove() < 0) goto exit; break; } res = 0; exit: fstab_destroy(fstab); return res; }