int postcommand_cb(irecv_client_t client, const irecv_event_t* event) { char* value = NULL; char* action = NULL; char* command = NULL; char* argument = NULL; irecv_error_t error = IRECV_E_SUCCESS; if (event->type == IRECV_POSTCOMMAND) { command = strdup(event->data); action = strtok(command, " "); if (!strcmp(action, "getenv")) { argument = strtok(NULL, " "); error = irecv_getenv(client, argument, &value); if (error != IRECV_E_SUCCESS) { debug("%s\n", irecv_strerror(error)); free(command); return error; } printf("%s\n", value); free(value); } if (!strcmp(action, "reboot")) { quit = 1; } } if (command) free(command); return 0; }
int recovery_send_ramdisk(struct idevicerestore_client_t* client, plist_t build_identity) { const char *component = "RestoreRamDisk"; irecv_error_t recovery_error = IRECV_E_SUCCESS; if(client->recovery == NULL) { if (recovery_client_new(client) < 0) { return -1; } } char* value = NULL; irecv_getenv(client->recovery->client, "ramdisk-size", &value); info("ramdisk-size=%s\n", (value ? value : "(unknown)")); free(value); value = NULL; if (recovery_send_component(client, build_identity, component) < 0) { error("ERROR: Unable to send %s to device.\n", component); return -1; } irecv_send_command(client->recovery->client, "getenv ramdisk-delay"); recovery_error = irecv_send_command(client->recovery->client, "ramdisk"); if (recovery_error != IRECV_E_SUCCESS) { error("ERROR: Unable to execute %s\n", component); return -1; } sleep(2); return 0; }
int execute_ibss_payload() { //int i = 0; char* bootargs = NULL; irecv_error_t error = IRECV_E_SUCCESS; debug("Initializing greenpois0n in iBSS\n"); irecv_send_command(client, "go"); // Code to detect whether to boot ramdisk or filesystem debug("Checking if device is already jailbroken\n"); error = irecv_getenv(client, "boot-args", &bootargs); if (error != IRECV_E_SUCCESS) { debug("%s\n", irecv_strerror(error)); error("Unable to read env var\n"); return -1; } // If boot-args hasn't been set then we've never been jailbroken if (!strcmp(bootargs, "") || !strcmp(bootargs, "0")) { debug("Booting jailbreak ramdisk\n"); if (boot_ramdisk() < 0) { error("Unable to boot device into tethered mode\n"); return -1; } } // If boot-args is 1 then boot device into tethered mode else if (!strcmp(bootargs, "1")) { debug("Booting tethered device\n"); if (boot_tethered() < 0) { error("Unable to boot device into tethered mode\n"); return -1; } } // If boot-args is 2, then don't boot kernel, just load iBSS payload else if (!strcmp(bootargs, "2")) { debug("Booting iBSS in payload mode\n"); return 0; } // If boot-args is 3, then don't boot kernel, just load iBoot payload else if (!strcmp(bootargs, "3")) { debug("Booting device in verbose mode\n"); if (boot_iboot() < 0) { error("Unable to boot device into verbose mode\n"); return -1; } } return 0; }
int recovery_enter_restore(struct idevicerestore_client_t* client, plist_t build_identity) { if (client->build_major >= 8) { client->restore_boot_args = strdup("rd=md0 nand-enable-reformat=1 -progress"); } /* upload data to make device boot restore mode */ if(client->recovery == NULL) { if (recovery_client_new(client) < 0) { return -1; } } if ((client->build_major > 8) && !(client->flags & FLAG_CUSTOM)) { if (!client->image4supported) { /* send ApTicket */ if (recovery_send_ticket(client) < 0) { error("ERROR: Unable to send APTicket\n"); return -1; } } } //no need to set auto-boot false when we want to just boot the device if ((client->flags & FLAG_BOOT) == 0) if (recovery_set_autoboot(client, 0) < 0) return -1; info("Recovery Mode Environment:\n"); char* value = NULL; irecv_getenv(client->recovery->client, "build-version", &value); info("iBoot build-version=%s\n", (value) ? value : "(unknown)"); if (value) { free(value); value = NULL; } irecv_getenv(client->recovery->client, "build-style", &value); info("iBoot build-style=%s\n", (value) ? value : "(unknown)"); if (value) { free(value); value = NULL; } unsigned long radio_error = 0; irecv_getenv(client->recovery->client, "radio-error", &value); if (value) { radio_error = strtoul(value, NULL, 0); } if (radio_error > 0) { info("radio-error=%s\n", value); free(value); value = NULL; irecv_getenv(client->recovery->client, "radio-error-string", &value); if (value) { info("radio-error-string=%s\n", value); free(value); value = NULL; } } /* send logo and show it */ if (recovery_send_applelogo(client, build_identity) < 0) { error("ERROR: Unable to send AppleLogo\n"); return -1; } if ((client->flags & FLAG_BOOT) == 0) { /* send ramdisk and run it */ if (recovery_send_ramdisk(client, build_identity) < 0) { error("ERROR: Unable to send Ramdisk\n"); return -1; } } /* send devicetree and load it */ if (recovery_send_devicetree(client, build_identity) < 0) { error("ERROR: Unable to send DeviceTree\n"); return -1; } if (recovery_send_kernelcache(client, build_identity) < 0) { error("ERROR: Unable to send KernelCache\n"); return -1; } if ((client->flags & FLAG_BOOT) == 0 && (client->flags & FLAG_NOBOOTX) == 0) client->mode = &idevicerestore_modes[MODE_RESTORE]; return 0; }