diff options
Diffstat (limited to 'src/idevicerestore.c')
| -rw-r--r-- | src/idevicerestore.c | 37 | 
1 files changed, 36 insertions, 1 deletions
| diff --git a/src/idevicerestore.c b/src/idevicerestore.c index 0a5e7f1..1c8b24a 100644 --- a/src/idevicerestore.c +++ b/src/idevicerestore.c @@ -40,6 +40,7 @@  int idevicerestore_debug = 0;  void usage(int argc, char* argv[]); +int write_file(const char* filename, char* data, int size);  int main(int argc, char* argv[]) {  	int opt = 0; @@ -302,7 +303,12 @@ int main(int argc, char* argv[]) {  	ipsw_free_file(ibec);  	img3_replace_signature(ibec_img3, ibec_blob); -	recovery_error = irecv_send_file(recovery, img3_get_data(ibec_img3)); + +	int ibec_size = 0; +	char* ibec_data = NULL; +	img3_get_data(ibec_img3, &ibec_data, &ibec_size); +	write_file("ibec.dfu", ibec_data, ibec_size); +	recovery_error = irecv_send_buffer(recovery, ibec_data, ibec_size);  	if(recovery_error != IRECV_E_SUCCESS) {  		error("ERROR: Unable to send IMG3: %s\n", ibec_path);  		irecv_close(recovery); @@ -311,6 +317,16 @@ int main(int argc, char* argv[]) {  		return -1;  	} +	recovery_error = irecv_send_command(recovery, "go"); +	if(recovery_error != IRECV_E_SUCCESS) { +		error("ERROR: Unable to execute iBEC\n"); +		irecv_close(recovery); +		img3_free(ibec_img3); +		recovery = NULL; +		return -1; +	} + +	free(ibec_data);  	irecv_close(recovery);  	plist_free(tss_response);  	return 0; @@ -329,3 +345,22 @@ void usage(int argc, char* argv[]) {  	printf("\n");  	exit(1);  } + +int write_file(const char* filename, char* data, int size) { +	debug("Writing data to %s\n", filename); +	FILE* file = fopen(filename, "wb"); +	if (file == NULL) { +		error("read_file: Unable to open file %s\n", filename); +		return -1; +	} + +	int bytes = fwrite(data, 1, size, file); +	fclose(file); + +	if(bytes != size) { +		error("ERROR: Unable to write entire file: %s: %d %d\n", filename, bytes, size); +		return -1; +	} + +	return size; +} | 
