diff options
| author | 2011-01-10 21:13:17 +0100 | |
|---|---|---|
| committer | 2011-04-11 19:42:20 +0200 | |
| commit | 3c1c61fe8d968f6350eb7612c5f5ffbfe8ea03d7 (patch) | |
| tree | 6c5cc11ae539430c1bfcec7da9cb36820c441f19 | |
| parent | ca931097ff93286d65ecab3ab07156601c2e252f (diff) | |
| download | libimobiledevice-3c1c61fe8d968f6350eb7612c5f5ffbfe8ea03d7.tar.gz libimobiledevice-3c1c61fe8d968f6350eb7612c5f5ffbfe8ea03d7.tar.bz2 | |
idevicebackup4: clean up more stuff
| -rw-r--r-- | tools/idevicebackup4.c | 502 | 
1 files changed, 1 insertions, 501 deletions
| diff --git a/tools/idevicebackup4.c b/tools/idevicebackup4.c index af798c0..f306260 100644 --- a/tools/idevicebackup4.c +++ b/tools/idevicebackup4.c @@ -73,81 +73,6 @@ enum device_link_file_status_t {  	DEVICE_LINK_FILE_STATUS_LAST_HUNK  }; -#if 0 -static void sha1_of_data(const char *input, uint32_t size, unsigned char *hash_out) -{ -	gcry_md_hash_buffer(GCRY_MD_SHA1, hash_out, input, size); -} - -static int compare_hash(const unsigned char *hash1, const unsigned char *hash2, int hash_len) -{ -	int i; -	for (i = 0; i < hash_len; i++) { -		if (hash1[i] != hash2[i]) { -			return 0; -		} -	} -	return 1; -} - -static void compute_datahash(const char *path, const char *destpath, uint8_t greylist, const char *domain, const char *appid, const char *version, unsigned char *hash_out) -{ -	gcry_md_hd_t hd = NULL; -	gcry_md_open(&hd, GCRY_MD_SHA1, 0); -	if (!hd) { -		printf("ERROR: Could not initialize libgcrypt/SHA1\n"); -		return; -	} -	gcry_md_reset(hd); - -	FILE *f = fopen(path, "rb"); -	if (f) { -		unsigned char buf[16384]; -		size_t len; -		while ((len = fread(buf, 1, 16384, f)) > 0) { -			gcry_md_write(hd, buf, len); -		} -		fclose(f); -		gcry_md_write(hd, destpath, strlen(destpath)); -		gcry_md_write(hd, ";", 1); -		if (greylist == 1) { -			gcry_md_write(hd, "true", 4); -		} else { -			gcry_md_write(hd, "false", 5); -		} -		gcry_md_write(hd, ";", 1); -		if (domain) { -			gcry_md_write(hd, domain, strlen(domain)); -		} else { -			gcry_md_write(hd, "(null)", 6); -		} -		gcry_md_write(hd, ";", 1); -		if (appid) { -			gcry_md_write(hd, appid, strlen(appid)); -		} else { -			gcry_md_write(hd, "(null)", 6); -		} -		gcry_md_write(hd, ";", 1); -		if (version) { -			gcry_md_write(hd, version, strlen(version)); -		} else { -			gcry_md_write(hd, "(null)", 6); -		} -		unsigned char *newhash = gcry_md_read(hd, GCRY_MD_SHA1); -		memcpy(hash_out, newhash, 20); -	} -	gcry_md_close(hd); -} - -static void print_hash(const unsigned char *hash, int len) -{ -	int i; -	for (i = 0; i < len; i++) { -		printf("%02x", hash[i]); -	} -} -#endif -  static void notify_cb(const char *notification, void *userdata)  {  	if (!strcmp(notification, NP_SYNC_CANCEL_REQUEST)) { @@ -365,23 +290,6 @@ static plist_t mobilebackup_factory_info_plist_new()  	return ret;  } -#if 0 -static void mobilebackup_info_update_last_backup_date(plist_t info_plist) -{ -	GTimeVal tv = {0, 0}; -	plist_t node = NULL; - -	if (!info_plist) -		return; - -	g_get_current_time(&tv); -	node = plist_dict_get_item(info_plist, "Last Backup Date"); -	plist_set_date_val(node, tv.tv_sec, tv.tv_usec); - -	node = NULL; -} -#endif -  static void buffer_read_from_filename(const char *filename, char **buffer, uint64_t *length)  {  	FILE *f; @@ -469,21 +377,6 @@ static int plist_write_to_filename(plist_t plist, const char *filename, enum pli  	return 1;  } -static int plist_strcmp(plist_t node, const char *str) -{ -	char *buffer = NULL; -	int ret = 0; - -	if (plist_get_node_type(node) != PLIST_STRING) -		return ret; - -	plist_get_string_val(node, &buffer); -	ret = strcmp(buffer, str); -	free(buffer); - -	return ret; -} -  static int mobilebackup_status_check_snapshot_state(const char *path, const char *uuid, const char *matches)  {  	int ret = -1; @@ -571,186 +464,6 @@ static int mobilebackup_info_is_current_device(plist_t info)  	return ret;  } -/*static int mobilebackup_delete_backup_file_by_hash(const char *backup_directory, const char *hash) -{ -	int ret = 0; -	gchar *path = mobilebackup_build_path(backup_directory, hash, ".mddata"); -	printf("Removing \"%s\" ", path); -	if (!remove( path )) -		ret = 1; -	else -		ret = 0; - -	g_free(path); - -	if (!ret) -		return ret; - -	path = mobilebackup_build_path(backup_directory, hash, ".mdinfo"); -	printf("and \"%s\"... ", path); -	if (!remove( path )) -		ret = 1; -	else -		ret = 0; - -	g_free(path); - -	return ret; -}*/ - -#if 0 -static int mobilebackup_check_file_integrity(const char *backup_directory, const char *hash, plist_t filedata) -{ -	char *datapath; -	char *infopath; -	plist_t mdinfo = NULL; -	struct stat st; -	unsigned char file_hash[20]; - -	datapath = mobilebackup_build_path(backup_directory, hash, ".mddata"); -	if (stat(datapath, &st) != 0) { -		printf("\r\n"); -		printf("ERROR: '%s.mddata' is missing!\n", hash); -		free(datapath); -		return 0; -	} - -	infopath = mobilebackup_build_path(backup_directory, hash, ".mdinfo"); -	plist_read_from_filename(&mdinfo, infopath); -	free(infopath); -	if (!mdinfo) { -		printf("\r\n"); -		printf("ERROR: '%s.mdinfo' is missing or corrupted!\n", hash); -		free(datapath); -		return 0; -	} - -	/* sha1 hash verification */ -	plist_t node = plist_dict_get_item(filedata, "DataHash"); -	if (!node || (plist_get_node_type(node) != PLIST_DATA)) { -		printf("\r\n"); -		printf("ERROR: Could not get DataHash for file entry '%s'\n", hash); -		plist_free(mdinfo); -		free(datapath); -		return 0; -	} - -	node = plist_dict_get_item(mdinfo, "Metadata"); -	if (!node && (plist_get_node_type(node) != PLIST_DATA)) { -		printf("\r\n"); -		printf("ERROR: Could not find Metadata in plist '%s.mdinfo'\n", hash); -		plist_free(mdinfo); -		free(datapath); -		return 0; -	} - -	char *meta_bin = NULL; -	uint64_t meta_bin_size = 0; -	plist_get_data_val(node, &meta_bin, &meta_bin_size); -	plist_t metadata = NULL; -	if (meta_bin) { -		plist_from_bin(meta_bin, (uint32_t)meta_bin_size, &metadata); -	} -	if (!metadata) { -		printf("\r\n"); -		printf("ERROR: Could not get Metadata from plist '%s.mdinfo'\n", hash); -		plist_free(mdinfo); -		free(datapath); -		return 0; -	} - -	char *version = NULL; -	node = plist_dict_get_item(metadata, "Version"); -	if (node && (plist_get_node_type(node) == PLIST_STRING)) {  -		plist_get_string_val(node, &version); -	} - -	char *destpath = NULL; -	node = plist_dict_get_item(metadata, "Path"); -	if (node && (plist_get_node_type(node) == PLIST_STRING)) {  -		plist_get_string_val(node, &destpath); -	} - -	uint8_t greylist = 0; -	node = plist_dict_get_item(metadata, "Greylist"); -	if (node && (plist_get_node_type(node) == PLIST_BOOLEAN)) { -		plist_get_bool_val(node, &greylist); -	} - -	char *domain = NULL; -	node = plist_dict_get_item(metadata, "Domain"); -	if (node && (plist_get_node_type(node) == PLIST_STRING)) {  -		plist_get_string_val(node, &domain); -	} - -	char *fnstr = malloc(strlen(domain) + 1 + strlen(destpath) + 1); -	strcpy(fnstr, domain); -	strcat(fnstr, "-"); -	strcat(fnstr, destpath); -	unsigned char fnhash[20]; -	char fnamehash[41]; -	char *p = fnamehash; -	sha1_of_data(fnstr, strlen(fnstr), fnhash); -	free(fnstr); -	int i; -	for ( i = 0; i < 20; i++, p += 2 ) { -		snprintf (p, 3, "%02x", (unsigned char)fnhash[i] ); -	} -	if (strcmp(fnamehash, hash)) { -		printf("\r\n");  -		printf("WARNING: filename hash does not match for entry '%s'\n", hash); -	} - -	char *auth_version = NULL; -	node = plist_dict_get_item(mdinfo, "AuthVersion"); -	if (node && (plist_get_node_type(node) == PLIST_STRING)) { -		plist_get_string_val(node, &auth_version); -	} - -	if (strcmp(auth_version, "1.0")) { -		printf("\r\n"); -		printf("WARNING: Unknown AuthVersion '%s', DataHash cannot be verified!\n", auth_version); -	} - -	node = plist_dict_get_item(filedata, "DataHash"); -	if (!node || (plist_get_node_type(node) != PLIST_DATA)) { -		printf("\r\n"); -		printf("WARNING: Could not get DataHash key from file info data for entry '%s'\n", hash); -	} - -	int res = 1; -	unsigned char *data_hash = NULL; -	uint64_t data_hash_len = 0; -	plist_get_data_val(node, (char**)&data_hash, &data_hash_len); -	int hash_ok = 0; -	if (data_hash && (data_hash_len == 20)) { -		compute_datahash(datapath, destpath, greylist, domain, NULL, version, file_hash); -		hash_ok = compare_hash(data_hash, file_hash, 20); -	} else if (data_hash_len == 0) { -		/* no datahash present */ -		hash_ok = 1; -	} - -	g_free(domain); -	g_free(version); -	g_free(destpath); - -	if (!hash_ok) { -		printf("\r\n"); -		printf("ERROR: The hash for '%s.mddata' does not match DataHash entry in Manifest\n", hash); -		printf("datahash: "); -		print_hash(data_hash, 20); -		printf("\nfilehash: "); -		print_hash(file_hash, 20); -		printf("\n"); -		res = 0; -	} -	g_free(data_hash); -	plist_free(mdinfo); -	return res; -} -#endif -  static void do_post_notification(const char *notification)  {  	uint16_t nport = 0; @@ -1263,16 +976,8 @@ int main(int argc, char *argv[])  	int is_full_backup = 0;  	char *backup_directory = NULL;  	struct stat st; -	//plist_t node = NULL;  	plist_t node_tmp = NULL; -	//plist_t manifest_plist = NULL;  	plist_t info_plist = NULL; -	//char *buffer = NULL; -	//char *file_path = NULL; -	//uint64_t length = 0; -	//uint64_t backup_total_size = 0; -	//enum device_link_file_status_t file_status = DEVICE_LINK_FILE_STATUS_NONE; -//	uint64_t c = 0;  	mobilebackup2_error_t err;  	/* we need to exit cleanly on running backups and restores or we cause havok */ @@ -1506,20 +1211,7 @@ checkpoint:  			/* TODO: check domain com.apple.mobile.backup key RequiresEncrypt and WillEncrypt with lockdown */  			/* TODO: verify battery on AC enough battery remaining */	 -			/* read the last Manifest.plist */ -			/* -			if (!is_full_backup) { -				printf("Reading existing Manifest.\n"); -				plist_read_from_filename(&manifest_plist, manifest_path); -				if (!manifest_plist) { -					printf("Could not read Manifest.plist, switching to full backup mode.\n"); -					is_full_backup = 1; -				} -			}*/ - -			/* Info.plist (Device infos, IC-Info.sidb, photos, app_ids, iTunesPrefs) */ - -			/* re-create Info.plist */ +			/* re-create Info.plist (Device infos, IC-Info.sidb, photos, app_ids, iTunesPrefs) */  			if (info_plist) {  				plist_free(info_plist);  				info_plist = NULL; @@ -1532,9 +1224,6 @@ checkpoint:  			plist_free(info_plist);  			info_plist = NULL; -			/* create Status.plist with failed status for now */ -			//mobilebackup_write_status(backup_directory, 0); -  			/* request backup from device with manifest from last backup */  			printf("Requesting backup from device...\n"); @@ -1613,20 +1302,8 @@ checkpoint:  			int backup_ok = 0;  			plist_t message = NULL; -			/* TODO receive and save DLSendFile files and metadata, ACK each */  			char *dlmsg = NULL; -			/*uint64_t file_size = 0; -			uint64_t file_size_current = 0;*/  			int file_count = 0; -			/*int hunk_index = 0; -			uint64_t backup_real_size = 0; -			char *file_ext = NULL; -			char *filename_mdinfo = NULL; -			char *filename_mddata = NULL; -			char *filename_source = NULL; -			char *format_size = NULL; -			gboolean is_manifest = FALSE; -			uint8_t b = 0;*/  			int errcode = 0;  			const char *errdesc = NULL; @@ -1643,8 +1320,6 @@ checkpoint:  					goto files_out;  				} -				//node = plist_array_get_item(message, 0); -  				if (!strcmp(dlmsg, "DLMessageDownloadFiles")) {  					/* device wants to download files from the computer */  					handle_send_files(message, backup_directory); @@ -1805,149 +1480,10 @@ checkpoint:  					}  				}*/ -#if 0 -				/* get out if we don't get a DLSendFile */ -				if (plist_strcmp(node, "DLSendFile")) -					break; - -				node_tmp = plist_array_get_item(message, 2); - -				/* first message hunk contains total backup size */ -				if ((hunk_index == 0) && (file_index == 0)) { -					node = plist_dict_get_item(node_tmp, "BackupTotalSizeKey"); -					if (node) { -						plist_get_uint_val(node, &backup_total_size); -						format_size = g_format_size_for_display(backup_total_size); -						printf("Backup data requires %s on the disk.\n", format_size); -						g_free(format_size); -					} -				} - -				/* check DLFileStatusKey (codes: 1 = Hunk, 2 = Last Hunk) */ -				node = plist_dict_get_item(node_tmp, "DLFileStatusKey"); -				plist_get_uint_val(node, &c); -				file_status = c; - -				/* get source filename */ -				node = plist_dict_get_item(node_tmp, "BackupManifestKey"); -				b = 0; -				if (node) { -					plist_get_bool_val(node, &b); -				} -				is_manifest = (b == 1) ? TRUE: FALSE; - -				if ((hunk_index == 0) && (!is_manifest)) { -					/* get source filename */ -					node = plist_dict_get_item(node_tmp, "DLFileSource"); -					plist_get_string_val(node, &filename_source); - -					/* increase received size */ -					node = plist_dict_get_item(node_tmp, "DLFileAttributesKey"); -					node = plist_dict_get_item(node, "FileSize"); -					plist_get_uint_val(node, &file_size); -					backup_real_size += file_size; - -					format_size = g_format_size_for_display(backup_real_size); -					printf("(%s", format_size); -					g_free(format_size); - -					format_size = g_format_size_for_display(backup_total_size); -					printf("/%s): ", format_size); -					g_free(format_size); - -					format_size = g_format_size_for_display(file_size); -					printf("Receiving file %s (%s)... \n", filename_source, format_size); -					g_free(format_size); - -					if (filename_source) -						free(filename_source); -				} - -				/* check if we completed a file */ -				if ((file_status == DEVICE_LINK_FILE_STATUS_LAST_HUNK) && (!is_manifest)) { -					/* save <hash>.mdinfo */ -					node = plist_dict_get_item(node_tmp, "BackupFileInfo"); -					if (node) { -						node = plist_dict_get_item(node_tmp, "DLFileDest"); -						plist_get_string_val(node, &file_path); - -						filename_mdinfo = mobilebackup_build_path(backup_directory, file_path, ".mdinfo"); - -						/* remove any existing file */ -						if (stat(filename_mdinfo, &st) == 0) -							remove(filename_mdinfo); - -						node = plist_dict_get_item(node_tmp, "BackupFileInfo"); -						plist_write_to_filename(node, filename_mdinfo, PLIST_FORMAT_BINARY); - -						g_free(filename_mdinfo); -					} - -					file_index++; -				} - -				/* save <hash>.mddata */ -				node = plist_dict_get_item(node_tmp, "BackupFileInfo"); -				if (node_tmp) { -					node = plist_dict_get_item(node_tmp, "DLFileDest"); -					plist_get_string_val(node, &file_path); - -					filename_mddata = mobilebackup_build_path(backup_directory, file_path, is_manifest ? NULL: ".mddata"); - -					/* if this is the first hunk, remove any existing file */ -					if ((hunk_index == 0) && (stat(filename_mddata, &st) == 0)) -						remove(filename_mddata); - -					/* get file data hunk */ -					node_tmp = plist_array_get_item(message, 1); -					plist_get_data_val(node_tmp, &buffer, &length); - -					buffer_write_to_filename(filename_mddata, buffer, length); -					if (!is_manifest) -						file_size_current += length; - -					/* activate currently sent manifest */ -					if ((file_status == DEVICE_LINK_FILE_STATUS_LAST_HUNK) && (is_manifest)) { -						rename(filename_mddata, manifest_path); -					} - -					free(buffer); -					buffer = NULL; - -					g_free(filename_mddata); -				} - -				if ((!is_manifest)) { -					if (hunk_index == 0 && file_status == DEVICE_LINK_FILE_STATUS_LAST_HUNK) { -							print_progress(100); -					} else { -						if (file_size > 0) -							print_progress((double)((file_size_current*100)/file_size)); -					} -				} - -				hunk_index++; - -				if (file_ext) -					free(file_ext); -#endif  				if (message)  					plist_free(message);  				message = NULL; -#if 0 -				if (file_status == DEVICE_LINK_FILE_STATUS_LAST_HUNK) { -					/* acknowlegdge that we received the file */ -					mobilebackup_send_backup_file_received(mobilebackup); -					/* reset hunk_index */ -					hunk_index = 0; -					if (!is_manifest) { -						file_size_current = 0; -						file_size = 0; -					} -				} -#endif -  files_out:  				if (quit_flag > 0) {  					/* need to cancel the backup here */ @@ -1962,42 +1498,6 @@ files_out:  				}  			} while (1); -#if 0 -			if (!quit_flag && !plist_strcmp(node, "DLMessageProcessMessage")) { -				node_tmp = plist_array_get_item(message, 1); -				node = plist_dict_get_item(node_tmp, "BackupMessageTypeKey"); -				/* check if we received the final "backup finished" message */ -				if (node && !plist_strcmp(node, "BackupMessageBackupFinished")) { -					/* backup finished */ - -					/* process BackupFilesToDeleteKey */ -					node = plist_dict_get_item(node_tmp, "BackupFilesToDeleteKey"); -					if (node) { -						length = plist_array_get_size(node); -						i = 0; -						while ((node_tmp = plist_array_get_item(node, i++)) != NULL) { -							plist_get_string_val(node_tmp, &file_path); - -							if (mobilebackup_delete_backup_file_by_hash(backup_directory, file_path)) { -								printf("DONE\n"); -							} else -								printf("FAILED\n"); -						} -					} - -					/* save last valid Manifest.plist */ -					node_tmp = plist_array_get_item(message, 1); -					manifest_plist = plist_dict_get_item(node_tmp, "BackupManifestKey"); -					if (manifest_plist) { -						remove(manifest_path); -						printf("Storing Manifest.plist...\n"); -						plist_write_to_filename(manifest_plist, manifest_path, PLIST_FORMAT_XML); -					} - -					backup_ok = 1; -				} -			} -#endif  			if (cmd == CMD_BACKUP) {  				printf("Received %d files from device.\n", file_count);  				if (mobilebackup_status_check_snapshot_state(backup_directory, uuid, "finished")) { | 
