diff options
| author | 2014-06-13 10:30:01 +0200 | |
|---|---|---|
| committer | 2014-06-13 10:30:01 +0200 | |
| commit | 41ed7851e250057df64f3e92901f333d8607cc2f (patch) | |
| tree | d1d25166617ca5fb76fa7238bf2b10392668a761 /tools/ideviceimagemounter.c | |
| parent | fe5bb14d06879e132e4afab53e7d7289320a20fc (diff) | |
| download | libimobiledevice-41ed7851e250057df64f3e92901f333d8607cc2f.tar.gz libimobiledevice-41ed7851e250057df64f3e92901f333d8607cc2f.tar.bz2 | |
ideviceimagemounter: Refactor image upload handling for better compatibility
Diffstat (limited to 'tools/ideviceimagemounter.c')
| -rw-r--r-- | tools/ideviceimagemounter.c | 117 | 
1 files changed, 64 insertions, 53 deletions
| diff --git a/tools/ideviceimagemounter.c b/tools/ideviceimagemounter.c index cd41e6a..29d25d7 100644 --- a/tools/ideviceimagemounter.c +++ b/tools/ideviceimagemounter.c @@ -47,6 +47,11 @@ static char *imagetype = NULL;  static const char PKG_PATH[] = "PublicStaging";  static const char PATH_PREFIX[] = "/private/var/mobile/Media"; +typedef enum { +	DISK_IMAGE_UPLOAD_TYPE_AFC, +	DISK_IMAGE_UPLOAD_TYPE_UPLOAD_IMAGE +} disk_image_upload_type_t; +  static void print_usage(int argc, char **argv)  {  	char *name = NULL; @@ -178,12 +183,13 @@ int main(int argc, char **argv)  	if (pver && plist_get_node_type(pver) == PLIST_STRING) {  		plist_get_string_val(pver, &product_version);  	} -	int ge70 = 0; +	disk_image_upload_type_t disk_image_upload_type = DISK_IMAGE_UPLOAD_TYPE_AFC; +	int product_version_major = 0; +	int product_version_minor = 0;  	if (product_version) { -		int maj = 0; -		int min = 0; -		if (sscanf(product_version, "%d.%d.%*d", &maj, &min) == 2) { -			ge70 = (maj >= 7); +		if (sscanf(product_version, "%d.%d.%*d", &product_version_major, &product_version_minor) == 2) { +			if (product_version_major >= 7) +				disk_image_upload_type = DISK_IMAGE_UPLOAD_TYPE_UPLOAD_IMAGE;  		}  	} @@ -206,7 +212,7 @@ int main(int argc, char **argv)  	if (!list_mode) {  		struct stat fst; -		if (!ge70) { +		if (disk_image_upload_type == DISK_IMAGE_UPLOAD_TYPE_AFC) {  			if ((lockdownd_start_service(lckd, "com.apple.afc", &service) !=  				 LOCKDOWN_E_SUCCESS) || !service || !service->port) {  				fprintf(stderr, "Could not start com.apple.afc!\n"); @@ -292,62 +298,67 @@ int main(int argc, char **argv)  			imagetype = strdup("Developer");  		} -		if (ge70) { -			printf("Uploading %s\n", image_path); -			err = mobile_image_mounter_upload_image(mim, imagetype, image_size, mim_upload_cb, f); -		} else { -			printf("Uploading %s --> afc:///%s\n", image_path, targetname); -			char **strs = NULL; -			if (afc_get_file_info(afc, PKG_PATH, &strs) != AFC_E_SUCCESS) { -				if (afc_make_directory(afc, PKG_PATH) != AFC_E_SUCCESS) { -					fprintf(stderr, "WARNING: Could not create directory '%s' on device!\n", PKG_PATH); +		switch(disk_image_upload_type) { +			case DISK_IMAGE_UPLOAD_TYPE_UPLOAD_IMAGE: +				printf("Uploading %s\n", image_path); +				err = mobile_image_mounter_upload_image(mim, imagetype, image_size, sig, sig_length, mim_upload_cb, f); +				break; +			case DISK_IMAGE_UPLOAD_TYPE_AFC: +			default: +				printf("Uploading %s --> afc:///%s\n", image_path, targetname); +				char **strs = NULL; +				if (afc_get_file_info(afc, PKG_PATH, &strs) != AFC_E_SUCCESS) { +					if (afc_make_directory(afc, PKG_PATH) != AFC_E_SUCCESS) { +						fprintf(stderr, "WARNING: Could not create directory '%s' on device!\n", PKG_PATH); +					}  				} -			} -			if (strs) { -				int i = 0; -				while (strs[i]) { -					free(strs[i]); -					i++; +				if (strs) { +					int i = 0; +					while (strs[i]) { +						free(strs[i]); +						i++; +					} +					free(strs);  				} -				free(strs); -			} -			uint64_t af = 0; -			if ((afc_file_open(afc, targetname, AFC_FOPEN_WRONLY, &af) != -				 AFC_E_SUCCESS) || !af) { -				fclose(f); -				fprintf(stderr, "afc_file_open on '%s' failed!\n", targetname); -				goto leave; -			} +				uint64_t af = 0; +				if ((afc_file_open(afc, targetname, AFC_FOPEN_WRONLY, &af) != +					 AFC_E_SUCCESS) || !af) { +					fclose(f); +					fprintf(stderr, "afc_file_open on '%s' failed!\n", targetname); +					goto leave; +				} -			char buf[8192]; -			size_t amount = 0; -			do { -				amount = fread(buf, 1, sizeof(buf), f); -				if (amount > 0) { -					uint32_t written, total = 0; -					while (total < amount) { -						written = 0; -						if (afc_file_write(afc, af, buf, amount, &written) != -							AFC_E_SUCCESS) { -							fprintf(stderr, "AFC Write error!\n"); -							break; +				char buf[8192]; +				size_t amount = 0; +				do { +					amount = fread(buf, 1, sizeof(buf), f); +					if (amount > 0) { +						uint32_t written, total = 0; +						while (total < amount) { +							written = 0; +							if (afc_file_write(afc, af, buf, amount, &written) != +								AFC_E_SUCCESS) { +								fprintf(stderr, "AFC Write error!\n"); +								break; +							} +							total += written; +						} +						if (total != amount) { +							fprintf(stderr, "Error: wrote only %d of %d\n", total, +									(unsigned int)amount); +							afc_file_close(afc, af); +							fclose(f); +							goto leave;  						} -						total += written; -					} -					if (total != amount) { -						fprintf(stderr, "Error: wrote only %d of %d\n", total, -								(unsigned int)amount); -						afc_file_close(afc, af); -						fclose(f); -						goto leave;  					}  				} -			} -			while (amount > 0); +				while (amount > 0); -			afc_file_close(afc, af); +				afc_file_close(afc, af); +				break;  		} +  		fclose(f);  		printf("done.\n"); | 
