diff options
Diffstat (limited to 'tools/idevicebackup2.c')
| -rw-r--r-- | tools/idevicebackup2.c | 94 | 
1 files changed, 49 insertions, 45 deletions
| diff --git a/tools/idevicebackup2.c b/tools/idevicebackup2.c index c73b269..12d6083 100644 --- a/tools/idevicebackup2.c +++ b/tools/idevicebackup2.c @@ -54,7 +54,7 @@  #define LOCK_ATTEMPTS 50  #define LOCK_WAIT 200000 -#ifdef WIN32 +#ifdef _WIN32  #include <windows.h>  #include <conio.h>  #define sleep(x) Sleep(x*1000) @@ -74,6 +74,7 @@  static int verbose = 1;  static int quit_flag = 0; +static int passcode_requested = 0;  #define PRINT_VERBOSE(min_level, ...) if (verbose >= min_level) { printf(__VA_ARGS__); }; @@ -115,6 +116,10 @@ static void notify_cb(const char *notification, void *userdata)  		quit_flag++;  	} else if (!strcmp(notification, NP_BACKUP_DOMAIN_CHANGED)) {  		backup_domain_changed = 1; +	} else if (!strcmp(notification, "com.apple.LocalAuthentication.ui.presented")) { +		passcode_requested = 1; +	} else if (!strcmp(notification, "com.apple.LocalAuthentication.ui.dismissed")) { +		passcode_requested = 0;  	} else {  		PRINT_VERBOSE(1, "Unhandled notification '%s' (TODO: implement)\n", notification);  	} @@ -126,21 +131,15 @@ static void mobilebackup_afc_get_file_contents(afc_client_t afc, const char *fil  		return;  	} -	char **fileinfo = NULL; +	plist_t fileinfo = NULL;  	uint32_t fsize = 0; -	afc_get_file_info(afc, filename, &fileinfo); +	afc_get_file_info_plist(afc, filename, &fileinfo);  	if (!fileinfo) {  		return;  	} -	int i; -	for (i = 0; fileinfo[i]; i+=2) { -		if (!strcmp(fileinfo[i], "st_size")) { -			fsize = atol(fileinfo[i+1]); -			break; -		} -	} -	afc_dictionary_free(fileinfo); +	fsize = plist_dict_get_uint(fileinfo, "st_size"); +	plist_free(fileinfo);  	if (fsize == 0) {  		return; @@ -173,7 +172,7 @@ static void mobilebackup_afc_get_file_contents(afc_client_t afc, const char *fil  static int __mkdir(const char* path, int mode)  { -#ifdef WIN32 +#ifdef _WIN32  	return mkdir(path);  #else  	return mkdir(path, mode); @@ -202,7 +201,7 @@ static int mkdir_with_parents(const char *dir, int mode)  	return res;  } -#ifdef WIN32 +#ifdef _WIN32  static int win32err_to_errno(int err_value)  {  	switch (err_value) { @@ -219,7 +218,7 @@ static int win32err_to_errno(int err_value)  static int remove_file(const char* path)  {  	int e = 0; -#ifdef WIN32 +#ifdef _WIN32  	if (!DeleteFile(path)) {  		e = win32err_to_errno(GetLastError());  	} @@ -234,7 +233,7 @@ static int remove_file(const char* path)  static int remove_directory(const char* path)  {  	int e = 0; -#ifdef WIN32 +#ifdef _WIN32  	if (!RemoveDirectory(path)) {  		e = win32err_to_errno(GetLastError());  	} @@ -455,7 +454,13 @@ static plist_t mobilebackup_factory_info_plist_new(const char* udid, idevice_t d  	/* Installed Applications */  	plist_dict_set_item(ret, "Installed Applications", installed_apps); -	plist_dict_set_item(ret, "Last Backup Date", plist_new_date(time(NULL) - MAC_EPOCH, 0)); +	plist_dict_set_item(ret, "Last Backup Date", +#ifdef HAVE_PLIST_UNIX_DATE +		plist_new_unix_date(time(NULL)) +#else +		plist_new_date(time(NULL) - MAC_EPOCH, 0) +#endif +	);  	value_node = plist_dict_get_item(root_node, "MobileEquipmentIdentifier");  	if (value_node) @@ -768,7 +773,7 @@ static int mb2_handle_send_file(mobilebackup2_client_t mobilebackup2, const char  	uint32_t bytes = 0;  	char *localfile = string_build_path(backup_dir, path, NULL);  	char buf[32768]; -#ifdef WIN32 +#ifdef _WIN32  	struct _stati64 fst;  #else  	struct stat fst; @@ -779,7 +784,7 @@ static int mb2_handle_send_file(mobilebackup2_client_t mobilebackup2, const char  	int errcode = -1;  	int result = -1;  	uint32_t length; -#ifdef WIN32 +#ifdef _WIN32  	uint64_t total;  	uint64_t sent;  #else @@ -810,7 +815,7 @@ static int mb2_handle_send_file(mobilebackup2_client_t mobilebackup2, const char  		goto leave_proto_err;  	} -#ifdef WIN32 +#ifdef _WIN32  	if (_stati64(localfile, &fst) < 0)  #else  	if (stat(localfile, &fst) < 0) @@ -1218,7 +1223,12 @@ static void mb2_handle_list_directory(mobilebackup2_client_t mobilebackup2, plis  				plist_dict_set_item(fdict, "DLFileType", plist_new_string(ftype));  				plist_dict_set_item(fdict, "DLFileSize", plist_new_uint(st.st_size));  				plist_dict_set_item(fdict, "DLFileModificationDate", -						    plist_new_date(st.st_mtime - MAC_EPOCH, 0)); +#ifdef HAVE_PLIST_UNIX_DATE +						    plist_new_unix_date(st.st_mtime) +#else +						    plist_new_date(st.st_mtime - MAC_EPOCH, 0) +#endif +				);  				plist_dict_set_item(dirlist, ep->d_name, fdict);  				free(fpath); @@ -1343,7 +1353,7 @@ static void mb2_copy_directory_by_path(const char *src, const char *dst)  	}  } -#ifdef WIN32 +#ifdef _WIN32  #define BS_CC '\b'  #define my_getch getch  #else @@ -1463,8 +1473,6 @@ static void print_usage(int argc, char **argv, int is_error)  	);  } -#define DEVICE_VERSION(maj, min, patch) ((((maj) & 0xFF) << 16) | (((min) & 0xFF) << 8) | ((patch) & 0xFF)) -  int main(int argc, char *argv[])  {  	idevice_error_t ret = IDEVICE_E_UNKNOWN_ERROR; @@ -1530,7 +1538,7 @@ int main(int argc, char *argv[])  	/* we need to exit cleanly on running backups and restores or we cause havok */  	signal(SIGINT, clean_exit);  	signal(SIGTERM, clean_exit); -#ifndef WIN32 +#ifndef _WIN32  	signal(SIGQUIT, clean_exit);  	signal(SIGPIPE, SIG_IGN);  #endif @@ -1844,34 +1852,20 @@ int main(int argc, char *argv[])  	}  	/* get ProductVersion */ -	char *product_version = NULL; -	int device_version = 0; -	node_tmp = NULL; -	lockdownd_get_value(lockdown, NULL, "ProductVersion", &node_tmp); -	if (node_tmp) { -		if (plist_get_node_type(node_tmp) == PLIST_STRING) { -			plist_get_string_val(node_tmp, &product_version); -		} -		plist_free(node_tmp); -		node_tmp = NULL; -	} -	if (product_version) { -		int vers[3] = { 0, 0, 0 }; -		if (sscanf(product_version, "%d.%d.%d", &vers[0], &vers[1], &vers[2]) >= 2) { -			device_version = DEVICE_VERSION(vers[0], vers[1], vers[2]); -		} -	} +	int device_version = idevice_get_device_version(device);  	/* start notification_proxy */  	ldret = lockdownd_start_service(lockdown, NP_SERVICE_NAME, &service);  	if ((ldret == LOCKDOWN_E_SUCCESS) && service && service->port) {  		np_client_new(device, service, &np);  		np_set_notify_callback(np, notify_cb, NULL); -		const char *noties[5] = { +		const char *noties[7] = {  			NP_SYNC_CANCEL_REQUEST,  			NP_SYNC_SUSPEND_REQUEST,  			NP_SYNC_RESUME_REQUEST,  			NP_BACKUP_DOMAIN_CHANGED, +			"com.apple.LocalAuthentication.ui.presented", +			"com.apple.LocalAuthentication.ui.dismissed",  			NULL  		};  		np_observe_notifications(np, noties); @@ -2058,6 +2052,16 @@ checkpoint:  				}	else {  					PRINT_VERBOSE(1, "Incremental backup mode.\n");  				} +				if (device_version >= IDEVICE_DEVICE_VERSION(16,1,0)) { +					/* let's wait 2 second to see if the device passcode is requested */ +					int retries = 20; +					while (retries-- > 0 && !passcode_requested) { +						usleep(100000); +					} +					if (passcode_requested) { +						printf("*** Waiting for passcode to be entered on the device ***\n"); +					} +				}  			} else {  				if (err == MOBILEBACKUP2_E_BAD_VERSION) {  					printf("ERROR: Could not start backup process: backup protocol version mismatch!\n"); @@ -2229,7 +2233,7 @@ checkpoint:  			if (newpw || backup_password) {  				mobilebackup2_send_message(mobilebackup2, "ChangePassword", opts);  				uint8_t passcode_hint = 0; -				if (device_version >= DEVICE_VERSION(13,0,0)) { +				if (device_version >= IDEVICE_DEVICE_VERSION(13,0,0)) {  					diagnostics_relay_client_t diag = NULL;  					if (diagnostics_relay_client_start_service(device, &diag, TOOL_NAME) == DIAGNOSTICS_RELAY_E_SUCCESS) {  						plist_t dict = NULL; @@ -2307,7 +2311,7 @@ checkpoint:  					/* device wants to know how much disk space is available on the computer */  					uint64_t freespace = 0;  					int res = -1; -#ifdef WIN32 +#ifdef _WIN32  					if (GetDiskFreeSpaceEx(backup_directory, (PULARGE_INTEGER)&freespace, NULL, NULL)) {  						res = 0;  					} @@ -2316,7 +2320,7 @@ checkpoint:  					memset(&fs, '\0', sizeof(fs));  					res = statvfs(backup_directory, &fs);  					if (res == 0) { -						freespace = (uint64_t)fs.f_bavail * (uint64_t)fs.f_bsize; +						freespace = (uint64_t)fs.f_bavail * (uint64_t)fs.f_frsize;  					}  #endif  					plist_t freespace_item = plist_new_uint(freespace); | 
