int mount_fstab_main(int argc, char *argv[]) { int opt; static struct option long_options[] = { {"help", no_argument, 0, 'h'}, {0, 0, 0, 0} }; int long_index = 0; while ((opt = getopt_long(argc, argv, "h", long_options, &long_index)) != -1) { switch (opt) { case 'h': mount_fstab_usage(0); return EXIT_SUCCESS; default: mount_fstab_usage(1); return EXIT_FAILURE; } } // We only expect one argument if (argc - optind != 1) { mount_fstab_usage(1); return EXIT_FAILURE; } // Use the kernel log since logcat hasn't run yet util::log_set_logger(std::make_shared<util::KmsgLogger>()); // Patch SELinux policy if (!patch_loaded_sepolicy()) { LOGE("Failed to patch loaded SELinux policy. Continuing anyway"); } else { LOGV("SELinux policy patching completed"); } #if FORCE_SELINUX_PERMISSIVE int fd = open("/sys/fs/selinux/enforce", O_RDWR); if (fd > 0) { write(fd, "0", 1); close(fd); } #endif if (!mount_fstab(argv[optind])) { LOGE("Failed to mount filesystems. Rebooting into recovery"); reboot_directly("recovery"); return EXIT_FAILURE; } return EXIT_SUCCESS; }
static bool emergency_reboot() { util::vibrate(100, 150); util::vibrate(100, 150); util::vibrate(100, 150); util::vibrate(100, 150); util::vibrate(100, 150); LOGW("--- EMERGENCY REBOOT FROM MBTOOL ---"); // Some devices don't have /proc/last_kmsg, so we'll attempt to save the // kernel log to /data/media/0/MultiBoot/kernel.log if (!util::is_mounted("/data")) { LOGW("/data is not mounted. Attempting to mount /data"); struct stat sb; // Try mounting /data in case we couldn't get through the fstab mounting // steps. (This is an ugly brute force method...) for (const char **ptr = data_block_devs; *ptr; ++ptr) { const char *block_dev = *ptr; if (stat(block_dev, &sb) < 0) { continue; } if (mount(block_dev, "/data", "ext4", 0, "") == 0 || mount(block_dev, "/data", "f2fs", 0, "") == 0) { LOGW("Mounted %s at /data", block_dev); break; } } } LOGW("Dumping kernel log to %s", MULTIBOOT_LOG_KERNEL); // Remove old log remove(MULTIBOOT_LOG_KERNEL); // Write new log util::mkdir_parent(MULTIBOOT_LOG_KERNEL, 0775); dump_kernel_log(MULTIBOOT_LOG_KERNEL); // Set file attributes on log file fix_multiboot_permissions(); sync(); umount("/data"); // Does not return if successful reboot_directly("recovery"); return false; }