static bool reboot_service_impl(int fd, const char* arg) { const char* reboot_arg = arg; bool auto_reboot = false; if (strcmp(reboot_arg, "sideload-auto-reboot") == 0) { auto_reboot = true; reboot_arg = "sideload"; } // It reboots into sideload mode by setting "--sideload" or "--sideload_auto_reboot" // in the command file. if (strcmp(reboot_arg, "sideload") == 0) { if (getuid() != 0) { WriteFdExactly(fd, "'adb root' is required for 'adb reboot sideload'.\n"); return false; } const char* const recovery_dir = "/cache/recovery"; const char* const command_file = "/cache/recovery/command"; // Ensure /cache/recovery exists. if (adb_mkdir(recovery_dir, 0770) == -1 && errno != EEXIST) { D("Failed to create directory '%s': %s", recovery_dir, strerror(errno)); return false; } bool write_status = android::base::WriteStringToFile( auto_reboot ? "--sideload_auto_reboot" : "--sideload", command_file); if (!write_status) { return false; } reboot_arg = "recovery"; } sync(); char property_val[PROPERTY_VALUE_MAX]; int ret = snprintf(property_val, sizeof(property_val), "reboot,%s", reboot_arg); if (ret >= static_cast<int>(sizeof(property_val))) { WriteFdFmt(fd, "reboot string too long: %d\n", ret); return false; } ret = property_set(ANDROID_RB_PROPERTY, property_val); if (ret < 0) { WriteFdFmt(fd, "reboot failed: %d\n", ret); return false; } return true; }
static int mkdirs(const char *name) { int ret; char *x = (char *)name + 1; for(;;) { x = adb_dirstart(x); if(x == 0) return 0; *x = 0; ret = adb_mkdir(name, 0775); *x = OS_PATH_SEPARATOR; if((ret < 0) && (errno != EEXIST)) { return ret; } x++; } return 0; }
static int mkdirs(char *path) { int ret; char *x = path + 1; for(;;) { x = adb_dirstart(x); if(x == 0) return 0; *x = 0; ret = adb_mkdir(path, 0775); *x = OS_PATH_SEPARATOR; if((ret < 0) && (errno != EEXIST)) { return ret; } x++; } return 0; }
static bool reboot_service_impl(int fd, const char* arg) { const char* reboot_arg = arg; bool auto_reboot = false; if (strcmp(reboot_arg, "sideload-auto-reboot") == 0) { auto_reboot = true; reboot_arg = "sideload"; } // It reboots into sideload mode by setting "--sideload" or "--sideload_auto_reboot" // in the command file. if (strcmp(reboot_arg, "sideload") == 0) { if (getuid() != 0) { WriteFdExactly(fd, "'adb root' is required for 'adb reboot sideload'.\n"); return false; } const char* const recovery_dir = "/cache/recovery"; const char* const command_file = "/cache/recovery/command"; // Ensure /cache/recovery exists. if (adb_mkdir(recovery_dir, 0770) == -1 && errno != EEXIST) { D("Failed to create directory '%s': %s", recovery_dir, strerror(errno)); return false; } bool write_status = android::base::WriteStringToFile( auto_reboot ? "--sideload_auto_reboot" : "--sideload", command_file); if (!write_status) { return false; } reboot_arg = "recovery"; } sync(); std::string reboot_string = android::base::StringPrintf("reboot,%s", reboot_arg); if (!android::base::SetProperty(ANDROID_RB_PROPERTY, reboot_string)) { WriteFdFmt(fd, "reboot (%s) failed\n", reboot_string.c_str()); return false; } return true; }
static int mkdirs(char *name) { int ret; char *x = name + 1; if(name[0] != '/') return -1; for(;;) { x = adb_dirstart(x); if(x == 0) return 0; *x = 0; ret = adb_mkdir(name, 0775); if((ret < 0) && (errno != EEXIST)) { D("mkdir(\"%s\") -> %s\n", name, strerror(errno)); *x = '/'; return ret; } *x++ = '/'; } return 0; }