diff options
| author | 2008-09-01 15:04:31 -0700 | |
|---|---|---|
| committer | 2008-09-01 15:04:31 -0700 | |
| commit | 2b05e48cb4a90dfc94ff584124f08e431398bb1a (patch) | |
| tree | e0c8255e2cd5592a31295ac8ce89d8846feb7043 | |
| parent | 7ac3d681889a6a8f9987837ace5465f2967cfff9 (diff) | |
| download | libimobiledevice-2b05e48cb4a90dfc94ff584124f08e431398bb1a.tar.gz libimobiledevice-2b05e48cb4a90dfc94ff584124f08e431398bb1a.tar.bz2 | |
Enforce a modified kr style.
Use "make indent" from now on before committing.
| -rw-r--r-- | Makefile.am | 3 | ||||
| -rw-r--r-- | src/AFC.c | 597 | ||||
| -rw-r--r-- | src/AFC.h | 1 | ||||
| -rw-r--r-- | src/ifuse.c | 187 | ||||
| -rw-r--r-- | src/initconf.c | 72 | ||||
| -rw-r--r-- | src/iphone.c | 109 | ||||
| -rw-r--r-- | src/iphone.h | 2 | ||||
| -rw-r--r-- | src/lockdown.c | 586 | ||||
| -rw-r--r-- | src/lockdown.h | 3 | ||||
| -rw-r--r-- | src/main.c | 78 | ||||
| -rw-r--r-- | src/plist.c | 76 | ||||
| -rw-r--r-- | src/plist.h | 10 | ||||
| -rw-r--r-- | src/usbmux.c | 188 | ||||
| -rw-r--r-- | src/userpref.c | 115 | ||||
| -rw-r--r-- | src/userpref.h | 18 | 
15 files changed, 1167 insertions, 878 deletions
| diff --git a/Makefile.am b/Makefile.am index 76541d7..82c4c95 100644 --- a/Makefile.am +++ b/Makefile.am @@ -3,3 +3,6 @@ SUBDIRS = src  doc:  	doxygen doxygen.cfg + +indent: +	indent -kr -ut -ts4 -l120 src/*.c src/*.h @@ -33,10 +33,12 @@ extern int debug;   *    * @param client The AFC client connection to lock   */ -static void afc_lock(iphone_afc_client_t client) { -	if (debug) fprintf(stderr, "Locked\n"); +static void afc_lock(iphone_afc_client_t client) +{ +	if (debug) +		fprintf(stderr, "Locked\n");  	while (client->lock) { -		usleep(500); // they say it's obsolete, but whatever +		usleep(500);			// they say it's obsolete, but whatever  	}  	client->lock = 1;  } @@ -45,9 +47,11 @@ static void afc_lock(iphone_afc_client_t client) {   *    * @param client The AFC    */ -static void afc_unlock(iphone_afc_client_t client) { // just to be pretty  -	if (debug) fprintf(stderr, "Unlocked\n"); -	client->lock = 0;  +static void afc_unlock(iphone_afc_client_t client) +{								// just to be pretty  +	if (debug) +		fprintf(stderr, "Unlocked\n"); +	client->lock = 0;  }  /** Makes a connection to the AFC service on the phone.  @@ -58,22 +62,23 @@ static void afc_unlock(iphone_afc_client_t client) { // just to be pretty   *    * @return A handle to the newly-connected client or NULL upon error.   */ -iphone_error_t iphone_afc_new_client ( iphone_device_t device, int src_port, int dst_port, iphone_afc_client_t *client ) { +iphone_error_t iphone_afc_new_client(iphone_device_t device, int src_port, int dst_port, iphone_afc_client_t * client) +{  	int ret = IPHONE_E_SUCCESS; -	iphone_afc_client_t client_loc = (iphone_afc_client_t)malloc(sizeof(struct iphone_afc_client_int)); -	 -	if (!device) return IPHONE_E_INVALID_ARG; -	 +	iphone_afc_client_t client_loc = (iphone_afc_client_t) malloc(sizeof(struct iphone_afc_client_int)); + +	if (!device) +		return IPHONE_E_INVALID_ARG; +  	// Attempt connection  	client_loc->connection = NULL; -	ret = iphone_mux_new_client(device, src_port, dst_port,&client_loc->connection); +	ret = iphone_mux_new_client(device, src_port, dst_port, &client_loc->connection);  	if (IPHONE_E_SUCCESS != ret || !client_loc->connection) {  		free(client_loc); -	       	return ret; +		return ret;  	} -  	// Allocate a packet -	client_loc->afc_packet = (AFCPacket*)malloc(sizeof(AFCPacket)); +	client_loc->afc_packet = (AFCPacket *) malloc(sizeof(AFCPacket));  	if (!client_loc->afc_packet) {  		iphone_mux_free_client(client_loc->connection);  		free(client_loc); @@ -100,10 +105,11 @@ iphone_error_t iphone_afc_new_client ( iphone_device_t device, int src_port, int   *    * @param client The client to disconnect.   */ -iphone_error_t iphone_afc_free_client ( iphone_afc_client_t client ) { +iphone_error_t iphone_afc_free_client(iphone_afc_client_t client) +{  	if (!client || !client->connection || !client->afc_packet)  		return IPHONE_E_INVALID_ARG; -	 +  	iphone_mux_free_client(client->connection);  	free(client->afc_packet);  	free(client); @@ -124,65 +130,78 @@ iphone_error_t iphone_afc_free_client ( iphone_afc_client_t client ) {   *          reason is that if you set them to different values, it indicates   *          you want to send the data as two packets.   */ -static int dispatch_AFC_packet(iphone_afc_client_t client, const char *data, int length) { +static int dispatch_AFC_packet(iphone_afc_client_t client, const char *data, int length) +{  	int bytes = 0, offset = 0; -	char *buffer;	 +	char *buffer; + +	if (!client || !client->connection || !client->afc_packet) +		return 0; +	if (!data || !length) +		length = 0; -	if (!client || !client->connection || !client->afc_packet) return 0; -	if (!data || !length) length = 0; -	  	client->afc_packet->packet_num++;  	if (!client->afc_packet->entire_length) {  		client->afc_packet->entire_length = (length) ? sizeof(AFCPacket) + length + 1 : sizeof(AFCPacket);  		client->afc_packet->this_length = client->afc_packet->entire_length;  	} -	if (!client->afc_packet->this_length){ +	if (!client->afc_packet->this_length) {  		client->afc_packet->this_length = sizeof(AFCPacket);  	} -	 -	// We want to send two segments; buffer+sizeof(AFCPacket) to this_length is the parameters +	// We want to send two segments; buffer+sizeof(AFCPacket) to +	// this_length is the parameters  	// And everything beyond that is the next packet. (for writing)  	if (client->afc_packet->this_length != client->afc_packet->entire_length) { -		buffer = (char*)malloc(client->afc_packet->this_length); -		memcpy(buffer, (char*)client->afc_packet, sizeof(AFCPacket)); +		buffer = (char *) malloc(client->afc_packet->this_length); +		memcpy(buffer, (char *) client->afc_packet, sizeof(AFCPacket));  		offset = client->afc_packet->this_length - sizeof(AFCPacket); -		 -		if (debug) fprintf(stderr, "dispatch_AFC_packet: Offset: %i\n", offset); + +		if (debug) +			fprintf(stderr, "dispatch_AFC_packet: Offset: %i\n", offset);  		if ((length) < (client->afc_packet->entire_length - client->afc_packet->this_length)) { -			if (debug){ +			if (debug) {  				fprintf(stderr, "dispatch_AFC_packet: Length did not resemble what it was supposed"); -		       		fprintf(stderr, "to based on the packet.\n"); -				fprintf(stderr, "length minus offset: %i\n", length-offset); -				fprintf(stderr, "rest of packet: %i\n", client->afc_packet->entire_length - client->afc_packet->this_length); +				fprintf(stderr, "to based on the packet.\n"); +				fprintf(stderr, "length minus offset: %i\n", length - offset); +				fprintf(stderr, "rest of packet: %i\n", +						client->afc_packet->entire_length - client->afc_packet->this_length);  			}  			free(buffer);  			return -1;  		} -		memcpy(buffer+sizeof(AFCPacket), data, offset); +		memcpy(buffer + sizeof(AFCPacket), data, offset);  		iphone_mux_send(client->connection, buffer, client->afc_packet->this_length, &bytes);  		free(buffer);  		if (bytes <= 0) {  			return bytes; -	       	} -		 +		} +  		if (debug) {  			fprintf(stderr, "dispatch_AFC_packet: sent the first now go with the second\n"); -			fprintf(stderr, "Length: %i\n", length-offset); +			fprintf(stderr, "Length: %i\n", length - offset);  			fprintf(stderr, "Buffer: \n"); -			fwrite(data+offset, 1, length-offset, stdout); +			fwrite(data + offset, 1, length - offset, stdout);  		} -		 -		iphone_mux_send(client->connection, data+offset, length-offset, &bytes); + +		iphone_mux_send(client->connection, data + offset, length - offset, &bytes);  		return bytes;  	} else { -		if (debug) fprintf(stderr, "dispatch_AFC_packet doin things the old way\n"); -		char *buffer = (char*)malloc(sizeof(char) * client->afc_packet->this_length); -		if (debug) fprintf(stderr, "dispatch_AFC_packet packet length = %i\n", client->afc_packet->this_length); -		memcpy(buffer, (char*)client->afc_packet, sizeof(AFCPacket)); -		if (debug) fprintf(stderr, "dispatch_AFC_packet packet data follows\n"); -		if (length > 0) { memcpy(buffer+sizeof(AFCPacket), data, length); buffer[sizeof(AFCPacket)+length] = '\0'; } -		if (debug) fwrite(buffer, 1, client->afc_packet->this_length, stdout); -		if (debug) fprintf(stderr, "\n"); +		if (debug) +			fprintf(stderr, "dispatch_AFC_packet doin things the old way\n"); +		char *buffer = (char *) malloc(sizeof(char) * client->afc_packet->this_length); +		if (debug) +			fprintf(stderr, "dispatch_AFC_packet packet length = %i\n", client->afc_packet->this_length); +		memcpy(buffer, (char *) client->afc_packet, sizeof(AFCPacket)); +		if (debug) +			fprintf(stderr, "dispatch_AFC_packet packet data follows\n"); +		if (length > 0) { +			memcpy(buffer + sizeof(AFCPacket), data, length); +			buffer[sizeof(AFCPacket) + length] = '\0'; +		} +		if (debug) +			fwrite(buffer, 1, client->afc_packet->this_length, stdout); +		if (debug) +			fprintf(stderr, "\n");  		iphone_mux_send(client->connection, buffer, client->afc_packet->this_length, &bytes);  		if (buffer) { @@ -205,13 +224,14 @@ static int dispatch_AFC_packet(iphone_afc_client_t client, const char *data, int   *         AFC_ERROR operation)   */ -static int receive_AFC_data(iphone_afc_client_t client, char **dump_here) { +static int receive_AFC_data(iphone_afc_client_t client, char **dump_here) +{  	AFCPacket *r_packet; -	char *buffer = (char*)malloc(sizeof(AFCPacket) * 4); +	char *buffer = (char *) malloc(sizeof(AFCPacket) * 4);  	char *final_buffer = NULL; -	int bytes = 0, recv_len = 0, current_count=0; +	int bytes = 0, recv_len = 0, current_count = 0;  	int retval = 0; -	 +  	iphone_mux_recv(client->connection, buffer, sizeof(AFCPacket) * 4, &bytes);  	if (bytes <= 0) {  		free(buffer); @@ -219,102 +239,119 @@ static int receive_AFC_data(iphone_afc_client_t client, char **dump_here) {  		*dump_here = NULL;  		return -1;  	} -	 -	r_packet = (AFCPacket*)malloc(sizeof(AFCPacket)); + +	r_packet = (AFCPacket *) malloc(sizeof(AFCPacket));  	memcpy(r_packet, buffer, sizeof(AFCPacket)); -	 -	if (r_packet->entire_length == r_packet->this_length && r_packet->entire_length > sizeof(AFCPacket) && r_packet->operation != AFC_ERROR) { -		*dump_here = (char*)malloc(sizeof(char) * (r_packet->entire_length-sizeof(AFCPacket))); -		memcpy(*dump_here, buffer+sizeof(AFCPacket), r_packet->entire_length-sizeof(AFCPacket)); -                retval = r_packet->entire_length - sizeof(AFCPacket); + +	if (r_packet->entire_length == r_packet->this_length +		&& r_packet->entire_length > sizeof(AFCPacket) && r_packet->operation != AFC_ERROR) { +		*dump_here = (char *) malloc(sizeof(char) * (r_packet->entire_length - sizeof(AFCPacket))); +		memcpy(*dump_here, buffer + sizeof(AFCPacket), r_packet->entire_length - sizeof(AFCPacket)); +		retval = r_packet->entire_length - sizeof(AFCPacket);  		free(buffer);  		free(r_packet);  		return retval;  	} -	 +  	uint32 param1 = buffer[sizeof(AFCPacket)];  	free(buffer);  	if (r_packet->operation == AFC_ERROR && !(client->afc_packet->operation == AFC_DELETE && param1 == 7)) { -		if (debug) fprintf(stderr, "Oops? Bad operation code received: 0x%X, operation=0x%X, param1=%d\n", -				r_packet->operation, client->afc_packet->operation, param1); +		if (debug) +			fprintf(stderr, +					"Oops? Bad operation code received: 0x%X, operation=0x%X, param1=%d\n", +					r_packet->operation, client->afc_packet->operation, param1);  		recv_len = r_packet->entire_length - r_packet->this_length;  		free(r_packet); -		if (debug) fprintf(stderr, "recv_len=%d\n", recv_len); -		if(param1 == 0) { -			if (debug) fprintf(stderr, "... false alarm, but still\n"); +		if (debug) +			fprintf(stderr, "recv_len=%d\n", recv_len); +		if (param1 == 0) { +			if (debug) +				fprintf(stderr, "... false alarm, but still\n");  			*dump_here = NULL;  			return 0; +		} else { +			if (debug) +				fprintf(stderr, "Errno %i\n", param1);  		} -		else { if (debug) fprintf(stderr, "Errno %i\n", param1); }  		*dump_here = NULL;  		return -1;  	} else { -		if (debug) fprintf(stderr, "Operation code %x\nFull length %i and this length %i\n", r_packet->operation, r_packet->entire_length, r_packet->this_length); +		if (debug) +			fprintf(stderr, +					"Operation code %x\nFull length %i and this length %i\n", +					r_packet->operation, r_packet->entire_length, r_packet->this_length);  	}  	recv_len = r_packet->entire_length - r_packet->this_length;  	free(r_packet); -	if (!recv_len && r_packet->operation == AFC_SUCCESS_RESPONSE) -	{ +	if (!recv_len && r_packet->operation == AFC_SUCCESS_RESPONSE) {  		*dump_here = NULL;  		return 0;  	} -	  	// Keep collecting packets until we have received the entire file. -	buffer = (char*)malloc(sizeof(char) * (recv_len < MAXIMUM_PACKET_SIZE) ? recv_len : MAXIMUM_PACKET_SIZE); -	final_buffer = (char*)malloc(sizeof(char) * recv_len); -	while(current_count < recv_len){ -		iphone_mux_recv(client->connection, buffer, recv_len-current_count, &bytes); -		if (debug) fprintf(stderr, "receive_AFC_data: still collecting packets\n"); -		if (bytes < 0) -		{ -			if(debug) fprintf(stderr, "receive_AFC_data: mux_recv failed: %d\n", bytes); +	buffer = (char *) malloc(sizeof(char) * (recv_len < MAXIMUM_PACKET_SIZE) ? recv_len : MAXIMUM_PACKET_SIZE); +	final_buffer = (char *) malloc(sizeof(char) * recv_len); +	while (current_count < recv_len) { +		iphone_mux_recv(client->connection, buffer, recv_len - current_count, &bytes); +		if (debug) +			fprintf(stderr, "receive_AFC_data: still collecting packets\n"); +		if (bytes < 0) { +			if (debug) +				fprintf(stderr, "receive_AFC_data: mux_recv failed: %d\n", bytes);  			break;  		} -		if (bytes > recv_len-current_count) -		{ -			if(debug) fprintf(stderr, "receive_AFC_data: mux_recv delivered too much data\n"); +		if (bytes > recv_len - current_count) { +			if (debug) +				fprintf(stderr, "receive_AFC_data: mux_recv delivered too much data\n");  			break;  		}  		if (bytes > 7 && strstr(buffer, "CFA6LPAA")) { -			if (debug) fprintf(stderr, "receive_AFC_data: WARNING: there is AFC data in this packet at %ti\n", strstr(buffer, "CFA6LPAA") - buffer); -			if (debug) fprintf(stderr, "receive_AFC_data: the total packet length is %i\n", bytes); +			if (debug) +				fprintf(stderr, +						"receive_AFC_data: WARNING: there is AFC data in this packet at %ti\n", +						strstr(buffer, "CFA6LPAA") - buffer); +			if (debug) +				fprintf(stderr, "receive_AFC_data: the total packet length is %i\n", bytes);  		} -			 -		memcpy(final_buffer+current_count, buffer, bytes); + +		memcpy(final_buffer + current_count, buffer, bytes);  		current_count += bytes;  	}  	free(buffer); -	 +  	*dump_here = final_buffer;  	return current_count;  } -static int count_nullspaces(char *string, int number) { +static int count_nullspaces(char *string, int number) +{  	int i = 0, nulls = 0; -	 +  	for (i = 0; i < number; i++) { -		if (string[i] == '\0') nulls++; +		if (string[i] == '\0') +			nulls++;  	} -	 +  	return nulls;  } -static char **make_strings_list(char *tokens, int true_length) { +static char **make_strings_list(char *tokens, int true_length) +{  	int nulls = 0, i = 0, j = 0;  	char **list = NULL; -	 -	if (!tokens || !true_length) return NULL; -	 + +	if (!tokens || !true_length) +		return NULL; +  	nulls = count_nullspaces(tokens, true_length); -	list = (char**)malloc(sizeof(char*) * (nulls + 1)); +	list = (char **) malloc(sizeof(char *) * (nulls + 1));  	for (i = 0; i < nulls; i++) { -		list[i] = strdup(tokens+j); +		list[i] = strdup(tokens + j);  		j += strlen(list[i]) + 1;  	}  	list[i] = NULL; -	 +  	return list;  } @@ -326,15 +363,17 @@ static char **make_strings_list(char *tokens, int true_length) {   * @return A char ** list of files in that directory, terminated by an empty   *         string for now or NULL if there was an error.   */ -iphone_error_t iphone_afc_get_dir_list ( iphone_afc_client_t client, const char *dir, char ***list) { +iphone_error_t iphone_afc_get_dir_list(iphone_afc_client_t client, const char *dir, char ***list) +{  	int bytes = 0;  	char *data = NULL, **list_loc = NULL;  	iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR; -	 -	if (!client || !dir || !list || (list && *list)) return IPHONE_E_INVALID_ARG; + +	if (!client || !dir || !list || (list && *list)) +		return IPHONE_E_INVALID_ARG;  	afc_lock(client); -	 +  	// Send the command  	client->afc_packet->operation = AFC_LIST_DIR;  	client->afc_packet->entire_length = 0; @@ -344,22 +383,22 @@ iphone_error_t iphone_afc_get_dir_list ( iphone_afc_client_t client, const char  		afc_unlock(client);  		return IPHONE_E_NOT_ENOUGH_DATA;  	} -	  	// Receive the data  	bytes = receive_AFC_data(client, &data);  	if (bytes < 0 && !data) {  		afc_unlock(client);  		return IPHONE_E_NOT_ENOUGH_DATA; -       	} -	 +	}  	// Parse the data  	list_loc = make_strings_list(data, bytes); -	if (list_loc) ret = IPHONE_E_SUCCESS; -	if (data) free(data); +	if (list_loc) +		ret = IPHONE_E_SUCCESS; +	if (data) +		free(data);  	afc_unlock(client);  	*list = list_loc; -	 +  	return ret;  } @@ -370,14 +409,16 @@ iphone_error_t iphone_afc_get_dir_list ( iphone_afc_client_t client, const char   * @return A char ** list of parameters as given by AFC or NULL if there was an   *         error.   */ -iphone_error_t iphone_afc_get_devinfo ( iphone_afc_client_t client, char ***infos) { +iphone_error_t iphone_afc_get_devinfo(iphone_afc_client_t client, char ***infos) +{  	int bytes = 0;  	char *data = NULL, **list = NULL; -	 -	if (!client || !infos) return IPHONE_E_INVALID_ARG; + +	if (!client || !infos) +		return IPHONE_E_INVALID_ARG;  	afc_lock(client); -	 +  	// Send the command  	client->afc_packet->operation = AFC_GET_DEVINFO;  	client->afc_packet->entire_length = client->afc_packet->this_length = 0; @@ -386,18 +427,17 @@ iphone_error_t iphone_afc_get_devinfo ( iphone_afc_client_t client, char ***info  		afc_unlock(client);  		return IPHONE_E_NOT_ENOUGH_DATA;  	} -	  	// Receive the data  	bytes = receive_AFC_data(client, &data);  	if (bytes < 0 && !data) {  		afc_unlock(client);  		return IPHONE_E_NOT_ENOUGH_DATA; -	}  -	 +	}  	// Parse the data  	list = make_strings_list(data, bytes); -	if (data) free(data); -	 +	if (data) +		free(data); +  	afc_unlock(client);  	*infos = list;  	return IPHONE_E_SUCCESS; @@ -411,14 +451,16 @@ iphone_error_t iphone_afc_get_devinfo ( iphone_afc_client_t client, char ***info   * @return IPHONE_E_SUCCESS if everythong went well, IPHONE_E_INVALID_ARG   *         if arguments are NULL or invalid, IPHONE_E_NOT_ENOUGH_DATA otherwise.   */ -iphone_error_t iphone_afc_delete_file ( iphone_afc_client_t client, const char *path) { +iphone_error_t iphone_afc_delete_file(iphone_afc_client_t client, const char *path) +{  	char *response = NULL;  	int bytes; -	 -	if (!client || !path || !client->afc_packet || !client->connection) return IPHONE_E_INVALID_ARG; -	 + +	if (!client || !path || !client->afc_packet || !client->connection) +		return IPHONE_E_INVALID_ARG; +  	afc_lock(client); -	 +  	// Send command  	client->afc_packet->this_length = client->afc_packet->entire_length = 0;  	client->afc_packet->operation = AFC_DELETE; @@ -427,13 +469,13 @@ iphone_error_t iphone_afc_delete_file ( iphone_afc_client_t client, const char *  		afc_unlock(client);  		return IPHONE_E_NOT_ENOUGH_DATA;  	} -  	// Receive response  	bytes = receive_AFC_data(client, &response); -	if (response) free(response); -	 +	if (response) +		free(response); +  	afc_unlock(client); -	 +  	if (bytes < 0) {  		return IPHONE_E_NOT_ENOUGH_DATA;  	} else { @@ -450,18 +492,20 @@ iphone_error_t iphone_afc_delete_file ( iphone_afc_client_t client, const char *   * @return IPHONE_E_SUCCESS if everythong went well, IPHONE_E_INVALID_ARG   *         if arguments are NULL or invalid, IPHONE_E_NOT_ENOUGH_DATA otherwise.   */ -iphone_error_t iphone_afc_rename_file ( iphone_afc_client_t client, const char *from, const char *to) { +iphone_error_t iphone_afc_rename_file(iphone_afc_client_t client, const char *from, const char *to) +{  	char *response = NULL; -	char *send = (char*)malloc(sizeof(char) * (strlen(from) + strlen(to) + 1 + sizeof(uint32))); +	char *send = (char *) malloc(sizeof(char) * (strlen(from) + strlen(to) + 1 + sizeof(uint32)));  	int bytes = 0; -	 -	if (!client || !from || !to || !client->afc_packet || !client->connection) return IPHONE_E_INVALID_ARG; -	 + +	if (!client || !from || !to || !client->afc_packet || !client->connection) +		return IPHONE_E_INVALID_ARG; +  	afc_lock(client); -	 +  	// Send command -	memcpy(send, from, strlen(from)+1); -	memcpy(send+strlen(from)+1, to, strlen(to)+1); +	memcpy(send, from, strlen(from) + 1); +	memcpy(send + strlen(from) + 1, to, strlen(to) + 1);  	client->afc_packet->entire_length = client->afc_packet->this_length = 0;  	client->afc_packet->operation = AFC_RENAME;  	bytes = dispatch_AFC_packet(client, send, strlen(to) + strlen(from) + 2); @@ -470,13 +514,13 @@ iphone_error_t iphone_afc_rename_file ( iphone_afc_client_t client, const char *  		afc_unlock(client);  		return IPHONE_E_NOT_ENOUGH_DATA;  	} -	  	// Receive response  	bytes = receive_AFC_data(client, &response); -	if (response) free(response); +	if (response) +		free(response);  	afc_unlock(client); -	 +  	if (bytes < 0) {  		return IPHONE_E_NOT_ENOUGH_DATA;  	} else { @@ -493,14 +537,16 @@ iphone_error_t iphone_afc_rename_file ( iphone_afc_client_t client, const char *   * @return IPHONE_E_SUCCESS if everythong went well, IPHONE_E_INVALID_ARG   *         if arguments are NULL or invalid, IPHONE_E_NOT_ENOUGH_DATA otherwise.   */ -iphone_error_t iphone_afc_mkdir ( iphone_afc_client_t client, const char *dir) { +iphone_error_t iphone_afc_mkdir(iphone_afc_client_t client, const char *dir) +{  	int bytes = 0;  	char *response = NULL; -	 -	if (!client) return IPHONE_E_INVALID_ARG; -	 + +	if (!client) +		return IPHONE_E_INVALID_ARG; +  	afc_lock(client); -	 +  	// Send command  	client->afc_packet->operation = AFC_MAKE_DIR;  	client->afc_packet->this_length = client->afc_packet->entire_length = 0; @@ -509,13 +555,13 @@ iphone_error_t iphone_afc_mkdir ( iphone_afc_client_t client, const char *dir) {  		afc_unlock(client);  		return IPHONE_E_NOT_ENOUGH_DATA;  	} -	  	// Receive response  	bytes = receive_AFC_data(client, &response); -	if (response) free(response); +	if (response) +		free(response);  	afc_unlock(client); -	 +  	if (bytes < 0) {  		return IPHONE_E_NOT_ENOUGH_DATA;  	} else { @@ -531,18 +577,19 @@ iphone_error_t iphone_afc_mkdir ( iphone_afc_client_t client, const char *dir) {   * @return A pointer to an AFCFile struct containing the information received,   *         or NULL on failure.   */ -iphone_afc_file_t afc_get_file_info(iphone_afc_client_t client, const char *path) { +iphone_afc_file_t afc_get_file_info(iphone_afc_client_t client, const char *path) +{  	char *received, **list;  	iphone_afc_file_t my_file;  	int length, i = 0; -	 +  	afc_lock(client); -	 +  	// Send command  	client->afc_packet->operation = AFC_GET_INFO;  	client->afc_packet->entire_length = client->afc_packet->this_length = 0;  	dispatch_AFC_packet(client, path, strlen(path)); -	 +  	// Receive data  	length = receive_AFC_data(client, &received);  	if (received) { @@ -554,23 +601,23 @@ iphone_afc_file_t afc_get_file_info(iphone_afc_client_t client, const char *path  	}  	afc_unlock(client); -	 +  	// Parse the data  	if (list) { -		my_file = (iphone_afc_file_t)malloc(sizeof(struct iphone_afc_file_int)); +		my_file = (iphone_afc_file_t) malloc(sizeof(struct iphone_afc_file_int));  		for (i = 0; list[i]; i++) {  			if (!strcmp(list[i], "st_size")) { -				my_file->size = atoi(list[i+1]); +				my_file->size = atoi(list[i + 1]);  			} -			 +  			if (!strcmp(list[i], "st_blocks")) { -				my_file->blocks = atoi(list[i+1]); +				my_file->blocks = atoi(list[i + 1]);  			} -			 +  			if (!strcmp(list[i], "st_ifmt")) { -				if (!strcmp(list[i+1], "S_IFREG")) { +				if (!strcmp(list[i + 1], "S_IFREG")) {  					my_file->type = S_IFREG; -				} else if (!strcmp(list[i+1], "S_IFDIR")) { +				} else if (!strcmp(list[i + 1], "S_IFDIR")) {  					my_file->type = S_IFDIR;  				}  			} @@ -591,24 +638,27 @@ iphone_afc_file_t afc_get_file_info(iphone_afc_client_t client, const char *path   * @return A pointer to an AFCFile struct containing the information received,   *         or NULL on failure.   */ -iphone_error_t iphone_afc_get_file_attr ( iphone_afc_client_t client, const char *filename, struct stat *stbuf ) { +iphone_error_t iphone_afc_get_file_attr(iphone_afc_client_t client, const char *filename, struct stat * stbuf) +{  	iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR; -	if (!client ||!client->connection || !client->afc_packet || !stbuf) return IPHONE_E_INVALID_ARG; +	if (!client || !client->connection || !client->afc_packet || !stbuf) +		return IPHONE_E_INVALID_ARG;  	memset(stbuf, 0, sizeof(struct stat));  	iphone_afc_file_t file = afc_get_file_info(client, filename); -	if (!file){ +	if (!file) {  		ret = IPHONE_E_NO_SUCH_FILE;  	} else {  		stbuf->st_mode = file->type | (S_ISDIR(file->type) ? 0755 : 0644);  		stbuf->st_size = file->size; -		stbuf->st_blksize = 2048; // FIXME: Is this the actual block size used on the iPhone? +		stbuf->st_blksize = 2048;	// FIXME: Is this the actual block  +		// size used on the iPhone?  		stbuf->st_blocks = file->blocks;  		stbuf->st_uid = getuid();  		stbuf->st_gid = getgid(); -		ret = iphone_afc_close_file(client,file); +		ret = iphone_afc_close_file(client, file);  	}  	return ret;  } @@ -626,32 +676,36 @@ iphone_error_t iphone_afc_get_file_attr ( iphone_afc_client_t client, const char   *         received by afc_get_file_info) as well as the handle to the file or   *         NULL in the case of failure.   */ -iphone_error_t iphone_afc_open_file ( iphone_afc_client_t client, const char *filename, iphone_afc_file_mode_t file_mode, iphone_afc_file_t *file ) { +iphone_error_t +iphone_afc_open_file(iphone_afc_client_t client, const char *filename, +					 iphone_afc_file_mode_t file_mode, iphone_afc_file_t * file) +{  	iphone_afc_file_t file_loc = NULL;  	uint32 ag = 0;  	int bytes = 0, length = 0; -	char *data = (char*)malloc(sizeof(char) * (8 + strlen(filename) + 1)); -	 -	if (!client ||!client->connection || !client->afc_packet) return IPHONE_E_INVALID_ARG; -	 +	char *data = (char *) malloc(sizeof(char) * (8 + strlen(filename) + 1)); + +	if (!client || !client->connection || !client->afc_packet) +		return IPHONE_E_INVALID_ARG; +  	afc_lock(client); -	 +  	// Send command  	memcpy(data, &file_mode, 4); -	memcpy(data+4, &ag, 4); -	memcpy(data+8, filename, strlen(filename)); -	data[8+strlen(filename)] = '\0'; +	memcpy(data + 4, &ag, 4); +	memcpy(data + 8, filename, strlen(filename)); +	data[8 + strlen(filename)] = '\0';  	client->afc_packet->operation = AFC_FILE_OPEN;  	client->afc_packet->entire_length = client->afc_packet->this_length = 0; -	bytes = dispatch_AFC_packet(client, data, 8+strlen(filename)); +	bytes = dispatch_AFC_packet(client, data, 8 + strlen(filename));  	free(data); -	 +  	if (bytes <= 0) { -		if (debug) fprintf(stderr, "afc_open_file: Didn't receive a response to the command\n"); +		if (debug) +			fprintf(stderr, "afc_open_file: Didn't receive a response to the command\n");  		afc_unlock(client);  		return IPHONE_E_NOT_ENOUGH_DATA;  	} -	  	// Receive the data  	length = receive_AFC_data(client, &data);  	if (length > 0 && data) { @@ -664,13 +718,14 @@ iphone_error_t iphone_afc_open_file ( iphone_afc_client_t client, const char *fi  		*file = file_loc;  		return IPHONE_E_SUCCESS;  	} else { -		if (debug) fprintf(stderr, "afc_open_file: Didn't get any further data\n"); +		if (debug) +			fprintf(stderr, "afc_open_file: Didn't get any further data\n");  		afc_unlock(client);  		return IPHONE_E_NOT_ENOUGH_DATA;  	}  	afc_unlock(client); -	 +  	return IPHONE_E_UNKNOWN_ERROR;  } @@ -683,59 +738,70 @@ iphone_error_t iphone_afc_open_file ( iphone_afc_client_t client, const char *fi   *   * @return The number of bytes read if successful. If there was an error -1.   */ -iphone_error_t iphone_afc_read_file ( iphone_afc_client_t client, iphone_afc_file_t file, char *data, int length, uint32_t *bytes) { +iphone_error_t +iphone_afc_read_file(iphone_afc_client_t client, iphone_afc_file_t file, char *data, int length, uint32_t * bytes) +{  	char *input = NULL;  	int current_count = 0, bytes_loc = 0;  	const int MAXIMUM_READ_SIZE = 1 << 16; -	if (!client || !client->afc_packet || !client->connection || !file) return IPHONE_E_INVALID_ARG; -	if (debug) fprintf(stderr, "afc_read_file called for length %i\n", length); +	if (!client || !client->afc_packet || !client->connection || !file) +		return IPHONE_E_INVALID_ARG; +	if (debug) +		fprintf(stderr, "afc_read_file called for length %i\n", length);  	afc_lock(client); -	// Looping here to get around the maximum amount of data that recieve_AFC_data can handle -	while (current_count < length){ -		if (debug) fprintf(stderr, "afc_read_file: current count is %i but length is %i\n", current_count, length); -		 +	// Looping here to get around the maximum amount of data that +	// recieve_AFC_data can handle +	while (current_count < length) { +		if (debug) +			fprintf(stderr, "afc_read_file: current count is %i but length is %i\n", current_count, length); +  		// Send the read command -		AFCFilePacket *packet = (AFCFilePacket*)malloc(sizeof(AFCFilePacket)); +		AFCFilePacket *packet = (AFCFilePacket *) malloc(sizeof(AFCFilePacket));  		packet->unknown1 = packet->unknown2 = 0;  		packet->filehandle = file->filehandle;  		packet->size = ((length - current_count) < MAXIMUM_READ_SIZE) ? (length - current_count) : MAXIMUM_READ_SIZE;  		client->afc_packet->operation = AFC_READ;  		client->afc_packet->entire_length = client->afc_packet->this_length = 0; -		bytes_loc = dispatch_AFC_packet(client, (char*)packet, sizeof(AFCFilePacket)); +		bytes_loc = dispatch_AFC_packet(client, (char *) packet, sizeof(AFCFilePacket));  		free(packet); -		 +  		if (bytes_loc <= 0) {  			afc_unlock(client);  			return IPHONE_E_NOT_ENOUGH_DATA;  		} -  		// Receive the data  		bytes_loc = receive_AFC_data(client, &input); -		if (debug) fprintf(stderr, "afc_read_file: bytes returned: %i\n", bytes_loc); +		if (debug) +			fprintf(stderr, "afc_read_file: bytes returned: %i\n", bytes_loc);  		if (bytes_loc < 0) { -			if (input) free(input); +			if (input) +				free(input);  			afc_unlock(client);  			return IPHONE_E_NOT_ENOUGH_DATA;  		} else if (bytes_loc == 0) { -			if (input) free(input); +			if (input) +				free(input);  			afc_unlock(client);  			*bytes = current_count; -			return IPHONE_E_SUCCESS; //FIXME check that's actually a success +			return IPHONE_E_SUCCESS;	// FIXME check that's actually a +			// success  		} else {  			if (input) { -				if (debug) fprintf(stderr, "afc_read_file: %d\n", bytes_loc); -				memcpy(data+current_count, input, (bytes_loc > length) ? length : bytes_loc); +				if (debug) +					fprintf(stderr, "afc_read_file: %d\n", bytes_loc); +				memcpy(data + current_count, input, (bytes_loc > length) ? length : bytes_loc);  				free(input);  				input = NULL;  				current_count += (bytes_loc > length) ? length : bytes_loc;  			}  		}  	} -	if (debug) fprintf(stderr, "afc_read_file: returning current_count as %i\n", current_count); -	 +	if (debug) +		fprintf(stderr, "afc_read_file: returning current_count as %i\n", current_count); +  	afc_unlock(client);  	*bytes = current_count;  	return IPHONE_E_SUCCESS; @@ -751,17 +817,22 @@ iphone_error_t iphone_afc_read_file ( iphone_afc_client_t client, iphone_afc_fil   * @return The number of bytes written to the file, or a value less than 0 if   *         none were written...   */ -iphone_error_t iphone_afc_write_file ( iphone_afc_client_t client, iphone_afc_file_t file, const char *data, int length, uint32_t *bytes) { +iphone_error_t +iphone_afc_write_file(iphone_afc_client_t client, iphone_afc_file_t file, +					  const char *data, int length, uint32_t * bytes) +{  	char *acknowledgement = NULL;  	const int MAXIMUM_WRITE_SIZE = 1 << 16;  	uint32 zero = 0, bytes_loc = 0, segments = (length / MAXIMUM_WRITE_SIZE), current_count = 0, i = 0;  	char *out_buffer = NULL; -	if (!client ||!client->afc_packet || !client->connection || !file || !bytes) return IPHONE_E_INVALID_ARG; -	 +	if (!client || !client->afc_packet || !client->connection || !file || !bytes) +		return IPHONE_E_INVALID_ARG; +  	afc_lock(client); -	if (debug) fprintf(stderr, "afc_write_file: Write length: %i\n", length); +	if (debug) +		fprintf(stderr, "afc_write_file: Write length: %i\n", length);  	// Divide the file into segments.  	for (i = 0; i < segments; i++) { @@ -769,10 +840,10 @@ iphone_error_t iphone_afc_write_file ( iphone_afc_client_t client, iphone_afc_fi  		client->afc_packet->this_length = sizeof(AFCPacket) + 8;  		client->afc_packet->entire_length = client->afc_packet->this_length + MAXIMUM_WRITE_SIZE;  		client->afc_packet->operation = AFC_WRITE; -		out_buffer = (char*)malloc(sizeof(char) * client->afc_packet->entire_length - sizeof(AFCPacket)); -		memcpy(out_buffer, (char*)&file->filehandle, sizeof(uint32)); -		memcpy(out_buffer+4, (char*)&zero, sizeof(uint32)); -		memcpy(out_buffer+8, data+current_count, MAXIMUM_WRITE_SIZE); +		out_buffer = (char *) malloc(sizeof(char) * client->afc_packet->entire_length - sizeof(AFCPacket)); +		memcpy(out_buffer, (char *) &file->filehandle, sizeof(uint32)); +		memcpy(out_buffer + 4, (char *) &zero, sizeof(uint32)); +		memcpy(out_buffer + 8, data + current_count, MAXIMUM_WRITE_SIZE);  		bytes_loc = dispatch_AFC_packet(client, out_buffer, MAXIMUM_WRITE_SIZE + 8);  		if (bytes_loc < 0) {  			afc_unlock(client); @@ -788,39 +859,42 @@ iphone_error_t iphone_afc_write_file ( iphone_afc_client_t client, iphone_afc_fi  			return IPHONE_E_NOT_ENOUGH_DATA;  		}  	} -	 -	// By this point, we should be at the end. i.e. the last segment that didn't get sent in the for loop -	// this length is fine because it's always sizeof(AFCPacket) + 8, but to be sure we do it again + +	// By this point, we should be at the end. i.e. the last segment that +	// didn't get sent in the for loop +	// this length is fine because it's always sizeof(AFCPacket) + 8, but +	// to be sure we do it again  	if (current_count == length) {  		afc_unlock(client);  		*bytes = current_count;  		return IPHONE_E_SUCCESS;  	} -	 +  	client->afc_packet->this_length = sizeof(AFCPacket) + 8;  	client->afc_packet->entire_length = client->afc_packet->this_length + (length - current_count);  	client->afc_packet->operation = AFC_WRITE; -	out_buffer = (char*)malloc(sizeof(char) * client->afc_packet->entire_length - sizeof(AFCPacket)); -	memcpy(out_buffer, (char*)&file->filehandle, sizeof(uint32)); -	memcpy(out_buffer+4, (char*)&zero, sizeof(uint32)); -	memcpy(out_buffer+8, data+current_count, (length - current_count)); +	out_buffer = (char *) malloc(sizeof(char) * client->afc_packet->entire_length - sizeof(AFCPacket)); +	memcpy(out_buffer, (char *) &file->filehandle, sizeof(uint32)); +	memcpy(out_buffer + 4, (char *) &zero, sizeof(uint32)); +	memcpy(out_buffer + 8, data + current_count, (length - current_count));  	bytes_loc = dispatch_AFC_packet(client, out_buffer, (length - current_count) + 8);  	free(out_buffer);  	out_buffer = NULL; -	 +  	current_count += bytes_loc; -	 +  	if (bytes_loc <= 0) {  		afc_unlock(client);  		*bytes = current_count;  		return IPHONE_E_SUCCESS;  	} -	 +  	zero = bytes_loc;  	bytes_loc = receive_AFC_data(client, &acknowledgement);  	afc_unlock(client);  	if (bytes_loc < 0) { -		if (debug) fprintf(stderr, "afc_write_file: uh oh?\n"); +		if (debug) +			fprintf(stderr, "afc_write_file: uh oh?\n");  	}  	*bytes = current_count;  	return IPHONE_E_SUCCESS; @@ -832,19 +906,22 @@ iphone_error_t iphone_afc_write_file ( iphone_afc_client_t client, iphone_afc_fi   * @param file A pointer to an AFCFile struct containing the file handle of the   *        file to close.   */ -iphone_error_t iphone_afc_close_file ( iphone_afc_client_t client, iphone_afc_file_t file) { -	if (!client || !file) return IPHONE_E_INVALID_ARG; +iphone_error_t iphone_afc_close_file(iphone_afc_client_t client, iphone_afc_file_t file) +{ +	if (!client || !file) +		return IPHONE_E_INVALID_ARG;  	char *buffer = malloc(sizeof(char) * 8);  	uint32 zero = 0;  	int bytes = 0; -	 +  	afc_lock(client); -	 -	if (debug) fprintf(stderr, "afc_close_file: File handle %i\n", file->filehandle); -	 + +	if (debug) +		fprintf(stderr, "afc_close_file: File handle %i\n", file->filehandle); +  	// Send command  	memcpy(buffer, &file->filehandle, sizeof(uint32)); -	memcpy(buffer+sizeof(uint32), &zero, sizeof(zero)); +	memcpy(buffer + sizeof(uint32), &zero, sizeof(zero));  	client->afc_packet->operation = AFC_FILE_CLOSE;  	client->afc_packet->entire_length = client->afc_packet->this_length = 0;  	bytes = dispatch_AFC_packet(client, buffer, sizeof(char) * 8); @@ -852,16 +929,17 @@ iphone_error_t iphone_afc_close_file ( iphone_afc_client_t client, iphone_afc_fi  	buffer = NULL;  	// FIXME: Is this necesary? -	//client->afc_packet->entire_length = client->afc_packet->this_length = 0; -	 -	if (bytes <= 0) {  -		afc_unlock(client);  +	// client->afc_packet->entire_length = client->afc_packet->this_length  +	// = 0; + +	if (bytes <= 0) { +		afc_unlock(client);  		return IPHONE_E_UNKNOWN_ERROR;  	} -	  	// Receive the response  	bytes = receive_AFC_data(client, &buffer); -	if (buffer) free(buffer); +	if (buffer) +		free(buffer);  	free(file);  	afc_unlock(client);  	return IPHONE_E_SUCCESS; @@ -876,39 +954,41 @@ iphone_error_t iphone_afc_close_file ( iphone_afc_client_t client, iphone_afc_fi   *    * @return IPHONE_E_SUCCESS on success, IPHONE_E_NOT_ENOUGH_DATA on failure.   */ -iphone_error_t iphone_afc_seek_file ( iphone_afc_client_t client, iphone_afc_file_t file, int seekpos) { -	char *buffer = (char*)malloc(sizeof(char) * 24); +iphone_error_t iphone_afc_seek_file(iphone_afc_client_t client, iphone_afc_file_t file, int seekpos) +{ +	char *buffer = (char *) malloc(sizeof(char) * 24);  	uint32 seekto = 0, bytes = 0, zero = 0; -	 -	if (seekpos < 0) seekpos = file->size - abs(seekpos); + +	if (seekpos < 0) +		seekpos = file->size - abs(seekpos);  	afc_lock(client); -	 +  	// Send the command  	seekto = seekpos; -	memcpy(buffer, &file->filehandle, sizeof(uint32)); // handle -	memcpy(buffer+4, &zero, sizeof(uint32)); // pad -	memcpy(buffer+8, &zero, sizeof(uint32)); // fromwhere -	memcpy(buffer+12, &zero, sizeof(uint32)); // pad -	memcpy(buffer+16, &seekto, sizeof(uint32)); // offset -	memcpy(buffer+20, &zero, sizeof(uint32)); // pad +	memcpy(buffer, &file->filehandle, sizeof(uint32));	// handle +	memcpy(buffer + 4, &zero, sizeof(uint32));	// pad +	memcpy(buffer + 8, &zero, sizeof(uint32));	// fromwhere +	memcpy(buffer + 12, &zero, sizeof(uint32));	// pad +	memcpy(buffer + 16, &seekto, sizeof(uint32));	// offset +	memcpy(buffer + 20, &zero, sizeof(uint32));	// pad  	client->afc_packet->operation = AFC_FILE_SEEK;  	client->afc_packet->this_length = client->afc_packet->entire_length = 0;  	bytes = dispatch_AFC_packet(client, buffer, 23);  	free(buffer);  	buffer = NULL; -	 -	if (bytes <= 0) {  + +	if (bytes <= 0) {  		afc_unlock(client);  		return IPHONE_E_NOT_ENOUGH_DATA; -       	} -	 +	}  	// Receive response  	bytes = receive_AFC_data(client, &buffer); -	if (buffer) free(buffer); -	 +	if (buffer) +		free(buffer); +  	afc_unlock(client); -	 +  	if (bytes >= 0) {  		return IPHONE_E_SUCCESS;  	} else { @@ -927,17 +1007,18 @@ iphone_error_t iphone_afc_seek_file ( iphone_afc_client_t client, iphone_afc_fil   * @note This function is more akin to ftruncate than truncate, and truncate   *       calls would have to open the file before calling this, sadly.   */ -iphone_error_t iphone_afc_truncate_file ( iphone_afc_client_t client, iphone_afc_file_t file, uint32_t newsize) { -	char *buffer = (char*)malloc(sizeof(char) * 16); +iphone_error_t iphone_afc_truncate_file(iphone_afc_client_t client, iphone_afc_file_t file, uint32_t newsize) +{ +	char *buffer = (char *) malloc(sizeof(char) * 16);  	uint32 bytes = 0, zero = 0; -	 +  	afc_lock(client); -	 +  	// Send command -	memcpy(buffer, &file->filehandle, sizeof(uint32)); // handle -	memcpy(buffer+4, &zero, sizeof(uint32)); // pad -	memcpy(buffer+8, &newsize, sizeof(uint32)); // newsize -	memcpy(buffer+12, &zero, 3); // pad +	memcpy(buffer, &file->filehandle, sizeof(uint32));	// handle +	memcpy(buffer + 4, &zero, sizeof(uint32));	// pad +	memcpy(buffer + 8, &newsize, sizeof(uint32));	// newsize +	memcpy(buffer + 12, &zero, 3);	// pad  	client->afc_packet->operation = AFC_FILE_TRUNCATE;  	client->afc_packet->this_length = client->afc_packet->entire_length = 0;  	bytes = dispatch_AFC_packet(client, buffer, 15); @@ -948,13 +1029,13 @@ iphone_error_t iphone_afc_truncate_file ( iphone_afc_client_t client, iphone_afc  		afc_unlock(client);  		return IPHONE_E_NOT_ENOUGH_DATA;  	} -	  	// Receive response  	bytes = receive_AFC_data(client, &buffer); -	if (buffer) free(buffer); -	 +	if (buffer) +		free(buffer); +  	afc_unlock(client); -	 +  	if (bytes >= 0) {  		return IPHONE_E_SUCCESS;  	} else { @@ -71,4 +71,3 @@ enum {  	AFC_READ = 0x0000000f,  	AFC_WRITE = 0x00000010  }; - diff --git a/src/ifuse.c b/src/ifuse.c index c266879..ad34eb5 100644 --- a/src/ifuse.c +++ b/src/ifuse.c @@ -42,7 +42,8 @@ iphone_lckd_client_t control = NULL;  int debug = 0; -static int ifuse_getattr(const char *path, struct stat *stbuf) { +static int ifuse_getattr(const char *path, struct stat *stbuf) +{  	int res = 0;  	iphone_afc_client_t afc = fuse_get_context()->private_data; @@ -54,31 +55,32 @@ static int ifuse_getattr(const char *path, struct stat *stbuf) {  	return res;  } -static int ifuse_readdir(const char *path, void *buf, fuse_fill_dir_t filler, -			 off_t offset, struct fuse_file_info *fi) { +static int ifuse_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi) +{  	int i;  	char **dirs = NULL;  	iphone_afc_client_t afc = fuse_get_context()->private_data;  	iphone_afc_get_dir_list(afc, path, &dirs); -	if(!dirs) +	if (!dirs)  		return -ENOENT;  	for (i = 0; dirs[i]; i++) {  		filler(buf, dirs[i], NULL, 0);  	} -	 +  	free_dictionary(dirs);  	return 0;  } -static int ifuse_create(const char *path, mode_t mode, struct fuse_file_info *fi) { +static int ifuse_create(const char *path, mode_t mode, struct fuse_file_info *fi) +{  	// exactly the same as open but using a different mode  	iphone_afc_file_t file = NULL;  	iphone_afc_client_t afc = fuse_get_context()->private_data; -	 +  	iphone_afc_open_file(afc, path, IPHONE_AFC_FILE_WRITE, &file);  	fh_index++;  	fi->fh = fh_index; @@ -86,11 +88,12 @@ static int ifuse_create(const char *path, mode_t mode, struct fuse_file_info *fi  	return 0;  } -static int ifuse_open(const char *path, struct fuse_file_info *fi) { +static int ifuse_open(const char *path, struct fuse_file_info *fi) +{  	iphone_afc_file_t file = NULL;  	iphone_afc_client_t afc = fuse_get_context()->private_data;  	uint32_t mode = 0; -	 +  	if ((fi->flags & 3) == O_RDWR || (fi->flags & 3) == O_WRONLY) {  		mode = IPHONE_AFC_FILE_READ;  	} else if ((fi->flags & 3) == O_RDONLY) { @@ -98,9 +101,9 @@ static int ifuse_open(const char *path, struct fuse_file_info *fi) {  	} else {  		mode = IPHONE_AFC_FILE_READ;  	} -	 +  	iphone_afc_open_file(afc, path, mode, &file); -	 +  	fh_index++;  	fi->fh = fh_index;  	g_hash_table_insert(file_handles, &fh_index, file); @@ -108,8 +111,8 @@ static int ifuse_open(const char *path, struct fuse_file_info *fi) {  	return 0;  } -static int ifuse_read(const char *path, char *buf, size_t size, off_t offset, -			struct fuse_file_info *fi) { +static int ifuse_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi) +{  	int bytes = 0;  	iphone_afc_file_t file;  	iphone_afc_client_t afc = fuse_get_context()->private_data; @@ -118,7 +121,7 @@ static int ifuse_read(const char *path, char *buf, size_t size, off_t offset,  		return 0;  	file = g_hash_table_lookup(file_handles, &(fi->fh)); -	if (!file){ +	if (!file) {  		return -ENOENT;  	} @@ -127,171 +130,195 @@ static int ifuse_read(const char *path, char *buf, size_t size, off_t offset,  	return bytes;  } -static int ifuse_write(const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { +static int ifuse_write(const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi) +{  	int bytes = 0;  	iphone_afc_file_t file = NULL;  	iphone_afc_client_t afc = fuse_get_context()->private_data; -	 -	if (size == 0) return 0; -	 + +	if (size == 0) +		return 0; +  	file = g_hash_table_lookup(file_handles, &(fi->fh)); -	if (!file) return -ENOENT; -	 +	if (!file) +		return -ENOENT; +  	if (IPHONE_E_SUCCESS == iphone_afc_seek_file(afc, file, offset))  		iphone_afc_write_file(afc, file, buf, size, &bytes);  	return bytes;  } -static int ifuse_fsync(const char *path, int datasync, struct fuse_file_info *fi) { +static int ifuse_fsync(const char *path, int datasync, struct fuse_file_info *fi) +{  	return 0;  } -static int ifuse_release(const char *path, struct fuse_file_info *fi){ +static int ifuse_release(const char *path, struct fuse_file_info *fi) +{  	iphone_afc_file_t file = NULL;  	iphone_afc_client_t afc = fuse_get_context()->private_data; -	 +  	file = g_hash_table_lookup(file_handles, &(fi->fh)); -	if (!file){ +	if (!file) {  		return -ENOENT;  	}  	iphone_afc_close_file(afc, file); -	 +  	g_hash_table_remove(file_handles, &(fi->fh));  	return 0;  } -void *ifuse_init(struct fuse_conn_info *conn) { +void *ifuse_init(struct fuse_conn_info *conn) +{  	int port = 0;  	iphone_afc_client_t afc = NULL; -	 +  	conn->async_read = 0;  	file_handles = g_hash_table_new(g_int_hash, g_int_equal);  	iphone_get_device(&phone); -	if (!phone){ +	if (!phone) {  		fprintf(stderr, "No iPhone found, is it connected?\n");  		return NULL;  	} -	 +  	if (IPHONE_E_SUCCESS != iphone_lckd_new_client(phone, &control)) {  		iphone_free_device(phone);  		fprintf(stderr, "Something went wrong in the lockdownd client.\n");  		return NULL;  	} -	 +  	if (IPHONE_E_SUCCESS == iphone_lckd_start_service(control, "com.apple.afc", &port) && !port) {  		iphone_lckd_free_client(control);  		iphone_free_device(phone);  		fprintf(stderr, "Something went wrong when starting AFC."); -                return NULL; +		return NULL;  	}  	iphone_afc_new_client(phone, 3432, port, &afc); -        return afc; +	return afc;  } -void ifuse_cleanup(void *data) { -	iphone_afc_client_t afc = (iphone_afc_client_t )data; +void ifuse_cleanup(void *data) +{ +	iphone_afc_client_t afc = (iphone_afc_client_t) data;  	iphone_afc_free_client(afc);  	iphone_lckd_free_client(control);  	iphone_free_device(phone);  } -int ifuse_flush(const char *path, struct fuse_file_info *fi) { +int ifuse_flush(const char *path, struct fuse_file_info *fi) +{  	return 0;  } -int ifuse_statfs(const char *path, struct statvfs *stats) { +int ifuse_statfs(const char *path, struct statvfs *stats) +{  	iphone_afc_client_t afc = fuse_get_context()->private_data;  	char **info_raw = NULL;  	uint32_t totalspace = 0, freespace = 0, blocksize = 0, i = 0; -	 +  	iphone_afc_get_devinfo(afc, &info_raw); -	if (!info_raw) return -ENOENT; -	 +	if (!info_raw) +		return -ENOENT; +  	for (i = 0; info_raw[i]; i++) {  		if (!strcmp(info_raw[i], "FSTotalBytes")) { -			totalspace = atoi(info_raw[i+1]); +			totalspace = atoi(info_raw[i + 1]);  		} else if (!strcmp(info_raw[i], "FSFreeBytes")) { -			freespace = atoi(info_raw[i+1]); +			freespace = atoi(info_raw[i + 1]);  		} else if (!strcmp(info_raw[i], "FSBlockSize")) { -			blocksize = atoi(info_raw[i+1]); +			blocksize = atoi(info_raw[i + 1]);  		}  	}  	free_dictionary(info_raw); -	 +  	// Now to fill the struct.  	stats->f_bsize = stats->f_frsize = blocksize; -	stats->f_blocks = totalspace / blocksize; // gets the blocks by dividing bytes by blocksize -	stats->f_bfree = stats->f_bavail = freespace / blocksize; // all bytes are free to everyone, I guess. -	stats->f_namemax = 255; // blah -	stats->f_files = stats->f_ffree = 1000000000; // make up any old thing, I guess +	stats->f_blocks = totalspace / blocksize;	// gets the blocks by dividing bytes by blocksize +	stats->f_bfree = stats->f_bavail = freespace / blocksize;	// all bytes are free to everyone, I guess. +	stats->f_namemax = 255;		// blah +	stats->f_files = stats->f_ffree = 1000000000;	// make up any old thing, I guess  	return 0;  } -int ifuse_truncate(const char *path, off_t size) { +int ifuse_truncate(const char *path, off_t size) +{  	int result = 0;  	iphone_afc_client_t afc = fuse_get_context()->private_data;  	iphone_afc_file_t tfile = NULL;  	iphone_afc_open_file(afc, path, IPHONE_AFC_FILE_READ, &tfile); -	if (!tfile) return -1; -	 +	if (!tfile) +		return -1; +  	result = iphone_afc_truncate_file(afc, tfile, size);  	iphone_afc_close_file(afc, tfile);  	return result;  } -int ifuse_ftruncate(const char *path, off_t size, struct fuse_file_info *fi) { +int ifuse_ftruncate(const char *path, off_t size, struct fuse_file_info *fi) +{  	iphone_afc_client_t afc = fuse_get_context()->private_data;  	iphone_afc_file_t file = g_hash_table_lookup(file_handles, &fi->fh); -	if (!file) return -ENOENT; -	 +	if (!file) +		return -ENOENT; +  	return iphone_afc_truncate_file(afc, file, size);  } -int ifuse_unlink(const char *path) { +int ifuse_unlink(const char *path) +{  	iphone_afc_client_t afc = fuse_get_context()->private_data; -	if (IPHONE_E_SUCCESS == iphone_afc_delete_file(afc, path)) return 0; -	else return -1; +	if (IPHONE_E_SUCCESS == iphone_afc_delete_file(afc, path)) +		return 0; +	else +		return -1;  } -int ifuse_rename(const char *from, const char *to) { +int ifuse_rename(const char *from, const char *to) +{  	iphone_afc_client_t afc = fuse_get_context()->private_data; -	if (IPHONE_E_SUCCESS == iphone_afc_rename_file(afc, from, to)) return 0; -	else return -1; +	if (IPHONE_E_SUCCESS == iphone_afc_rename_file(afc, from, to)) +		return 0; +	else +		return -1;  } -int ifuse_mkdir(const char *dir, mode_t ignored) { +int ifuse_mkdir(const char *dir, mode_t ignored) +{  	iphone_afc_client_t afc = fuse_get_context()->private_data; -	if (IPHONE_E_SUCCESS == iphone_afc_mkdir(afc, dir)) return 0; -	else return -1; +	if (IPHONE_E_SUCCESS == iphone_afc_mkdir(afc, dir)) +		return 0; +	else +		return -1;  }  static struct fuse_operations ifuse_oper = { -	.getattr	= ifuse_getattr, -	.statfs		= ifuse_statfs, -	.readdir	= ifuse_readdir, -	.mkdir		= ifuse_mkdir, -	.rmdir		= ifuse_unlink, // AFC uses the same op for both. -	.create		= ifuse_create, -	.open		= ifuse_open, -	.read		= ifuse_read, -	.write		= ifuse_write, -	.truncate 	= ifuse_truncate, -	.ftruncate	= ifuse_ftruncate, -	.unlink		= ifuse_unlink, -	.rename		= ifuse_rename, -	.fsync 		= ifuse_fsync, -	.release	= ifuse_release, -	.init		= ifuse_init, -	.destroy	= ifuse_cleanup +	.getattr = ifuse_getattr, +	.statfs = ifuse_statfs, +	.readdir = ifuse_readdir, +	.mkdir = ifuse_mkdir, +	.rmdir = ifuse_unlink,		// AFC uses the same op for both. +	.create = ifuse_create, +	.open = ifuse_open, +	.read = ifuse_read, +	.write = ifuse_write, +	.truncate = ifuse_truncate, +	.ftruncate = ifuse_ftruncate, +	.unlink = ifuse_unlink, +	.rename = ifuse_rename, +	.fsync = ifuse_fsync, +	.release = ifuse_release, +	.init = ifuse_init, +	.destroy = ifuse_cleanup  }; -int main(int argc, char *argv[]) { +int main(int argc, char *argv[]) +{  	return fuse_main(argc, argv, &ifuse_oper, NULL);  } diff --git a/src/initconf.c b/src/initconf.c index b900f7f..412dd70 100644 --- a/src/initconf.c +++ b/src/initconf.c @@ -36,38 +36,43 @@ int debug = 1;   *   * @param key The pointer to the desired location of the new key.   */ -void generate_key(gpointer key){ -	gnutls_x509_privkey_generate(*((gnutls_x509_privkey_t*)key), GNUTLS_PK_RSA, 2048, 0); +void generate_key(gpointer key) +{ +	gnutls_x509_privkey_generate(*((gnutls_x509_privkey_t *) key), GNUTLS_PK_RSA, 2048, 0);  	g_thread_exit(0);  } +  /** Simple function that generates a spinner until the mutex is released.   */ -void progress_bar(gpointer mutex){ +void progress_bar(gpointer mutex) +{  	const char *spinner = "|/-\\|/-\\";  	int i = 0; -	while (!g_static_mutex_trylock((GStaticMutex*)mutex)){ +	while (!g_static_mutex_trylock((GStaticMutex *) mutex)) {  		usleep(500000);  		printf("Generating key... %c\r", spinner[i++]);  		fflush(stdout); -		if (i > 8) i = 0; +		if (i > 8) +			i = 0;  	}  	printf("Generating key... done\n");  	g_thread_exit(0);  } -int main(int argc, char *argv[]) { +int main(int argc, char *argv[]) +{  	GThread *progress_thread, *key_thread;  	GError *err;  	static GStaticMutex mutex = G_STATIC_MUTEX_INIT; -	char* host_id = NULL; +	char *host_id = NULL;  	gnutls_x509_privkey_t root_privkey;  	gnutls_x509_privkey_t host_privkey;  	gnutls_x509_crt_t root_cert;  	gnutls_x509_crt_t host_cert;  	// Create the thread -	if (!g_thread_supported()){ +	if (!g_thread_supported()) {  		g_thread_init(NULL);  	}  	gnutls_global_init(); @@ -88,28 +93,28 @@ int main(int argc, char *argv[]) {  	/* generate root key */  	g_static_mutex_lock(&mutex); -	if((key_thread = g_thread_create((GThreadFunc)generate_key, &root_privkey, TRUE, &err)) == NULL) { -	   printf("Thread create failed: %s!!\n", err->message ); -	   g_error_free(err) ; +	if ((key_thread = g_thread_create((GThreadFunc) generate_key, &root_privkey, TRUE, &err)) == NULL) { +		printf("Thread create failed: %s!!\n", err->message); +		g_error_free(err);  	} -	if((progress_thread = g_thread_create((GThreadFunc)progress_bar, &mutex, TRUE, &err)) == NULL) { -	   printf("Thread create failed: %s!!\n", err->message ); -	   g_error_free(err) ; +	if ((progress_thread = g_thread_create((GThreadFunc) progress_bar, &mutex, TRUE, &err)) == NULL) { +		printf("Thread create failed: %s!!\n", err->message); +		g_error_free(err);  	}  	g_thread_join(key_thread);  	g_static_mutex_unlock(&mutex);  	g_thread_join(progress_thread); -	 +  	/* generate host key */  	g_static_mutex_init(&mutex);  	g_static_mutex_lock(&mutex); -	if((key_thread = g_thread_create((GThreadFunc)generate_key, &host_privkey, TRUE, &err)) == NULL) { -	   printf("Thread create failed: %s!!\n", err->message ); -	   g_error_free(err) ; +	if ((key_thread = g_thread_create((GThreadFunc) generate_key, &host_privkey, TRUE, &err)) == NULL) { +		printf("Thread create failed: %s!!\n", err->message); +		g_error_free(err);  	} -	if((progress_thread = g_thread_create((GThreadFunc)progress_bar, &mutex, TRUE, &err)) == NULL) { -	   printf("Thread create failed: %s!!\n", err->message ); -	   g_error_free(err) ; +	if ((progress_thread = g_thread_create((GThreadFunc) progress_bar, &mutex, TRUE, &err)) == NULL) { +		printf("Thread create failed: %s!!\n", err->message); +		g_error_free(err);  	}  	g_thread_join(key_thread);  	g_static_mutex_unlock(&mutex); @@ -136,33 +141,33 @@ int main(int argc, char *argv[]) {  	/* export to PEM format */ -	gnutls_datum_t root_key_pem = {NULL, 0}; -	gnutls_datum_t host_key_pem = {NULL, 0}; +	gnutls_datum_t root_key_pem = { NULL, 0 }; +	gnutls_datum_t host_key_pem = { NULL, 0 }; -	gnutls_x509_privkey_export (root_privkey, GNUTLS_X509_FMT_PEM,  NULL, &root_key_pem.size); -	gnutls_x509_privkey_export (host_privkey, GNUTLS_X509_FMT_PEM,  NULL, &host_key_pem.size); +	gnutls_x509_privkey_export(root_privkey, GNUTLS_X509_FMT_PEM, NULL, &root_key_pem.size); +	gnutls_x509_privkey_export(host_privkey, GNUTLS_X509_FMT_PEM, NULL, &host_key_pem.size);  	root_key_pem.data = gnutls_malloc(root_key_pem.size);  	host_key_pem.data = gnutls_malloc(host_key_pem.size); -	gnutls_x509_privkey_export (root_privkey, GNUTLS_X509_FMT_PEM,  root_key_pem.data, &root_key_pem.size); -	gnutls_x509_privkey_export (host_privkey, GNUTLS_X509_FMT_PEM,  host_key_pem.data, &host_key_pem.size); +	gnutls_x509_privkey_export(root_privkey, GNUTLS_X509_FMT_PEM, root_key_pem.data, &root_key_pem.size); +	gnutls_x509_privkey_export(host_privkey, GNUTLS_X509_FMT_PEM, host_key_pem.data, &host_key_pem.size); -	gnutls_datum_t root_cert_pem = {NULL, 0}; -	gnutls_datum_t host_cert_pem = {NULL, 0}; +	gnutls_datum_t root_cert_pem = { NULL, 0 }; +	gnutls_datum_t host_cert_pem = { NULL, 0 }; -	gnutls_x509_crt_export (root_cert, GNUTLS_X509_FMT_PEM,  NULL, &root_cert_pem.size); -	gnutls_x509_crt_export (host_cert, GNUTLS_X509_FMT_PEM,  NULL, &host_cert_pem.size); +	gnutls_x509_crt_export(root_cert, GNUTLS_X509_FMT_PEM, NULL, &root_cert_pem.size); +	gnutls_x509_crt_export(host_cert, GNUTLS_X509_FMT_PEM, NULL, &host_cert_pem.size);  	root_cert_pem.data = gnutls_malloc(root_cert_pem.size);  	host_cert_pem.data = gnutls_malloc(host_cert_pem.size);  	printf("Generating root certificate..."); -	gnutls_x509_crt_export (root_cert, GNUTLS_X509_FMT_PEM,  root_cert_pem.data, &root_cert_pem.size); +	gnutls_x509_crt_export(root_cert, GNUTLS_X509_FMT_PEM, root_cert_pem.data, &root_cert_pem.size);  	printf("done\n");  	printf("Generating host certificate..."); -	gnutls_x509_crt_export (host_cert, GNUTLS_X509_FMT_PEM,  host_cert_pem.data, &host_cert_pem.size); +	gnutls_x509_crt_export(host_cert, GNUTLS_X509_FMT_PEM, host_cert_pem.data, &host_cert_pem.size);  	printf("done\n"); @@ -176,4 +181,3 @@ int main(int argc, char *argv[]) {  	return 0;  } - diff --git a/src/iphone.c b/src/iphone.c index 68963fe..2c4c541 100644 --- a/src/iphone.c +++ b/src/iphone.c @@ -27,43 +27,42 @@  #include <stdlib.h>  #include <string.h> -extern int debug;  +extern int debug;  /** Gets a handle to an iPhone   *    * @return A structure with data on the first iPhone it finds.  (Or NULL, on   *         error)   */ -iphone_error_t iphone_get_device ( iphone_device_t *device ){ +iphone_error_t iphone_get_device(iphone_device_t * device) +{  	//check we can actually write in device  	if (!device || (device && *device))  		return IPHONE_E_INVALID_ARG;  	struct usb_bus *bus, *busses;  	struct usb_device *dev; -	iphone_device_t phone = (iphone_device_t)malloc(sizeof(struct iphone_device_int)); -	 +	iphone_device_t phone = (iphone_device_t) malloc(sizeof(struct iphone_device_int)); +  	// Initialize the struct  	phone->device = NULL;  	phone->__device = NULL; -        phone->buffer = NULL; -	 +	phone->buffer = NULL; +  	// Initialize libusb  	usb_init();  	usb_find_busses();  	usb_find_devices();  	busses = usb_get_busses(); -	 +  	// Set the device configuration -	for (bus = busses; bus; bus = bus->next) {  +	for (bus = busses; bus; bus = bus->next) {  		for (dev = bus->devices; dev; dev = dev->next) { -			if (dev->descriptor.idVendor == 0x05ac &&  +			if (dev->descriptor.idVendor == 0x05ac &&  				(dev->descriptor.idProduct == 0x1290 || -				 dev->descriptor.idProduct == 0x1291 || -				 dev->descriptor.idProduct == 0x1292 -				) -			    ) { +				 dev->descriptor.idProduct == 0x1291 || dev->descriptor.idProduct == 0x1292) +				) {  				phone->__device = dev;  				phone->device = usb_open(phone->__device);  				usb_set_configuration(phone->device, 3); @@ -71,20 +70,21 @@ iphone_error_t iphone_get_device ( iphone_device_t *device ){  				break;  			}  		} -		if (phone->__device && phone->device) break; +		if (phone->__device && phone->device) +			break;  	} -	 +  	// Check to see if we are connected  	if (!phone->device || !phone->__device) {  		iphone_free_device(phone); -		if (debug) fprintf(stderr, "get_iPhone(): iPhone not found\n"); +		if (debug) +			fprintf(stderr, "get_iPhone(): iPhone not found\n");  		return IPHONE_E_NO_DEVICE;  	} -  	// Send the version command to the phone  	int bytes = 0;  	usbmux_version_header *version = version_header(); -	bytes = usb_bulk_write(phone->device, BULKOUT, (char*)version, sizeof(*version), 800); +	bytes = usb_bulk_write(phone->device, BULKOUT, (char *) version, sizeof(*version), 800);  	if (bytes < 20 && debug) {  		fprintf(stderr, "get_iPhone(): libusb did NOT send enough!\n");  		if (bytes < 0) { @@ -92,20 +92,20 @@ iphone_error_t iphone_get_device ( iphone_device_t *device ){  					bytes, usb_strerror(), strerror(-bytes));  		}  	} -  	// Read the phone's response -	bytes = usb_bulk_read(phone->device, BULKIN, (char*)version, sizeof(*version), 800); -	 +	bytes = usb_bulk_read(phone->device, BULKIN, (char *) version, sizeof(*version), 800); +  	// Check for bad response  	if (bytes < 20) {  		free(version);  		iphone_free_device(phone); -		if (debug) fprintf(stderr, "get_iPhone(): Invalid version message -- header too short.\n"); -		if (debug && bytes < 0) fprintf(stderr, "get_iPhone(): libusb error message %d: %s (%s)\n", -						bytes, usb_strerror(), strerror(-bytes)); +		if (debug) +			fprintf(stderr, "get_iPhone(): Invalid version message -- header too short.\n"); +		if (debug && bytes < 0) +			fprintf(stderr, "get_iPhone(): libusb error message %d: %s (%s)\n", +					bytes, usb_strerror(), strerror(-bytes));  		return IPHONE_E_NOT_ENOUGH_DATA;  	} -  	// Check for correct version  	if (ntohl(version->major) == 1 && ntohl(version->minor) == 0) {  		// We're all ready to roll. @@ -117,15 +117,17 @@ iphone_error_t iphone_get_device ( iphone_device_t *device ){  		// Bad header  		iphone_free_device(phone);  		free(version); -		if (debug) fprintf(stderr, "get_iPhone(): Received a bad header/invalid version number."); +		if (debug) +			fprintf(stderr, "get_iPhone(): Received a bad header/invalid version number.");  		return IPHONE_E_BAD_HEADER;  	}  	// If it got to this point it's gotta be bad -	if (debug) fprintf(stderr, "get_iPhone(): Unknown error.\n"); +	if (debug) +		fprintf(stderr, "get_iPhone(): Unknown error.\n");  	iphone_free_device(phone);  	free(version); -	return IPHONE_E_UNKNOWN_ERROR; // if it got to this point it's gotta be bad +	return IPHONE_E_UNKNOWN_ERROR;	// if it got to this point it's gotta be bad  }  /** Cleans up an iPhone structure, then frees the structure itself.   @@ -134,8 +136,10 @@ iphone_error_t iphone_get_device ( iphone_device_t *device ){   *    * @param phone A pointer to an iPhone structure.   */ -iphone_error_t iphone_free_device ( iphone_device_t device ) { -	if (!device) return IPHONE_E_INVALID_ARG; +iphone_error_t iphone_free_device(iphone_device_t device) +{ +	if (!device) +		return IPHONE_E_INVALID_ARG;  	iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR;  	if (device->buffer) { @@ -150,7 +154,7 @@ iphone_error_t iphone_free_device ( iphone_device_t device ) {  	free(device);  	return ret;  } -  +  /** Sends data to the phone   * This is a low-level (i.e. directly to phone) function.   *  @@ -159,22 +163,27 @@ iphone_error_t iphone_free_device ( iphone_device_t device ) {   * @param datalen The length of the data   * @return The number of bytes sent, or -1 on error or something.   */ -int send_to_phone(iphone_device_t phone, char *data, int datalen) { -	if (!phone) return -1; +int send_to_phone(iphone_device_t phone, char *data, int datalen) +{ +	if (!phone) +		return -1;  	int bytes = 0; -	 -	if (!phone) return -1; -	if (debug) fprintf(stderr, "send_to_phone: Attempting to send datalen = %i data = %p\n", datalen, data); + +	if (!phone) +		return -1; +	if (debug) +		fprintf(stderr, "send_to_phone: Attempting to send datalen = %i data = %p\n", datalen, data);  	bytes = usb_bulk_write(phone->device, BULKOUT, data, datalen, 800);  	if (bytes < datalen) { -		if(debug && bytes < 0) -			fprintf(stderr, "send_to_iphone(): libusb gave me the error %d: %s - %s\n", bytes, usb_strerror(), strerror(-bytes)); +		if (debug && bytes < 0) +			fprintf(stderr, "send_to_iphone(): libusb gave me the error %d: %s - %s\n", bytes, usb_strerror(), +					strerror(-bytes));  		return -1;  	} else {  		return bytes;  	} -	 +  	return -1;  } @@ -186,18 +195,24 @@ int send_to_phone(iphone_device_t phone, char *data, int datalen) {   *    * @return How many bytes were read in, or -1 on error.   */ -int recv_from_phone(iphone_device_t phone, char *data, int datalen) { -	if (!phone) return -1; +int recv_from_phone(iphone_device_t phone, char *data, int datalen) +{ +	if (!phone) +		return -1;  	int bytes = 0; -	 -	if (!phone) return -1; -	if (debug) fprintf(stderr, "recv_from_phone(): attempting to receive %i bytes\n", datalen); -	 + +	if (!phone) +		return -1; +	if (debug) +		fprintf(stderr, "recv_from_phone(): attempting to receive %i bytes\n", datalen); +  	bytes = usb_bulk_read(phone->device, BULKIN, data, datalen, 3500);  	if (bytes < 0) { -		if(debug) fprintf(stderr, "recv_from_phone(): libusb gave me the error %d: %s (%s)\n", bytes, usb_strerror(), strerror(-bytes)); +		if (debug) +			fprintf(stderr, "recv_from_phone(): libusb gave me the error %d: %s (%s)\n", bytes, usb_strerror(), +					strerror(-bytes));  		return -1;  	} -	 +  	return bytes;  } diff --git a/src/iphone.h b/src/iphone.h index 556a93a..222a1be 100644 --- a/src/iphone.h +++ b/src/iphone.h @@ -22,7 +22,7 @@  #ifndef IPHONE_H  #define IPHONE_H -#ifndef USBMUX_H  +#ifndef USBMUX_H  #include "usbmux.h"  #warning usbmux not included?  #endif diff --git a/src/lockdown.c b/src/lockdown.c index e5420a3..80974d2 100644 --- a/src/lockdown.c +++ b/src/lockdown.c @@ -32,16 +32,17 @@  extern int debug; -const ASN1_ARRAY_TYPE pkcs1_asn1_tab[]={ -  {"PKCS1",536872976,0}, -  {0,1073741836,0}, -  {"RSAPublicKey",536870917,0}, -  {"modulus",1073741827,0}, -  {"publicExponent",3,0}, -  {0,0,0} +const ASN1_ARRAY_TYPE pkcs1_asn1_tab[] = { +	{"PKCS1", 536872976, 0}, +	{0, 1073741836, 0}, +	{"RSAPublicKey", 536870917, 0}, +	{"modulus", 1073741827, 0}, +	{"publicExponent", 3, 0}, +	{0, 0, 0}  }; -int get_rand(int min, int max) { +int get_rand(int min, int max) +{  	int retval = (rand() % (max - min)) + min;  	return retval;  } @@ -50,21 +51,22 @@ int get_rand(int min, int max) {   *   * @param A null terminated string containing a valid HostID.   */ -char *lockdownd_generate_hostid() { -	char *hostid = (char*)malloc(sizeof(char) * 37); // HostID's are just UUID's, and UUID's are 36 characters long +char *lockdownd_generate_hostid() +{ +	char *hostid = (char *) malloc(sizeof(char) * 37);	// HostID's are just UUID's, and UUID's are 36 characters long  	const char *chars = "ABCDEF0123456789";  	srand(time(NULL));  	int i = 0; -	 +  	for (i = 0; i < 36; i++) {  		if (i == 8 || i == 13 || i == 18 || i == 23) {  			hostid[i] = '-';  			continue;  		} else { -			hostid[i] = chars[get_rand(0,16)]; +			hostid[i] = chars[get_rand(0, 16)];  		}  	} -	hostid[36] = '\0'; // make it a real string +	hostid[36] = '\0';			// make it a real string  	return hostid;  } @@ -74,16 +76,18 @@ char *lockdownd_generate_hostid() {   *   * @return The lockdownd client.   */ -iphone_lckd_client_t new_lockdownd_client(iphone_device_t phone) { -	if (!phone) return NULL; -	iphone_lckd_client_t control = (iphone_lckd_client_t)malloc(sizeof(struct iphone_lckd_client_int)); +iphone_lckd_client_t new_lockdownd_client(iphone_device_t phone) +{ +	if (!phone) +		return NULL; +	iphone_lckd_client_t control = (iphone_lckd_client_t) malloc(sizeof(struct iphone_lckd_client_int)); -	if (IPHONE_E_SUCCESS != iphone_mux_new_client ( phone, 0x0a00, 0xf27e, &control->connection)) { +	if (IPHONE_E_SUCCESS != iphone_mux_new_client(phone, 0x0a00, 0xf27e, &control->connection)) {  		free(control);  		return NULL;  	} -	 -	control->ssl_session = (gnutls_session_t*)malloc(sizeof(gnutls_session_t)); + +	control->ssl_session = (gnutls_session_t *) malloc(sizeof(gnutls_session_t));  	control->in_SSL = 0;  	control->gtls_buffer_hack_len = 0;  	return control; @@ -94,15 +98,18 @@ iphone_lckd_client_t new_lockdownd_client(iphone_device_t phone) {   *   * @param control The lockdown client   */ -iphone_error_t iphone_lckd_free_client( iphone_lckd_client_t client ) { -	if (!client) return IPHONE_E_INVALID_ARG; +iphone_error_t iphone_lckd_free_client(iphone_lckd_client_t client) +{ +	if (!client) +		return IPHONE_E_INVALID_ARG;  	iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR;  	if (client->connection) {  		ret = iphone_mux_free_client(client->connection);  	} -	if (client->ssl_session) gnutls_deinit(*client->ssl_session); +	if (client->ssl_session) +		gnutls_deinit(*client->ssl_session);  	free(client->ssl_session);  	free(client);  	return ret; @@ -116,24 +123,30 @@ iphone_error_t iphone_lckd_free_client( iphone_lckd_client_t client ) {   *   * @return The number of bytes received   */ -iphone_error_t iphone_lckd_recv ( iphone_lckd_client_t client, char **dump_data, uint32_t *recv_bytes ) { -	if (!client || !dump_data || !recv_bytes) return IPHONE_E_INVALID_ARG; +iphone_error_t iphone_lckd_recv(iphone_lckd_client_t client, char **dump_data, uint32_t * recv_bytes) +{ +	if (!client || !dump_data || !recv_bytes) +		return IPHONE_E_INVALID_ARG;  	iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR;  	char *receive;  	uint32 datalen = 0, bytes = 0; -	 -	if (!client->in_SSL) ret = iphone_mux_recv(client->connection, (char *)&datalen, sizeof(datalen), &bytes); + +	if (!client->in_SSL) +		ret = iphone_mux_recv(client->connection, (char *) &datalen, sizeof(datalen), &bytes);  	else {  		bytes = gnutls_record_recv(*client->ssl_session, &datalen, sizeof(datalen)); -		if (bytes > 0) ret = IPHONE_E_SUCCESS; +		if (bytes > 0) +			ret = IPHONE_E_SUCCESS;  	}  	datalen = ntohl(datalen); -	 -	receive = (char*)malloc(sizeof(char) * datalen); -	if (!client->in_SSL) ret = iphone_mux_recv(client->connection, receive, datalen, &bytes); + +	receive = (char *) malloc(sizeof(char) * datalen); +	if (!client->in_SSL) +		ret = iphone_mux_recv(client->connection, receive, datalen, &bytes);  	else {  		bytes = gnutls_record_recv(*client->ssl_session, receive, datalen); -		if (bytes > 0) ret = IPHONE_E_SUCCESS; +		if (bytes > 0) +			ret = IPHONE_E_SUCCESS;  	}  	*dump_data = receive;  	*recv_bytes = bytes; @@ -151,30 +164,34 @@ iphone_error_t iphone_lckd_recv ( iphone_lckd_client_t client, char **dump_data,   *   * @return The number of bytes sent   */ -iphone_error_t iphone_lckd_send ( iphone_lckd_client_t client, char *raw_data, uint32_t length, uint32_t *sent_bytes ) { -	if (!client || !raw_data || length == 0 || !sent_bytes) return IPHONE_E_INVALID_ARG; +iphone_error_t iphone_lckd_send(iphone_lckd_client_t client, char *raw_data, uint32_t length, uint32_t * sent_bytes) +{ +	if (!client || !raw_data || length == 0 || !sent_bytes) +		return IPHONE_E_INVALID_ARG;  	char *real_query;  	int bytes;  	iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR; -	real_query = (char*)malloc(sizeof(char) * (length+4)); +	real_query = (char *) malloc(sizeof(char) * (length + 4));  	length = htonl(length);  	memcpy(real_query, &length, sizeof(length)); -	memcpy(real_query+4, raw_data, ntohl(length)); +	memcpy(real_query + 4, raw_data, ntohl(length));  	if (debug) {  		printf("lockdownd_send(): made the query, sending it along\n");  		FILE *packet = fopen("grpkt", "w"); -		fwrite(real_query, 1, ntohl(length)+4, packet); +		fwrite(real_query, 1, ntohl(length) + 4, packet);  		fclose(packet);  		packet = NULL;  	} -	 -	if (!client->in_SSL) ret = iphone_mux_send(client->connection, real_query, ntohl(length)+sizeof(length), &bytes); + +	if (!client->in_SSL) +		ret = iphone_mux_send(client->connection, real_query, ntohl(length) + sizeof(length), &bytes);  	else { -		gnutls_record_send(*client->ssl_session, real_query, ntohl(length)+sizeof(length)); +		gnutls_record_send(*client->ssl_session, real_query, ntohl(length) + sizeof(length));  		ret = IPHONE_E_SUCCESS;  	} -	if (debug) printf("lockdownd_send(): sent it!\n"); +	if (debug) +		printf("lockdownd_send(): sent it!\n");  	free(real_query);  	*sent_bytes = bytes;  	return ret; @@ -188,46 +205,54 @@ iphone_error_t iphone_lckd_send ( iphone_lckd_client_t client, char *raw_data, u   *   * @return 1 on success and 0 on failure.   */ -iphone_error_t lockdownd_hello(iphone_lckd_client_t control) { -	if (!control) return IPHONE_E_INVALID_ARG; +iphone_error_t lockdownd_hello(iphone_lckd_client_t control) +{ +	if (!control) +		return IPHONE_E_INVALID_ARG;  	xmlDocPtr plist = new_plist();  	xmlNode *dict, *key;  	char **dictionary;  	int bytes = 0, i = 0;  	iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR; -	 -	if (debug) printf("lockdownd_hello() called\n"); + +	if (debug) +		printf("lockdownd_hello() called\n");  	dict = add_child_to_plist(plist, "dict", "\n", NULL, 0);  	key = add_key_str_dict_element(plist, dict, "Request", "QueryType", 1);  	char *XML_content;  	uint32 length; -	 -	xmlDocDumpMemory(plist, (xmlChar **)&XML_content, &length); + +	xmlDocDumpMemory(plist, (xmlChar **) & XML_content, &length);  	ret = iphone_lckd_send(control, XML_content, length, &bytes); -	 +  	xmlFree(XML_content); -	xmlFreeDoc(plist); plist = NULL; +	xmlFreeDoc(plist); +	plist = NULL;  	ret = iphone_lckd_recv(control, &XML_content, &bytes);  	plist = xmlReadMemory(XML_content, bytes, NULL, NULL, 0); -	if (!plist) return IPHONE_E_PLIST_ERROR; +	if (!plist) +		return IPHONE_E_PLIST_ERROR;  	dict = xmlDocGetRootElement(plist);  	for (dict = dict->children; dict; dict = dict->next) { -		if (!xmlStrcmp(dict->name, "dict")) break; +		if (!xmlStrcmp(dict->name, "dict")) +			break;  	} -	if (!dict) return IPHONE_E_DICT_ERROR; +	if (!dict) +		return IPHONE_E_DICT_ERROR;  	dictionary = read_dict_element_strings(dict);  	xmlFreeDoc(plist); -	free(XML_content);	 -	 -	for (i = 0; dictionary[i]; i+=2) { -		if (!strcmp(dictionary[i], "Result") && !strcmp(dictionary[i+1], "Success")) { -			if (debug) printf("lockdownd_hello(): success\n"); +	free(XML_content); + +	for (i = 0; dictionary[i]; i += 2) { +		if (!strcmp(dictionary[i], "Result") && !strcmp(dictionary[i + 1], "Success")) { +			if (debug) +				printf("lockdownd_hello(): success\n");  			ret = IPHONE_E_SUCCESS;  			break;  		}  	} -	 +  	free_dictionary(dictionary);  	return ret;  } @@ -242,7 +267,8 @@ iphone_error_t lockdownd_hello(iphone_lckd_client_t control) {   */  iphone_error_t lockdownd_generic_get_value(iphone_lckd_client_t control, char *req_key, char **value)  { -	if (!control || !req_key || !value || (value && *value)) return IPHONE_E_INVALID_ARG; +	if (!control || !req_key || !value || (value && *value)) +		return IPHONE_E_INVALID_ARG;  	xmlDocPtr plist = new_plist();  	xmlNode *dict = NULL;  	xmlNode *key = NULL;; @@ -251,54 +277,61 @@ iphone_error_t lockdownd_generic_get_value(iphone_lckd_client_t control, char *r  	char *XML_content = NULL;  	uint32 length = 0;  	iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR; -	 +  	/* Setup DevicePublicKey request plist */  	dict = add_child_to_plist(plist, "dict", "\n", NULL, 0);  	key = add_key_str_dict_element(plist, dict, "Key", req_key, 1);  	key = add_key_str_dict_element(plist, dict, "Request", "GetValue", 1); -	xmlDocDumpMemory(plist, (xmlChar**)&XML_content, &length); +	xmlDocDumpMemory(plist, (xmlChar **) & XML_content, &length);  	/* send to iPhone */  	ret = iphone_lckd_send(control, XML_content, length, &bytes); -	 +  	xmlFree(XML_content); -	xmlFreeDoc(plist); plist = NULL; +	xmlFreeDoc(plist); +	plist = NULL; -	if (ret != IPHONE_E_SUCCESS) return ret; +	if (ret != IPHONE_E_SUCCESS) +		return ret;  	/* Now get iPhone's answer */  	ret = iphone_lckd_recv(control, &XML_content, &bytes); -	if (ret != IPHONE_E_SUCCESS) return ret; +	if (ret != IPHONE_E_SUCCESS) +		return ret;  	plist = xmlReadMemory(XML_content, bytes, NULL, NULL, 0); -	if (!plist) return IPHONE_E_PLIST_ERROR; +	if (!plist) +		return IPHONE_E_PLIST_ERROR;  	dict = xmlDocGetRootElement(plist);  	for (dict = dict->children; dict; dict = dict->next) { -		if (!xmlStrcmp(dict->name, "dict")) break; +		if (!xmlStrcmp(dict->name, "dict")) +			break;  	} -	if (!dict) return IPHONE_E_DICT_ERROR; -	 +	if (!dict) +		return IPHONE_E_DICT_ERROR; +  	/* Parse xml to check success and to find public key */  	dictionary = read_dict_element_strings(dict);  	xmlFreeDoc(plist); -	free(XML_content);	 -	 +	free(XML_content); +  	int success = 0; -	for (i = 0; dictionary[i]; i+=2) { -		if (!strcmp(dictionary[i], "Result") && !strcmp(dictionary[i+1], "Success")) { +	for (i = 0; dictionary[i]; i += 2) { +		if (!strcmp(dictionary[i], "Result") && !strcmp(dictionary[i + 1], "Success")) {  			success = 1;  		}  		if (!strcmp(dictionary[i], "Value")) { -			*value = strdup(dictionary[i+1]); +			*value = strdup(dictionary[i + 1]);  		}  	} -	 +  	if (dictionary) {  		free_dictionary(dictionary);  		dictionary = NULL;  	} -	if (success) ret = IPHONE_E_SUCCESS; +	if (success) +		ret = IPHONE_E_SUCCESS;  	return ret;  } @@ -331,15 +364,15 @@ iphone_error_t lockdownd_get_device_public_key(iphone_lckd_client_t control, cha   *   * @return 1 on success and 0 on failure   */ -iphone_error_t iphone_lckd_new_client ( iphone_device_t device, iphone_lckd_client_t *client ) +iphone_error_t iphone_lckd_new_client(iphone_device_t device, iphone_lckd_client_t * client)  { -	if (!device || !client || (client && *client) ) +	if (!device || !client || (client && *client))  		return IPHONE_E_INVALID_ARG;  	iphone_error_t ret = IPHONE_E_SUCCESS;  	char *host_id = NULL; -	iphone_lckd_client_t client_loc = new_lockdownd_client( device ); -	if (IPHONE_E_SUCCESS != lockdownd_hello(client_loc)){ +	iphone_lckd_client_t client_loc = new_lockdownd_client(device); +	if (IPHONE_E_SUCCESS != lockdownd_hello(client_loc)) {  		fprintf(stderr, "Hello failed in the lockdownd client.\n");  		ret = IPHONE_E_NOT_ENOUGH_DATA;  	} @@ -347,12 +380,12 @@ iphone_error_t iphone_lckd_new_client ( iphone_device_t device, iphone_lckd_clie  	char *uid = NULL;  	ret = lockdownd_get_device_uid(client_loc, &uid); -	if(IPHONE_E_SUCCESS != ret){ +	if (IPHONE_E_SUCCESS != ret) {  		fprintf(stderr, "Device refused to send uid.\n");  	}  	host_id = get_host_id(); -	if (IPHONE_E_SUCCESS == ret && !host_id){ +	if (IPHONE_E_SUCCESS == ret && !host_id) {  		fprintf(stderr, "No HostID found, run libiphone-initconf.\n");  		ret = IPHONE_E_INVALID_CONF;  	} @@ -366,7 +399,7 @@ iphone_error_t iphone_lckd_new_client ( iphone_device_t device, iphone_lckd_clie  	}  	ret = lockdownd_start_SSL_session(client_loc, host_id); -	if (IPHONE_E_SUCCESS != ret ) { +	if (IPHONE_E_SUCCESS != ret) {  		ret = IPHONE_E_SSL_ERROR;  		fprintf(stderr, "SSL Session opening failed.\n");  	} @@ -399,19 +432,19 @@ iphone_error_t lockdownd_pair_device(iphone_lckd_client_t control, char *uid, ch  	char *XML_content = NULL;  	uint32 length = 0; -	char* device_cert_b64 = NULL; -	char* host_cert_b64 = NULL; -	char* root_cert_b64 = NULL; +	char *device_cert_b64 = NULL; +	char *host_cert_b64 = NULL; +	char *root_cert_b64 = NULL;  	char *public_key_b64 = NULL;  	ret = lockdownd_get_device_public_key(control, &public_key_b64); -	if(ret != IPHONE_E_SUCCESS){ +	if (ret != IPHONE_E_SUCCESS) {  		fprintf(stderr, "Device refused to send public key.\n");  		return ret;  	}  	ret = lockdownd_gen_pair_cert(public_key_b64, &device_cert_b64, &host_cert_b64, &root_cert_b64); -	if(ret != IPHONE_E_SUCCESS){ +	if (ret != IPHONE_E_SUCCESS) {  		free(public_key_b64);  		return ret;  	} @@ -426,51 +459,55 @@ iphone_error_t lockdownd_pair_device(iphone_lckd_client_t control, char *uid, ch  	add_key_data_dict_element(plist, dictRecord, "RootCertificate", root_cert_b64, 2);  	add_key_str_dict_element(plist, dict, "Request", "Pair", 1); -	xmlDocDumpMemory(plist, (xmlChar**)&XML_content, &length); +	xmlDocDumpMemory(plist, (xmlChar **) & XML_content, &length); -	printf("XML Pairing request : %s\n",XML_content); +	printf("XML Pairing request : %s\n", XML_content);  	/* send to iPhone */  	ret = iphone_lckd_send(control, XML_content, length, &bytes); -	 +  	xmlFree(XML_content); -	xmlFreeDoc(plist); plist = NULL; +	xmlFreeDoc(plist); +	plist = NULL; -	if (ret != IPHONE_E_SUCCESS) return ret; +	if (ret != IPHONE_E_SUCCESS) +		return ret;  	/* Now get iPhone's answer */  	ret = iphone_lckd_recv(control, &XML_content, &bytes); -	if (ret != IPHONE_E_SUCCESS) return ret; +	if (ret != IPHONE_E_SUCCESS) +		return ret;  	if (debug) {  		printf("lockdown_pair_device: iPhone's response to our pair request:\n");  		fwrite(XML_content, 1, bytes, stdout);  		printf("\n\n");  	} -	 +  	plist = xmlReadMemory(XML_content, bytes, NULL, NULL, 0);  	if (!plist) {  		free(public_key_b64);  		return IPHONE_E_PLIST_ERROR; -		} +	}  	dict = xmlDocGetRootElement(plist);  	for (dict = dict->children; dict; dict = dict->next) { -		if (!xmlStrcmp(dict->name, "dict")) break; +		if (!xmlStrcmp(dict->name, "dict")) +			break;  	}  	if (!dict) {  		free(public_key_b64);  		return IPHONE_E_DICT_ERROR;  	} -	 +  	/* Parse xml to check success and to find public key */  	dictionary = read_dict_element_strings(dict);  	xmlFreeDoc(plist); -	free(XML_content);	 -	 +	free(XML_content); +  	int success = 0; -	for (i = 0; dictionary[i]; i+=2) { -		if (!strcmp(dictionary[i], "Result") && !strcmp(dictionary[i+1], "Success")) { +	for (i = 0; dictionary[i]; i += 2) { +		if (!strcmp(dictionary[i], "Result") && !strcmp(dictionary[i + 1], "Success")) {  			success = 1;  		}  	} @@ -482,11 +519,13 @@ iphone_error_t lockdownd_pair_device(iphone_lckd_client_t control, char *uid, ch  	/* store public key in config if pairing succeeded */  	if (success) { -		if (debug) printf("lockdownd_pair_device: pair success\n"); +		if (debug) +			printf("lockdownd_pair_device: pair success\n");  		store_device_public_key(uid, public_key_b64);  		ret = IPHONE_E_SUCCESS;  	} else { -		if (debug) printf("lockdownd_pair_device: pair failure\n"); +		if (debug) +			printf("lockdownd_pair_device: pair failure\n");  		ret = IPHONE_E_PAIRING_FAILED;  	}  	free(public_key_b64); @@ -498,24 +537,26 @@ iphone_error_t lockdownd_pair_device(iphone_lckd_client_t control, char *uid, ch   *    * @return IPHONE_E_SUCCESS on success.   */ -iphone_error_t lockdownd_gen_pair_cert(char *public_key_b64, char **device_cert_b64, char **host_cert_b64, char **root_cert_b64) +iphone_error_t lockdownd_gen_pair_cert(char *public_key_b64, char **device_cert_b64, char **host_cert_b64, +									   char **root_cert_b64)  { -	if (!public_key_b64 || !device_cert_b64 || !host_cert_b64 || !root_cert_b64) return IPHONE_E_INVALID_ARG; +	if (!public_key_b64 || !device_cert_b64 || !host_cert_b64 || !root_cert_b64) +		return IPHONE_E_INVALID_ARG;  	iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR; -	gnutls_datum_t modulus = {NULL, 0}; -	gnutls_datum_t exponent = {NULL, 0}; +	gnutls_datum_t modulus = { NULL, 0 }; +	gnutls_datum_t exponent = { NULL, 0 };  	/* first decode base64 public_key */  	gnutls_datum_t pem_pub_key;  	gsize decoded_size; -	pem_pub_key.data = g_base64_decode (public_key_b64, &decoded_size); +	pem_pub_key.data = g_base64_decode(public_key_b64, &decoded_size);  	pem_pub_key.size = decoded_size;  	/* now decode the PEM encoded key */  	gnutls_datum_t der_pub_key; -	if( GNUTLS_E_SUCCESS  == gnutls_pem_base64_decode_alloc ("RSA PUBLIC KEY", &pem_pub_key, &der_pub_key) ){ -  +	if (GNUTLS_E_SUCCESS == gnutls_pem_base64_decode_alloc("RSA PUBLIC KEY", &pem_pub_key, &der_pub_key)) { +  		/* initalize asn.1 parser */  		ASN1_TYPE pkcs1 = ASN1_TYPE_EMPTY;  		if (ASN1_SUCCESS == asn1_array2tree(pkcs1_asn1_tab, &pkcs1, NULL)) { @@ -526,14 +567,14 @@ iphone_error_t lockdownd_gen_pair_cert(char *public_key_b64, char **device_cert_  			if (ASN1_SUCCESS == asn1_der_decoding(&asn1_pub_key, der_pub_key.data, der_pub_key.size, NULL)) {  				/* get size to read */ -				int ret1 = asn1_read_value (asn1_pub_key, "modulus", NULL, &modulus.size); -				int ret2 = asn1_read_value (asn1_pub_key, "publicExponent", NULL, &exponent.size); +				int ret1 = asn1_read_value(asn1_pub_key, "modulus", NULL, &modulus.size); +				int ret2 = asn1_read_value(asn1_pub_key, "publicExponent", NULL, &exponent.size);  				modulus.data = gnutls_malloc(modulus.size);  				exponent.data = gnutls_malloc(exponent.size); -				ret1 = asn1_read_value (asn1_pub_key, "modulus", modulus.data, &modulus.size); -				ret2 = asn1_read_value (asn1_pub_key, "publicExponent", exponent.data, &exponent.size); +				ret1 = asn1_read_value(asn1_pub_key, "modulus", modulus.data, &modulus.size); +				ret2 = asn1_read_value(asn1_pub_key, "publicExponent", exponent.data, &exponent.size);  				if (ASN1_SUCCESS == ret1 && ASN1_SUCCESS == ret2)  					ret = IPHONE_E_SUCCESS;  			} @@ -548,34 +589,36 @@ iphone_error_t lockdownd_gen_pair_cert(char *public_key_b64, char **device_cert_  	if (IPHONE_E_SUCCESS == ret && 0 != modulus.size && 0 != exponent.size) {  		gnutls_global_init(); -		gnutls_datum_t essentially_null = {strdup("abababababababab"), strlen("abababababababab")}; -	 +		gnutls_datum_t essentially_null = { strdup("abababababababab"), strlen("abababababababab") }; +  		gnutls_x509_privkey_t fake_privkey, root_privkey;  		gnutls_x509_crt_t dev_cert, root_cert, host_cert; -	 +  		gnutls_x509_privkey_init(&fake_privkey);  		gnutls_x509_crt_init(&dev_cert);  		gnutls_x509_crt_init(&root_cert);  		gnutls_x509_crt_init(&host_cert); -		if ( GNUTLS_E_SUCCESS == gnutls_x509_privkey_import_rsa_raw(fake_privkey, &modulus, &exponent, &essentially_null, &essentially_null, &essentially_null, &essentially_null) ) { -		 +		if (GNUTLS_E_SUCCESS == +			gnutls_x509_privkey_import_rsa_raw(fake_privkey, &modulus, &exponent, &essentially_null, &essentially_null, +											   &essentially_null, &essentially_null)) { +  			gnutls_x509_privkey_init(&root_privkey); -			 +  			/* get root cert */ -			gnutls_datum_t pem_root_cert = {NULL, 0}; +			gnutls_datum_t pem_root_cert = { NULL, 0 };  			get_root_certificate(&pem_root_cert);  			if (GNUTLS_E_SUCCESS != gnutls_x509_crt_import(root_cert, &pem_root_cert, GNUTLS_X509_FMT_PEM))  				ret = IPHONE_E_SSL_ERROR;  			/* get host cert */ -			gnutls_datum_t pem_host_cert = {NULL, 0}; +			gnutls_datum_t pem_host_cert = { NULL, 0 };  			get_host_certificate(&pem_host_cert);  			if (GNUTLS_E_SUCCESS != gnutls_x509_crt_import(host_cert, &pem_host_cert, GNUTLS_X509_FMT_PEM))  				ret = IPHONE_E_SSL_ERROR;  			/* get root private key */ -			gnutls_datum_t pem_root_priv = {NULL, 0}; +			gnutls_datum_t pem_root_priv = { NULL, 0 };  			get_root_private_key(&pem_root_priv);  			if (GNUTLS_E_SUCCESS != gnutls_x509_privkey_import(root_privkey, &pem_root_priv, GNUTLS_X509_FMT_PEM))  				ret = IPHONE_E_SSL_ERROR; @@ -591,7 +634,7 @@ iphone_error_t lockdownd_gen_pair_cert(char *public_key_b64, char **device_cert_  			if (IPHONE_E_SUCCESS == ret) {  				/* if everything went well, export in PEM format */ -				gnutls_datum_t dev_pem = {NULL, 0}; +				gnutls_datum_t dev_pem = { NULL, 0 };  				gnutls_x509_crt_export(dev_cert, GNUTLS_X509_FMT_PEM, NULL, &dev_pem.size);  				dev_pem.data = gnutls_malloc(dev_pem.size);  				gnutls_x509_crt_export(dev_cert, GNUTLS_X509_FMT_PEM, dev_pem.data, &dev_pem.size); @@ -623,7 +666,8 @@ iphone_error_t lockdownd_gen_pair_cert(char *public_key_b64, char **device_cert_   *   * @return 1 on success and 0 on failure   */ -iphone_error_t lockdownd_start_SSL_session(iphone_lckd_client_t control, const char *HostID) { +iphone_error_t lockdownd_start_SSL_session(iphone_lckd_client_t control, const char *HostID) +{  	xmlDocPtr plist = new_plist();  	xmlNode *dict = add_child_to_plist(plist, "dict", "\n", NULL, 0);  	xmlNode *key; @@ -631,46 +675,52 @@ iphone_error_t lockdownd_start_SSL_session(iphone_lckd_client_t control, const c  	uint32 len = 0, bytes = 0, return_me = 0, i = 0;  	iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR;  	// end variables -	 +  	key = add_key_str_dict_element(plist, dict, "HostID", HostID, 1);  	if (!key) { -		if (debug) printf("Couldn't add a key.\n"); +		if (debug) +			printf("Couldn't add a key.\n");  		xmlFreeDoc(plist);  		return IPHONE_E_DICT_ERROR;  	}  	key = add_key_str_dict_element(plist, dict, "Request", "StartSession", 1);  	if (!key) { -		if (debug) printf("Couldn't add a key.\n"); +		if (debug) +			printf("Couldn't add a key.\n");  		xmlFreeDoc(plist);  		return IPHONE_E_DICT_ERROR;  	} -	 -	xmlDocDumpMemory(plist, (xmlChar **)&what2send, &len); + +	xmlDocDumpMemory(plist, (xmlChar **) & what2send, &len);  	ret = iphone_lckd_send(control, what2send, len, &bytes); -	 +  	xmlFree(what2send);  	xmlFreeDoc(plist); -	if (ret != IPHONE_E_SUCCESS) return ret; -	 +	if (ret != IPHONE_E_SUCCESS) +		return ret; +  	if (bytes > 0) {  		ret = iphone_lckd_recv(control, &what2send, &len);  		plist = xmlReadMemory(what2send, len, NULL, NULL, 0);  		dict = xmlDocGetRootElement(plist); -		if (!dict) return IPHONE_E_DICT_ERROR; +		if (!dict) +			return IPHONE_E_DICT_ERROR;  		for (dict = dict->children; dict; dict = dict->next) { -			if (!xmlStrcmp(dict->name, "dict")) break; +			if (!xmlStrcmp(dict->name, "dict")) +				break;  		}  		dictionary = read_dict_element_strings(dict);  		xmlFreeDoc(plist);  		free(what2send); -		for (i = 0; dictionary[i]; i+=2) { -			if (!strcmp(dictionary[i], "Result") && !strcmp(dictionary[i+1], "Success")) { +		for (i = 0; dictionary[i]; i += 2) { +			if (!strcmp(dictionary[i], "Result") && !strcmp(dictionary[i + 1], "Success")) {  				// Set up GnuTLS...  				//gnutls_anon_client_credentials_t anoncred;  				gnutls_certificate_credentials_t xcred; -				if (debug) printf("We started the session OK, now trying GnuTLS\n"); +				if (debug) +					printf("We started the session OK, now trying GnuTLS\n");  				errno = 0;  				gnutls_global_init();  				//gnutls_anon_allocate_client_credentials(&anoncred); @@ -678,7 +728,7 @@ iphone_error_t lockdownd_start_SSL_session(iphone_lckd_client_t control, const c  				gnutls_certificate_set_x509_trust_file(xcred, "hostcert.pem", GNUTLS_X509_FMT_PEM);  				gnutls_init(control->ssl_session, GNUTLS_CLIENT);  				{ -					int protocol_priority[16] = {GNUTLS_SSL3, 0 }; +					int protocol_priority[16] = { GNUTLS_SSL3, 0 };  					int kx_priority[16] = { GNUTLS_KX_ANON_DH, GNUTLS_KX_RSA, 0 };  					int cipher_priority[16] = { GNUTLS_CIPHER_AES_128_CBC, GNUTLS_CIPHER_AES_256_CBC, 0 };  					int mac_priority[16] = { GNUTLS_MAC_SHA1, GNUTLS_MAC_MD5, 0 }; @@ -687,30 +737,38 @@ iphone_error_t lockdownd_start_SSL_session(iphone_lckd_client_t control, const c  					gnutls_cipher_set_priority(*control->ssl_session, cipher_priority);  					gnutls_compression_set_priority(*control->ssl_session, comp_priority);  					gnutls_kx_set_priority(*control->ssl_session, kx_priority); -					gnutls_protocol_set_priority( *control->ssl_session, protocol_priority); +					gnutls_protocol_set_priority(*control->ssl_session, protocol_priority);  					gnutls_mac_set_priority(*control->ssl_session, mac_priority);  				} -				gnutls_credentials_set(*control->ssl_session, GNUTLS_CRD_CERTIFICATE, xcred); // this part is killing me. -				 -				if (debug) printf("GnuTLS step 1...\n"); +				gnutls_credentials_set(*control->ssl_session, GNUTLS_CRD_CERTIFICATE, xcred);	// this part is killing me. + +				if (debug) +					printf("GnuTLS step 1...\n");  				gnutls_transport_set_ptr(*control->ssl_session, (gnutls_transport_ptr_t) control); -				if (debug) printf("GnuTLS step 2...\n"); -				gnutls_transport_set_push_function(*control->ssl_session, (gnutls_push_func)&lockdownd_secuwrite); -				if (debug) printf("GnuTLS step 3...\n"); -				gnutls_transport_set_pull_function(*control->ssl_session, (gnutls_pull_func)&lockdownd_securead); -				if (debug) printf("GnuTLS step 4 -- now handshaking...\n"); -				 -				if (errno && debug) printf("WARN: errno says %s before handshake!\n", strerror(errno)); +				if (debug) +					printf("GnuTLS step 2...\n"); +				gnutls_transport_set_push_function(*control->ssl_session, (gnutls_push_func) & lockdownd_secuwrite); +				if (debug) +					printf("GnuTLS step 3...\n"); +				gnutls_transport_set_pull_function(*control->ssl_session, (gnutls_pull_func) & lockdownd_securead); +				if (debug) +					printf("GnuTLS step 4 -- now handshaking...\n"); + +				if (errno && debug) +					printf("WARN: errno says %s before handshake!\n", strerror(errno));  				return_me = gnutls_handshake(*control->ssl_session); -				if (debug) printf("GnuTLS handshake done...\n"); -				 +				if (debug) +					printf("GnuTLS handshake done...\n"); +  				free_dictionary(dictionary);  				if (return_me != GNUTLS_E_SUCCESS) { -					if (debug) printf("GnuTLS reported something wrong.\n"); +					if (debug) +						printf("GnuTLS reported something wrong.\n");  					gnutls_perror(return_me); -					if (debug) printf("oh.. errno says %s\n", strerror(errno)); +					if (debug) +						printf("oh.. errno says %s\n", strerror(errno));  					return IPHONE_E_SSL_ERROR;  				} else {  					control->in_SSL = 1; @@ -718,19 +776,20 @@ iphone_error_t lockdownd_start_SSL_session(iphone_lckd_client_t control, const c  				}  			}  		} -		 +  		if (debug) {  			printf("Apparently failed negotiating with lockdownd.\n");  			printf("Responding dictionary: \n"); -			for (i = 0; dictionary[i]; i+=2) { -				printf("\t%s: %s\n", dictionary[i], dictionary[i+1]); +			for (i = 0; dictionary[i]; i += 2) { +				printf("\t%s: %s\n", dictionary[i], dictionary[i + 1]);  			}  		} -	 +  		free_dictionary(dictionary);  		return IPHONE_E_SSL_ERROR; -	} else {  -		if (debug) printf("Didn't get enough bytes.\n"); +	} else { +		if (debug) +			printf("Didn't get enough bytes.\n");  		return IPHONE_E_NOT_ENOUGH_DATA;  	}  } @@ -743,14 +802,18 @@ iphone_error_t lockdownd_start_SSL_session(iphone_lckd_client_t control, const c   *   * @return The number of bytes sent   */ -ssize_t lockdownd_secuwrite(gnutls_transport_ptr_t transport, char *buffer, size_t length) { +ssize_t lockdownd_secuwrite(gnutls_transport_ptr_t transport, char *buffer, size_t length) +{  	int bytes = 0;  	iphone_lckd_client_t control; -	control = (iphone_lckd_client_t)transport; -	if (debug) printf("lockdownd_secuwrite() called\n"); -	if (debug) printf("pre-send\nlength = %zi\n", length); +	control = (iphone_lckd_client_t) transport; +	if (debug) +		printf("lockdownd_secuwrite() called\n"); +	if (debug) +		printf("pre-send\nlength = %zi\n", length);  	iphone_mux_send(control->connection, buffer, length, &bytes); -	if (debug) printf("post-send\nsent %i bytes\n", bytes); +	if (debug) +		printf("post-send\nsent %i bytes\n", bytes);  	if (debug) {  		FILE *my_ssl_packet = fopen("sslpacketwrite.out", "w+");  		fwrite(buffer, 1, length, my_ssl_packet); @@ -758,7 +821,7 @@ ssize_t lockdownd_secuwrite(gnutls_transport_ptr_t transport, char *buffer, size  		printf("Wrote SSL packet to drive, too.\n");  		fclose(my_ssl_packet);  	} -	 +  	return bytes;  } @@ -770,68 +833,86 @@ ssize_t lockdownd_secuwrite(gnutls_transport_ptr_t transport, char *buffer, size   *   * @return The number of bytes read   */ -ssize_t lockdownd_securead(gnutls_transport_ptr_t transport, char *buffer, size_t length) { +ssize_t lockdownd_securead(gnutls_transport_ptr_t transport, char *buffer, size_t length) +{  	int bytes = 0, pos_start_fill = 0; -	char *hackhackhack = NULL;  +	char *hackhackhack = NULL;  	iphone_lckd_client_t control; -	control = (iphone_lckd_client_t)transport; -	if (debug) printf("lockdownd_securead() called\nlength = %zi\n", length); +	control = (iphone_lckd_client_t) transport; +	if (debug) +		printf("lockdownd_securead() called\nlength = %zi\n", length);  	// Buffering hack! Throw what we've got in our "buffer" into the stream first, then get more.  	if (control->gtls_buffer_hack_len > 0) { -		if (length > control->gtls_buffer_hack_len) { // If it's asking for more than we got -			length -= control->gtls_buffer_hack_len; // Subtract what we have from their requested length -			pos_start_fill = control->gtls_buffer_hack_len; // set the pos to start filling at -			memcpy(buffer, control->gtls_buffer_hack, control->gtls_buffer_hack_len); // Fill their buffer partially -			free(control->gtls_buffer_hack); // free our memory, it's not chained anymore -			control->gtls_buffer_hack_len = 0; // we don't have a hack buffer anymore -			if (debug) printf("Did a partial fill to help quench thirst for data\n"); -		} else if (length < control->gtls_buffer_hack_len) { // If it's asking for less... -			control->gtls_buffer_hack_len -= length; // subtract what they're asking for -			memcpy(buffer, control->gtls_buffer_hack, length); // fill their buffer -			hackhackhack = (char*)malloc(sizeof(char) * control->gtls_buffer_hack_len); // strndup is NOT a good solution -- concatenates \0!!!! Anyway, make a new "hack" buffer. -			memcpy(hackhackhack, control->gtls_buffer_hack+length, control->gtls_buffer_hack_len); // Move what's left into the new one -			free(control->gtls_buffer_hack); // Free the old one -			control->gtls_buffer_hack = hackhackhack; // And make it the new one. -			hackhackhack = NULL;  -			if (debug) printf("Quenched the thirst for data; new hack length is %i\n", control->gtls_buffer_hack_len); -			return length; // hand it over. -		} else { // length == hack length -			memcpy(buffer, control->gtls_buffer_hack, length); // copy our buffer into theirs -			free(control->gtls_buffer_hack); // free our "obligation" -			control->gtls_buffer_hack_len = 0; // free our "obligation" -			if (debug) printf("Satiated the thirst for data; now we have to eventually receive again.\n"); -			return length; // hand it over +		if (length > control->gtls_buffer_hack_len) {	// If it's asking for more than we got +			length -= control->gtls_buffer_hack_len;	// Subtract what we have from their requested length +			pos_start_fill = control->gtls_buffer_hack_len;	// set the pos to start filling at +			memcpy(buffer, control->gtls_buffer_hack, control->gtls_buffer_hack_len);	// Fill their buffer partially +			free(control->gtls_buffer_hack);	// free our memory, it's not chained anymore +			control->gtls_buffer_hack_len = 0;	// we don't have a hack buffer anymore +			if (debug) +				printf("Did a partial fill to help quench thirst for data\n"); +		} else if (length < control->gtls_buffer_hack_len) {	// If it's asking for less... +			control->gtls_buffer_hack_len -= length;	// subtract what they're asking for +			memcpy(buffer, control->gtls_buffer_hack, length);	// fill their buffer +			hackhackhack = (char *) malloc(sizeof(char) * control->gtls_buffer_hack_len);	// strndup is NOT a good solution -- concatenates \0!!!! Anyway, make a new "hack" buffer. +			memcpy(hackhackhack, control->gtls_buffer_hack + length, control->gtls_buffer_hack_len);	// Move what's left into the new one +			free(control->gtls_buffer_hack);	// Free the old one +			control->gtls_buffer_hack = hackhackhack;	// And make it the new one. +			hackhackhack = NULL; +			if (debug) +				printf("Quenched the thirst for data; new hack length is %i\n", control->gtls_buffer_hack_len); +			return length;		// hand it over. +		} else {				// length == hack length +			memcpy(buffer, control->gtls_buffer_hack, length);	// copy our buffer into theirs +			free(control->gtls_buffer_hack);	// free our "obligation" +			control->gtls_buffer_hack_len = 0;	// free our "obligation" +			if (debug) +				printf("Satiated the thirst for data; now we have to eventually receive again.\n"); +			return length;		// hand it over  		}  	}  	// End buffering hack! -	char *recv_buffer = (char*)malloc(sizeof(char) * (length * 1000)); // ensuring nothing stupid happens -	 -	if (debug) printf("pre-read\nclient wants %zi bytes\n", length); +	char *recv_buffer = (char *) malloc(sizeof(char) * (length * 1000));	// ensuring nothing stupid happens + +	if (debug) +		printf("pre-read\nclient wants %zi bytes\n", length);  	iphone_mux_recv(control->connection, recv_buffer, (length * 1000), &bytes); -	if (debug) printf("post-read\nwe got %i bytes\n", bytes); +	if (debug) +		printf("post-read\nwe got %i bytes\n", bytes);  	if (debug && bytes < 0) {  		printf("lockdownd_securead(): uh oh\n"); -		printf("I believe what we have here is a failure to communicate... libusb says %s but strerror says %s\n", usb_strerror(), strerror(errno)); -		return bytes + 28; // an errno +		printf("I believe what we have here is a failure to communicate... libusb says %s but strerror says %s\n", +			   usb_strerror(), strerror(errno)); +		return bytes + 28;		// an errno  	}  	if (bytes >= length) {  		if (bytes > length) { -			if (debug) printf("lockdownd_securead: Client deliberately read less data than was there; resorting to GnuTLS buffering hack.\n"); -			if (!control->gtls_buffer_hack_len) { // if there's no hack buffer yet +			if (debug) +				printf +					("lockdownd_securead: Client deliberately read less data than was there; resorting to GnuTLS buffering hack.\n"); +			if (!control->gtls_buffer_hack_len) {	// if there's no hack buffer yet  				//control->gtls_buffer_hack = strndup(recv_buffer+length, bytes-length); // strndup is NOT a good solution! -				control->gtls_buffer_hack_len += bytes-length; -				control->gtls_buffer_hack = (char*)malloc(sizeof(char) * control->gtls_buffer_hack_len); -				memcpy(control->gtls_buffer_hack, recv_buffer+length, control->gtls_buffer_hack_len); -			} else { // if there is.  -				control->gtls_buffer_hack = realloc(control->gtls_buffer_hack, control->gtls_buffer_hack_len + (bytes - length)); -				memcpy(control->gtls_buffer_hack+control->gtls_buffer_hack_len, recv_buffer+length, bytes-length); +				control->gtls_buffer_hack_len += bytes - length; +				control->gtls_buffer_hack = (char *) malloc(sizeof(char) * control->gtls_buffer_hack_len); +				memcpy(control->gtls_buffer_hack, recv_buffer + length, control->gtls_buffer_hack_len); +			} else {			// if there is.  +				control->gtls_buffer_hack = +					realloc(control->gtls_buffer_hack, control->gtls_buffer_hack_len + (bytes - length)); +				memcpy(control->gtls_buffer_hack + control->gtls_buffer_hack_len, recv_buffer + length, bytes - length);  				control->gtls_buffer_hack_len += bytes - length;  			}  		} -		memcpy(buffer+pos_start_fill, recv_buffer, length); +		memcpy(buffer + pos_start_fill, recv_buffer, length);  		free(recv_buffer); -		if (bytes == length) { if (debug) printf("Returning how much we received.\n");  return bytes; } -		else { if (debug) printf("Returning what they want to hear.\nHack length: %i\n", control->gtls_buffer_hack_len); return length; } +		if (bytes == length) { +			if (debug) +				printf("Returning how much we received.\n"); +			return bytes; +		} else { +			if (debug) +				printf("Returning what they want to hear.\nHack length: %i\n", control->gtls_buffer_hack_len); +			return length; +		}  	}  	return bytes;  } @@ -843,12 +924,16 @@ ssize_t lockdownd_securead(gnutls_transport_ptr_t transport, char *buffer, size_   *   * @return The port number the service was started on or 0 on failure.   */ -iphone_error_t iphone_lckd_start_service ( iphone_lckd_client_t client, const char *service, int *port ) { -	if (!client || !service || !port) return IPHONE_E_INVALID_ARG; +iphone_error_t iphone_lckd_start_service(iphone_lckd_client_t client, const char *service, int *port) +{ +	if (!client || !service || !port) +		return IPHONE_E_INVALID_ARG; -	char* host_id = get_host_id(); -	if (!host_id) return IPHONE_E_INVALID_CONF; -	if (!client->in_SSL && !lockdownd_start_SSL_session(client, host_id)) return IPHONE_E_SSL_ERROR; +	char *host_id = get_host_id(); +	if (!host_id) +		return IPHONE_E_INVALID_CONF; +	if (!client->in_SSL && !lockdownd_start_SSL_session(client, host_id)) +		return IPHONE_E_SSL_ERROR;  	char *XML_query, **dictionary;  	uint32 length, i = 0, port_loc = 0, bytes = 0; @@ -862,63 +947,78 @@ iphone_error_t iphone_lckd_start_service ( iphone_lckd_client_t client, const ch  	xmlNode *dict = add_child_to_plist(plist, "dict", "\n", NULL, 0);  	xmlNode *key;  	key = add_key_str_dict_element(plist, dict, "Request", "StartService", 1); -	if (!key) { xmlFreeDoc(plist); return IPHONE_E_UNKNOWN_ERROR; } +	if (!key) { +		xmlFreeDoc(plist); +		return IPHONE_E_UNKNOWN_ERROR; +	}  	key = add_key_str_dict_element(plist, dict, "Service", service, 1); -	if (!key) { xmlFreeDoc(plist); return IPHONE_E_UNKNOWN_ERROR; } -	 -	xmlDocDumpMemory(plist, (xmlChar **)&XML_query, &length); -	 +	if (!key) { +		xmlFreeDoc(plist); +		return IPHONE_E_UNKNOWN_ERROR; +	} + +	xmlDocDumpMemory(plist, (xmlChar **) & XML_query, &length); +  	ret = iphone_lckd_send(client, XML_query, length, &bytes);  	free(XML_query); -	if (IPHONE_E_SUCCESS != ret) return ret; -	 +	if (IPHONE_E_SUCCESS != ret) +		return ret; +  	ret = iphone_lckd_recv(client, &XML_query, &bytes);  	xmlFreeDoc(plist); -	if (IPHONE_E_SUCCESS != ret) return ret; -	 -	if (bytes <= 0) return IPHONE_E_NOT_ENOUGH_DATA; +	if (IPHONE_E_SUCCESS != ret) +		return ret; + +	if (bytes <= 0) +		return IPHONE_E_NOT_ENOUGH_DATA;  	else {  		plist = xmlReadMemory(XML_query, bytes, NULL, NULL, 0); -		if (!plist) return IPHONE_E_UNKNOWN_ERROR; +		if (!plist) +			return IPHONE_E_UNKNOWN_ERROR;  		dict = xmlDocGetRootElement(plist); -		if (!dict) return IPHONE_E_UNKNOWN_ERROR; +		if (!dict) +			return IPHONE_E_UNKNOWN_ERROR;  		for (dict = dict->children; dict; dict = dict->next) { -			if (!xmlStrcmp(dict->name, "dict")) break; +			if (!xmlStrcmp(dict->name, "dict")) +				break;  		} -		 -		if (!dict) return IPHONE_E_UNKNOWN_ERROR; + +		if (!dict) +			return IPHONE_E_UNKNOWN_ERROR;  		dictionary = read_dict_element_strings(dict); -		 -		for (i = 0; dictionary[i]; i+=2) { -			if (debug) printf("lockdownd_start_service() dictionary %s: %s\n", dictionary[i], dictionary[i+1]); -			 + +		for (i = 0; dictionary[i]; i += 2) { +			if (debug) +				printf("lockdownd_start_service() dictionary %s: %s\n", dictionary[i], dictionary[i + 1]); +  			if (!xmlStrcmp(dictionary[i], "Port")) { -				port_loc = atoi(dictionary[i+1]); -				if (debug) printf("lockdownd_start_service() atoi'd port: %i\n", port); +				port_loc = atoi(dictionary[i + 1]); +				if (debug) +					printf("lockdownd_start_service() atoi'd port: %i\n", port);  			} -			 +  			if (!xmlStrcmp(dictionary[i], "Result")) { -				if (!xmlStrcmp(dictionary[i+1], "Success")) { +				if (!xmlStrcmp(dictionary[i + 1], "Success")) {  					result = 1;  				}  			}  		} -		 +  		if (debug) {  			printf("lockdownd_start_service(): DATA RECEIVED:\n\n");  			fwrite(XML_query, 1, bytes, stdout);  			printf("end data received by lockdownd_start_service()\n");  		} -		 +  		free(XML_query);  		xmlFreeDoc(plist);  		free_dictionary(dictionary);  		if (port && result) {  			*port = port_loc;  			return IPHONE_E_SUCCESS; -		} -		else return IPHONE_E_UNKNOWN_ERROR; +		} else +			return IPHONE_E_UNKNOWN_ERROR;  	} -	 +  	return IPHONE_E_UNKNOWN_ERROR;  } diff --git a/src/lockdown.h b/src/lockdown.h index 62c453f..41402c4 100644 --- a/src/lockdown.h +++ b/src/lockdown.h @@ -47,7 +47,8 @@ iphone_error_t lockdownd_hello(iphone_lckd_client_t control);  iphone_error_t lockdownd_get_device_uid(iphone_lckd_client_t control, char **uid);  iphone_error_t lockdownd_get_device_public_key(iphone_lckd_client_t control, char **public_key); -iphone_error_t lockdownd_gen_pair_cert(char *public_key_b64, char **device_cert_b64, char **host_cert_b64, char **root_cert_b64); +iphone_error_t lockdownd_gen_pair_cert(char *public_key_b64, char **device_cert_b64, char **host_cert_b64, +									   char **root_cert_b64);  iphone_error_t lockdownd_pair_device(iphone_lckd_client_t control, char *public_key, char *host_id);  void lockdownd_close(iphone_lckd_client_t control); @@ -34,23 +34,24 @@  int debug = 1; -int main(int argc, char *argv[]) { +int main(int argc, char *argv[]) +{  	int bytes = 0, port = 0, i = 0;  	iphone_lckd_client_t control = NULL;  	iphone_device_t phone = NULL; -	 -	if (argc > 1 && !strcasecmp(argv[1], "--debug")){ + +	if (argc > 1 && !strcasecmp(argv[1], "--debug")) {  		debug = 1;  	} else {  		debug = 0;  	} -	 +  	if (IPHONE_E_SUCCESS != iphone_get_device(&phone)) {  		printf("No iPhone found, is it plugged in?\n");  		return -1; -       	} +	} -	if (IPHONE_E_SUCCESS != iphone_lckd_new_client(phone, &control)){ +	if (IPHONE_E_SUCCESS != iphone_lckd_new_client(phone, &control)) {  		iphone_free_device(phone);  		return -1;  	} @@ -62,34 +63,36 @@ int main(int argc, char *argv[]) {  	}  	iphone_lckd_start_service(control, "com.apple.afc", &port); -	 +  	if (port) {  		iphone_afc_client_t afc = NULL;  		iphone_afc_new_client(phone, 3432, port, &afc);  		if (afc) {  			char **dirs = NULL;  			iphone_afc_get_dir_list(afc, "/eafaedf", &dirs); -			if (!dirs) iphone_afc_get_dir_list(afc, "/", &dirs); +			if (!dirs) +				iphone_afc_get_dir_list(afc, "/", &dirs);  			printf("Directory time.\n");  			for (i = 0; dirs[i]; i++) {  				printf("/%s\n", dirs[i]);  			} -			 +  			g_strfreev(dirs);  			iphone_afc_get_devinfo(afc, &dirs);  			if (dirs) { -				for (i = 0; dirs[i]; i+=2) { -					printf("%s: %s\n", dirs[i], dirs[i+1]); +				for (i = 0; dirs[i]; i += 2) { +					printf("%s: %s\n", dirs[i], dirs[i + 1]);  				}  			}  			g_strfreev(dirs); -			 +  			iphone_afc_file_t my_file = NULL;  			struct stat stbuf; -			iphone_afc_get_file_attr ( afc, "/iTunesOnTheGoPlaylist.plist", &stbuf ); -			if (IPHONE_E_SUCCESS == iphone_afc_open_file(afc, "/iTunesOnTheGoPlaylist.plist", IPHONE_AFC_FILE_READ, &my_file) && my_file) { +			iphone_afc_get_file_attr(afc, "/iTunesOnTheGoPlaylist.plist", &stbuf); +			if (IPHONE_E_SUCCESS == +				iphone_afc_open_file(afc, "/iTunesOnTheGoPlaylist.plist", IPHONE_AFC_FILE_READ, &my_file) && my_file) {  				printf("A file size: %i\n", stbuf.st_size); -				char *file_data = (char*)malloc(sizeof(char) * stbuf.st_size); +				char *file_data = (char *) malloc(sizeof(char) * stbuf.st_size);  				iphone_afc_read_file(afc, my_file, file_data, stbuf.st_size, &bytes);  				if (bytes >= 0) {  					printf("The file's data:\n"); @@ -98,49 +101,58 @@ int main(int argc, char *argv[]) {  				printf("\nClosing my file.\n");  				iphone_afc_close_file(afc, my_file);  				free(file_data); -			} else printf("couldn't open a file\n"); -			 +			} else +				printf("couldn't open a file\n"); +  			iphone_afc_open_file(afc, "/readme.libiphone.fx", IPHONE_AFC_FILE_WRITE, &my_file);  			if (my_file) {  				char *outdatafile = strdup("this is a bitchin text file\n");  				iphone_afc_write_file(afc, my_file, outdatafile, strlen(outdatafile), &bytes);  				free(outdatafile); -				if (bytes > 0) printf("Wrote a surprise. ;)\n"); -				else printf("I wanted to write a surprise, but... :(\n"); +				if (bytes > 0) +					printf("Wrote a surprise. ;)\n"); +				else +					printf("I wanted to write a surprise, but... :(\n");  				iphone_afc_close_file(afc, my_file);  			}  			printf("Deleting a file...\n");  			bytes = iphone_afc_delete_file(afc, "/delme"); -			if (bytes) printf("Success.\n"); -			else printf("Failure. (expected unless you have a /delme file on your phone)\n"); -			 +			if (bytes) +				printf("Success.\n"); +			else +				printf("Failure. (expected unless you have a /delme file on your phone)\n"); +  			printf("Renaming a file...\n");  			bytes = iphone_afc_rename_file(afc, "/renme", "/renme2"); -			if (bytes > 0) printf("Success.\n"); -			else printf("Failure. (expected unless you have a /renme file on your phone)\n"); -			 +			if (bytes > 0) +				printf("Success.\n"); +			else +				printf("Failure. (expected unless you have a /renme file on your phone)\n"); +  			printf("Seek & read\n");  			iphone_afc_open_file(afc, "/readme.libiphone.fx", IPHONE_AFC_FILE_READ, &my_file); -			if (IPHONE_E_SUCCESS != iphone_afc_seek_file(afc, my_file, 5)) printf("WARN: SEEK DID NOT WORK\n"); -			char *threeletterword = (char*)malloc(sizeof(char) * 5); +			if (IPHONE_E_SUCCESS != iphone_afc_seek_file(afc, my_file, 5)) +				printf("WARN: SEEK DID NOT WORK\n"); +			char *threeletterword = (char *) malloc(sizeof(char) * 5);  			iphone_afc_read_file(afc, my_file, threeletterword, 3, &bytes);  			threeletterword[3] = '\0'; -			if (bytes > 0) printf("Result: %s\n", threeletterword); -			else printf("Couldn't read!\n"); +			if (bytes > 0) +				printf("Result: %s\n", threeletterword); +			else +				printf("Couldn't read!\n");  			free(threeletterword);  			iphone_afc_close_file(afc, my_file); -			 +  		}  		iphone_afc_free_client(afc);  	} else {  		printf("Start service failure.\n");  	} -	 +  	printf("All done.\n");  	iphone_lckd_free_client(control);  	iphone_free_device(phone); -	 +  	return 0;  } - diff --git a/src/plist.c b/src/plist.c index 31490d0..c4d6bfa 100644 --- a/src/plist.c +++ b/src/plist.c @@ -40,12 +40,12 @@ const char *plist_base = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\   *   * @return The formatted string.   */ -char* format_string(const char* buf, int cols, int depth) +char *format_string(const char *buf, int cols, int depth)  {  	int colw = depth + cols + 1;  	int len = strlen(buf);  	int nlines = len / cols + 1; - 	char* new_buf = (char*)malloc(nlines * colw + depth + 1); +	char *new_buf = (char *) malloc(nlines * colw + depth + 1);  	int i = 0;  	int j = 0; @@ -53,18 +53,18 @@ char* format_string(const char* buf, int cols, int depth)  	assert(depth >= 0);  	// Inserts new lines and tabs at appropriate locations -	for (i = 0; i < nlines; i++){ +	for (i = 0; i < nlines; i++) {  		new_buf[i * colw] = '\n';  		for (j = 0; j < depth; j++)  			new_buf[i * colw + 1 + j] = '\t';  		memcpy(new_buf + i * colw + 1 + depth, buf + i * cols, cols);  	} -	new_buf[len+(1+depth)*nlines] = '\n'; +	new_buf[len + (1 + depth) * nlines] = '\n';  	// Inserts final row of indentation and termination character  	for (j = 0; j < depth; j++) -		new_buf[len+(1+depth)*nlines + 1 + j] = '\t'; -	new_buf[len+(1+depth)*nlines+depth+1] = '\0'; +		new_buf[len + (1 + depth) * nlines + 1 + j] = '\t'; +	new_buf[len + (1 + depth) * nlines + depth + 1] = '\0';  	return new_buf;  } @@ -73,12 +73,14 @@ char* format_string(const char* buf, int cols, int depth)   *    * @return The plist XML document.   */ -xmlDocPtr new_plist() { +xmlDocPtr new_plist() +{  	char *plist = strdup(plist_base);  	xmlDocPtr plist_xml = xmlReadMemory(plist, strlen(plist), NULL, NULL, 0); -	if (!plist_xml) return NULL; -	 +	if (!plist_xml) +		return NULL; +  	free(plist);  	return plist_xml; @@ -88,8 +90,10 @@ xmlDocPtr new_plist() {   *   * @param plist The XML document to destroy.   */ -void free_plist(xmlDocPtr plist) { -	if (!plist) return; +void free_plist(xmlDocPtr plist) +{ +	if (!plist) +		return;  	xmlFreeDoc(plist);  } @@ -109,14 +113,17 @@ void free_plist(xmlDocPtr plist) {   *   * @return The newly created node.   */ -xmlNode *add_child_to_plist(xmlDocPtr plist, const char *name, const char *content, xmlNode *to_node, int depth) { +xmlNode *add_child_to_plist(xmlDocPtr plist, const char *name, const char *content, xmlNode * to_node, int depth) +{  	int i = 0;  	xmlNode *child; -	if (!plist) return NULL; +	if (!plist) +		return NULL;  	assert(depth >= 0); -	if (!to_node) to_node = xmlDocGetRootElement(plist); -	 +	if (!to_node) +		to_node = xmlDocGetRootElement(plist); +  	for (i = 0; i < depth; i++) {  		xmlNodeAddContent(to_node, "\t");  	} @@ -136,12 +143,13 @@ xmlNode *add_child_to_plist(xmlDocPtr plist, const char *name, const char *conte   *   * @return The newly created key node.   */ -xmlNode *add_key_str_dict_element(xmlDocPtr plist, xmlNode *dict, const char *key, const char *value, int depth) { +xmlNode *add_key_str_dict_element(xmlDocPtr plist, xmlNode * dict, const char *key, const char *value, int depth) +{  	xmlNode *keyPtr;  	keyPtr = add_child_to_plist(plist, "key", key, dict, depth);  	add_child_to_plist(plist, "string", value, dict, depth); -	 +  	return keyPtr;  } @@ -155,9 +163,10 @@ xmlNode *add_key_str_dict_element(xmlDocPtr plist, xmlNode *dict, const char *ke   *   * @return The newly created dict node.   */ -xmlNode *add_key_dict_node(xmlDocPtr plist, xmlNode *dict, const char *key, const char *value, int depth) { +xmlNode *add_key_dict_node(xmlDocPtr plist, xmlNode * dict, const char *key, const char *value, int depth) +{  	xmlNode *child; -	 +  	add_child_to_plist(plist, "key", key, dict, depth);  	child = add_child_to_plist(plist, "dict", value, dict, depth); @@ -174,12 +183,13 @@ xmlNode *add_key_dict_node(xmlDocPtr plist, xmlNode *dict, const char *key, cons   *   * @return The newly created key node.   */ -xmlNode *add_key_data_dict_element(xmlDocPtr plist, xmlNode *dict, const char *key, const char *value, int depth) { +xmlNode *add_key_data_dict_element(xmlDocPtr plist, xmlNode * dict, const char *key, const char *value, int depth) +{  	xmlNode *keyPtr;  	keyPtr = add_child_to_plist(plist, "key", key, dict, depth);  	add_child_to_plist(plist, "data", format_string(value, 60, depth), dict, depth); -	 +  	return keyPtr;  } @@ -190,17 +200,18 @@ xmlNode *add_key_data_dict_element(xmlDocPtr plist, xmlNode *dict, const char *k   * @return  An array where each even number is a key and the odd numbers are   *          values.  If the odd number is \0, that's the end of the list.   */ -char **read_dict_element_strings(xmlNode *dict) { +char **read_dict_element_strings(xmlNode * dict) +{  	char **return_me = NULL, **old = NULL;  	int current_length = 0;  	int current_pos = 0;  	xmlNode *dict_walker; -	 +  	for (dict_walker = dict->children; dict_walker; dict_walker = dict_walker->next) {  		if (!xmlStrcmp(dict_walker->name, "key")) {  			current_length += 2;  			old = return_me; -			return_me = realloc(return_me, sizeof(char*) * current_length); +			return_me = realloc(return_me, sizeof(char *) * current_length);  			if (!return_me) {  				free(old);  				return NULL; @@ -209,25 +220,26 @@ char **read_dict_element_strings(xmlNode *dict) {  			return_me[current_pos++] = xmlNodeGetContent(dict_walker->next->next);  		}  	} -	 +  	old = return_me; -	return_me = realloc(return_me, sizeof(char*) * (current_length+1)); +	return_me = realloc(return_me, sizeof(char *) * (current_length + 1));  	return_me[current_pos] = NULL; -	 +  	return return_me;  }  /** Destroys a dictionary as returned by read_dict_element_strings   */ -void free_dictionary(char **dictionary) { +void free_dictionary(char **dictionary) +{  	int i = 0; -	 -	if (!dictionary) return; -	 + +	if (!dictionary) +		return; +  	for (i = 0; dictionary[i]; i++) {  		free(dictionary[i]);  	}  	free(dictionary);  } - diff --git a/src/plist.h b/src/plist.h index ab79386..b27a0c5 100644 --- a/src/plist.h +++ b/src/plist.h @@ -25,14 +25,14 @@  #include <libxml/parser.h>  #include <libxml/tree.h> -xmlNode *add_key_dict_node(xmlDocPtr plist, xmlNode *dict, const char *key, const char *value, int depth); -xmlNode *add_key_str_dict_element(xmlDocPtr plist, xmlNode *dict, const char *key, const char *value, int depth); -xmlNode *add_key_data_dict_element(xmlDocPtr plist, xmlNode *dict, const char *key, const char *value, int depth); -xmlNode *add_child_to_plist(xmlDocPtr plist, const char *name, const char *content, xmlNode *to_node, int depth); +xmlNode *add_key_dict_node(xmlDocPtr plist, xmlNode * dict, const char *key, const char *value, int depth); +xmlNode *add_key_str_dict_element(xmlDocPtr plist, xmlNode * dict, const char *key, const char *value, int depth); +xmlNode *add_key_data_dict_element(xmlDocPtr plist, xmlNode * dict, const char *key, const char *value, int depth); +xmlNode *add_child_to_plist(xmlDocPtr plist, const char *name, const char *content, xmlNode * to_node, int depth);  void free_plist(xmlDocPtr plist);  xmlDocPtr new_plist(); -char **read_dict_element_strings(xmlNode *dict); +char **read_dict_element_strings(xmlNode * dict);  void free_dictionary(char **dictionary);  #endif diff --git a/src/usbmux.c b/src/usbmux.c index 35f2ef3..cf1a2d9 100644 --- a/src/usbmux.c +++ b/src/usbmux.c @@ -39,8 +39,9 @@ static int clients = 0;   *   * @return A USBMux packet   */ -usbmux_tcp_header *new_mux_packet(uint16 s_port, uint16 d_port) { -	usbmux_tcp_header *conn = (usbmux_tcp_header*)malloc(sizeof(usbmux_tcp_header)); +usbmux_tcp_header *new_mux_packet(uint16 s_port, uint16 d_port) +{ +	usbmux_tcp_header *conn = (usbmux_tcp_header *) malloc(sizeof(usbmux_tcp_header));  	conn->type = htonl(6);  	conn->length = 28;  	conn->sport = htons(s_port); @@ -58,8 +59,9 @@ usbmux_tcp_header *new_mux_packet(uint16 s_port, uint16 d_port) {   *    * @return A USBMux header   */ -usbmux_version_header *version_header() { -	usbmux_version_header *version = (usbmux_version_header*)malloc(sizeof(usbmux_version_header)); +usbmux_version_header *version_header() +{ +	usbmux_version_header *version = (usbmux_version_header *) malloc(sizeof(usbmux_version_header));  	version->type = 0;  	version->length = htonl(20);  	version->major = htonl(1); @@ -76,11 +78,13 @@ usbmux_version_header *version_header() {   *    * @param connection The connection to delete from the tracking list.   */ -void delete_connection(iphone_umux_client_t connection) { -	iphone_umux_client_t *newlist = (iphone_umux_client_t*)malloc(sizeof(iphone_umux_client_t) * (clients - 1)); +void delete_connection(iphone_umux_client_t connection) +{ +	iphone_umux_client_t *newlist = (iphone_umux_client_t *) malloc(sizeof(iphone_umux_client_t) * (clients - 1));  	int i = 0, j = 0;  	for (i = 0; i < clients; i++) { -		if (connlist[i] == connection) continue; +		if (connlist[i] == connection) +			continue;  		else {  			newlist[j] = connlist[i];  			j++; @@ -89,8 +93,10 @@ void delete_connection(iphone_umux_client_t connection) {  	free(connlist);  	connlist = newlist;  	clients--; -	if (connection->recv_buffer) free(connection->recv_buffer); -	if (connection->header) free(connection->header); +	if (connection->recv_buffer) +		free(connection->recv_buffer); +	if (connection->header) +		free(connection->header);  	connection->r_len = 0;  	free(connection);  } @@ -101,8 +107,10 @@ void delete_connection(iphone_umux_client_t connection) {   * @param connection The connection to add to the global list of connections.   */ -void add_connection(iphone_umux_client_t connection) { -	iphone_umux_client_t* newlist = (iphone_umux_client_t*)realloc(connlist, sizeof(iphone_umux_client_t) * (clients+1)); +void add_connection(iphone_umux_client_t connection) +{ +	iphone_umux_client_t *newlist = +		(iphone_umux_client_t *) realloc(connlist, sizeof(iphone_umux_client_t) * (clients + 1));  	newlist[clients] = connection;  	connlist = newlist;  	clients++; @@ -116,13 +124,15 @@ void add_connection(iphone_umux_client_t connection) {   * @param client A mux TCP header for the connection which is used for tracking and data transfer.   * @return IPHONE_E_SUCCESS on success, an error code otherwise.   */ -iphone_error_t iphone_mux_new_client ( iphone_device_t device, uint16_t src_port, uint16_t dst_port, iphone_umux_client_t *client ){ +iphone_error_t iphone_mux_new_client(iphone_device_t device, uint16_t src_port, uint16_t dst_port, +									 iphone_umux_client_t * client) +{  	if (!device || !src_port || !dst_port)  		return IPHONE_E_INVALID_ARG;  	int bytes = 0;  	// Initialize connection stuff -	iphone_umux_client_t new_connection = (iphone_umux_client_t)malloc(sizeof(struct iphone_umux_client_int)); +	iphone_umux_client_t new_connection = (iphone_umux_client_t) malloc(sizeof(struct iphone_umux_client_int));  	new_connection->header = new_mux_packet(src_port, dst_port);  	// blargg @@ -130,18 +140,19 @@ iphone_error_t iphone_mux_new_client ( iphone_device_t device, uint16_t src_port  		new_connection->header->tcp_flags = 0x02;  		new_connection->header->length = htonl(new_connection->header->length);  		new_connection->header->length16 = htons(new_connection->header->length16); -		 -		if (send_to_phone(device, (char*)new_connection->header, sizeof(usbmux_tcp_header)) >= 0) { + +		if (send_to_phone(device, (char *) new_connection->header, sizeof(usbmux_tcp_header)) >= 0) {  			usbmux_tcp_header *response; -			response = (usbmux_tcp_header*)malloc(sizeof(usbmux_tcp_header)); -			bytes = recv_from_phone(device, (char*)response, sizeof(*response)); +			response = (usbmux_tcp_header *) malloc(sizeof(usbmux_tcp_header)); +			bytes = recv_from_phone(device, (char *) response, sizeof(*response));  			if (response->tcp_flags != 0x12) {  				free(response);  				return IPHONE_E_UNKNOWN_ERROR;  			} else {  				free(response); -				if (debug) printf("mux_connect: connection success\n"); +				if (debug) +					printf("mux_connect: connection success\n");  				new_connection->header->tcp_flags = 0x10;  				new_connection->header->scnt = 1;  				new_connection->header->ocnt = 1; @@ -156,7 +167,6 @@ iphone_error_t iphone_mux_new_client ( iphone_device_t device, uint16_t src_port  			return IPHONE_E_NOT_ENOUGH_DATA;  		}  	} -	  	// if we get to this point it's probably bad  	return IPHONE_E_UNKNOWN_ERROR;  } @@ -168,22 +178,24 @@ iphone_error_t iphone_mux_new_client ( iphone_device_t device, uint16_t src_port   *   * @return IPHONE_E_SUCCESS on success.   */ -iphone_error_t iphone_mux_free_client ( iphone_umux_client_t client ) { -	if (!client || !client->phone) return; -	 +iphone_error_t iphone_mux_free_client(iphone_umux_client_t client) +{ +	if (!client || !client->phone) +		return; +  	client->header->tcp_flags = 0x04;  	client->header->scnt = htonl(client->header->scnt);  	client->header->ocnt = htonl(client->header->ocnt);  	int bytes = 0; -	 -	bytes = usb_bulk_write(client->phone->device, BULKOUT, (char*)client->header, sizeof(usbmux_tcp_header), 800); -	if(debug && bytes < 0) + +	bytes = usb_bulk_write(client->phone->device, BULKOUT, (char *) client->header, sizeof(usbmux_tcp_header), 800); +	if (debug && bytes < 0)  		printf("iphone_muxèfree_client(): when writing, libusb gave me the error: %s\n", usb_strerror()); -	bytes = usb_bulk_read(client->phone->device, BULKIN, (char*)client->header, sizeof(usbmux_tcp_header), 800); -	if(debug && bytes < 0) +	bytes = usb_bulk_read(client->phone->device, BULKIN, (char *) client->header, sizeof(usbmux_tcp_header), 800); +	if (debug && bytes < 0)  		printf("get_iPhone(): when reading, libusb gave me the error: %s\n", usb_strerror()); -	 +  	delete_connection(client);  	return IPHONE_E_SUCCESS; @@ -201,30 +213,35 @@ iphone_error_t iphone_mux_free_client ( iphone_umux_client_t client ) {   * @return IPHONE_E_SUCCESS on success.   */ -iphone_error_t iphone_mux_send ( iphone_umux_client_t client, const char *data, uint32_t datalen, uint32_t *sent_bytes ) { -	if (!client->phone || !client || !data || datalen == 0 || !sent_bytes) return IPHONE_E_INVALID_ARG; +iphone_error_t iphone_mux_send(iphone_umux_client_t client, const char *data, uint32_t datalen, uint32_t * sent_bytes) +{ +	if (!client->phone || !client || !data || datalen == 0 || !sent_bytes) +		return IPHONE_E_INVALID_ARG;  	// client->scnt and client->ocnt should already be in host notation...  	// we don't need to change them juuuust yet.   	*sent_bytes = 0; -	if (debug) printf("mux_send(): client wants to send %i bytes\n", datalen); -	char *buffer = (char*)malloc(sizeof(usbmux_tcp_header) + datalen + 2); // allow 2 bytes of safety padding +	if (debug) +		printf("mux_send(): client wants to send %i bytes\n", datalen); +	char *buffer = (char *) malloc(sizeof(usbmux_tcp_header) + datalen + 2);	// allow 2 bytes of safety padding  	// Set the length and pre-emptively htonl/htons it  	client->header->length = htonl(sizeof(usbmux_tcp_header) + datalen);  	client->header->length16 = htons(sizeof(usbmux_tcp_header) + datalen); -	 +  	// Put scnt and ocnt into big-endian notation  	client->header->scnt = htonl(client->header->scnt);  	client->header->ocnt = htonl(client->header->ocnt);  	// Concatenation of stuff in the buffer.  	memcpy(buffer, client->header, sizeof(usbmux_tcp_header)); -	memcpy(buffer+sizeof(usbmux_tcp_header), data, datalen); -	 +	memcpy(buffer + sizeof(usbmux_tcp_header), data, datalen); +  	// We have a buffer full of data, we should now send it to the phone. -	if (debug) printf("actually sending %zi bytes of data at %p\n", sizeof(usbmux_tcp_header)+datalen, buffer); +	if (debug) +		printf("actually sending %zi bytes of data at %p\n", sizeof(usbmux_tcp_header) + datalen, buffer); + -	 -	*sent_bytes = send_to_phone(client->phone, buffer, sizeof(usbmux_tcp_header)+datalen); -	if (debug) printf("mux_send: sent %i bytes!\n", *sent_bytes); +	*sent_bytes = send_to_phone(client->phone, buffer, sizeof(usbmux_tcp_header) + datalen); +	if (debug) +		printf("mux_send: sent %i bytes!\n", *sent_bytes);  	// Now that we've sent it off, we can clean up after our sloppy selves.  	if (debug) {  		FILE *packet = fopen("packet", "a+"); @@ -232,24 +249,25 @@ iphone_error_t iphone_mux_send ( iphone_umux_client_t client, const char *data,  		fclose(packet);  		printf("\n");  	} -	 -	if (buffer) free(buffer); + +	if (buffer) +		free(buffer);  	// Re-calculate scnt and ocnt  	client->header->scnt = ntohl(client->header->scnt) + datalen;  	client->header->ocnt = ntohl(client->header->ocnt); -	 +  	// Revert lengths  	client->header->length = ntohl(client->header->length);  	client->header->length16 = ntohs(client->header->length16); -	 +  	// Now return the bytes. -	if (*sent_bytes < sizeof(usbmux_tcp_header)+datalen) { +	if (*sent_bytes < sizeof(usbmux_tcp_header) + datalen) {  		*sent_bytes = 0;  		return IPHONE_E_NOT_ENOUGH_DATA;  	} else { -		*sent_bytes = *sent_bytes - 28; // actual length sent. :/ +		*sent_bytes = *sent_bytes - 28;	// actual length sent. :/  	} -	 +  	return IPHONE_E_SUCCESS;  } @@ -261,7 +279,8 @@ iphone_error_t iphone_mux_send ( iphone_umux_client_t client, const char *data,   *   * @return How many bytes were read, or -1 if something bad happens.   */ -iphone_error_t iphone_mux_recv ( iphone_umux_client_t client, char *data, uint32_t datalen, uint32_t *recv_bytes ) { +iphone_error_t iphone_mux_recv(iphone_umux_client_t client, char *data, uint32_t datalen, uint32_t * recv_bytes) +{  	if (!client || !data || datalen == 0 || !recv_bytes)  		return IPHONE_E_INVALID_ARG; @@ -269,18 +288,19 @@ iphone_error_t iphone_mux_recv ( iphone_umux_client_t client, char *data, uint32  	 * Order of operation:  	 * 1.) Check if the client has a pre-received buffer.  	 * 2.) If so, fill data with the buffer, as much as needed. -	 * 	a.) Return quickly if the buffer has enough -	 * 	b.) If the buffer is only part of the datalen, get the rest of datalen (and if we can't, just return) +	 *      a.) Return quickly if the buffer has enough +	 *      b.) If the buffer is only part of the datalen, get the rest of datalen (and if we can't, just return)  	 * 3.) If not, receive directly from the phone.  -	 * 	a.) Check incoming packet's ports. If proper, follow proper buffering and receiving operation. -	 * 	b.) If not, find the client the ports belong to and fill that client's buffer, then return mux_recv with the same args to try again. +	 *      a.) Check incoming packet's ports. If proper, follow proper buffering and receiving operation. +	 *      b.) If not, find the client the ports belong to and fill that client's buffer, then return mux_recv with the same args to try again.  	 */ -	if (debug) printf("mux_recv: datalen == %i\n", datalen); +	if (debug) +		printf("mux_recv: datalen == %i\n", datalen);  	int bytes = 0, i = 0, complex = 0, offset = 0;  	*recv_bytes = 0;  	char *buffer = NULL;  	usbmux_tcp_header *header = NULL; -		 +  	if (client->recv_buffer) {  		if (client->r_len >= datalen) {  			memcpy(data, client->recv_buffer, datalen); @@ -290,41 +310,42 @@ iphone_error_t iphone_mux_recv ( iphone_umux_client_t client, char *data, uint32  				client->r_len = 0;  				client->recv_buffer = NULL;  			} else { -				buffer = (char*)malloc(sizeof(char) * (client->r_len - datalen)); -				memcpy(buffer, client->recv_buffer+datalen, (client->r_len - datalen)); +				buffer = (char *) malloc(sizeof(char) * (client->r_len - datalen)); +				memcpy(buffer, client->recv_buffer + datalen, (client->r_len - datalen));  				client->r_len -= datalen;  				free(client->recv_buffer);  				client->recv_buffer = buffer;  			} -			 +  			// Since we were able to fill the data straight from our buffer, we can just return datalen. See 2a above.  			return datalen;  		} else {  			memcpy(data, client->recv_buffer, client->r_len); -			free(client->recv_buffer); // don't need to deal with anymore, but... -			offset = client->r_len; // see #2b, above +			free(client->recv_buffer);	// don't need to deal with anymore, but... +			offset = client->r_len;	// see #2b, above  			client->r_len = 0;  		} -	} // End of what to do if we have a pre-buffer. See #1 and #2 above.  -	 -	buffer = (char*)malloc(sizeof(char) * 131072); // make sure we get enough ;) -	 +	}							// End of what to do if we have a pre-buffer. See #1 and #2 above.  + +	buffer = (char *) malloc(sizeof(char) * 131072);	// make sure we get enough ;) +  	// See #3.  	bytes = recv_from_phone(client->phone, buffer, 131072);  	if (bytes < 28) {  		free(buffer); -		if (debug) printf("mux_recv: Did not even get the header.\n"); +		if (debug) +			printf("mux_recv: Did not even get the header.\n");  		return IPHONE_E_NOT_ENOUGH_DATA;  	} -	 -	header = (usbmux_tcp_header*)buffer; + +	header = (usbmux_tcp_header *) buffer;  	if (header->sport != client->header->dport || header->dport != client->header->sport) {  		// Ooooops -- we got someone else's packet.  		// We gotta stick it in their buffer. (Take that any old way you want ;) )  		for (i = 0; i < clients; i++) {  			if (connlist[i]->header->sport == header->dport && connlist[i]->header->dport == header->sport) {  				// we have a winner. -				char *nfb = (char*)malloc(sizeof(char) * (connlist[i]->r_len + (bytes - 28))); +				char *nfb = (char *) malloc(sizeof(char) * (connlist[i]->r_len + (bytes - 28)));  				if (connlist[i]->recv_buffer && connlist[i]->r_len) {  					memcpy(nfb, connlist[i]->recv_buffer, connlist[i]->r_len);  					free(connlist[i]->recv_buffer); @@ -332,45 +353,44 @@ iphone_error_t iphone_mux_recv ( iphone_umux_client_t client, char *data, uint32  				connlist[i]->r_len += bytes - 28;  				//connlist[i]->recv_buffer = (char*)realloc(connlist[i]->recv_buffer, sizeof(char) * client->r_len); // grow their buffer  				connlist[i]->recv_buffer = nfb; -				nfb = NULL; // A cookie for you if you can guess what "nfb" means.  +				nfb = NULL;		// A cookie for you if you can guess what "nfb" means.   				complex = connlist[i]->r_len - (bytes - 28); -				memcpy(connlist[i]->recv_buffer+complex, buffer+28, bytes-28); // paste into their buffer -				connlist[i]->header->ocnt += bytes-28; +				memcpy(connlist[i]->recv_buffer + complex, buffer + 28, bytes - 28);	// paste into their buffer +				connlist[i]->header->ocnt += bytes - 28;  			}  		}  		// If it wasn't ours, it's been handled by this point... or forgotten.  		// Free our buffer and continue.  		free(buffer);  		buffer = NULL; -		return iphone_mux_recv(client, data, datalen, recv_bytes); // recurse back in to try again +		return iphone_mux_recv(client, data, datalen, recv_bytes);	// recurse back in to try again  	} -  	// The packet was absolutely meant for us if it hits this point.  	// The pre-buffer has been taken care of, so, again, if we're at this point we have to read from the phone. -	 -	if ((bytes-28) > datalen) { + +	if ((bytes - 28) > datalen) {  		// Copy what we need into the data, buffer the rest because we can. -		memcpy(data+offset, buffer+28, datalen); // data+offset: see #2b, above -		complex = client->r_len + (bytes-28) - datalen; -		client->recv_buffer = (char*)realloc(client->recv_buffer, (sizeof(char) * complex)); +		memcpy(data + offset, buffer + 28, datalen);	// data+offset: see #2b, above +		complex = client->r_len + (bytes - 28) - datalen; +		client->recv_buffer = (char *) realloc(client->recv_buffer, (sizeof(char) * complex));  		client->r_len = complex; -		complex = client->r_len - (bytes-28) - datalen; -		memcpy(client->recv_buffer+complex, buffer+28+datalen, (bytes-28) - datalen); +		complex = client->r_len - (bytes - 28) - datalen; +		memcpy(client->recv_buffer + complex, buffer + 28 + datalen, (bytes - 28) - datalen);  		free(buffer); -		client->header->ocnt += bytes-28; +		client->header->ocnt += bytes - 28;  		*recv_bytes = datalen;  		return IPHONE_E_SUCCESS;  	} else {  		// Fill the data with what we have, and just return. -		memcpy(data+offset, buffer+28, bytes-28); // data+offset: see #2b, above -		client->header->ocnt += bytes-28; +		memcpy(data + offset, buffer + 28, bytes - 28);	// data+offset: see #2b, above +		client->header->ocnt += bytes - 28;  		free(buffer);  		*recv_bytes = bytes - 28;  		return IPHONE_E_SUCCESS;  	} -	 +  	// If we get to this point, 'tis probably bad. -	if (debug) printf("mux_recv: Heisenbug: bytes and datalen not matching up\n"); +	if (debug) +		printf("mux_recv: Heisenbug: bytes and datalen not matching up\n");  	return IPHONE_E_UNKNOWN_ERROR;  } - diff --git a/src/userpref.c b/src/userpref.c index 5b53775..57946f7 100644 --- a/src/userpref.c +++ b/src/userpref.c @@ -39,10 +39,11 @@ extern int debug;  /** Creates a freedesktop compatible configuration directory for libiphone.   */ -inline void create_config_dir() { -	gchar* config_dir = g_build_path(G_DIR_SEPARATOR_S,  g_get_user_config_dir(), LIBIPHONE_CONF_DIR, NULL); +inline void create_config_dir() +{ +	gchar *config_dir = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, NULL); -	if (!g_file_test(config_dir, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR) )) +	if (!g_file_test(config_dir, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)))  		g_mkdir_with_parents(config_dir, 0755);  	g_free(config_dir); @@ -55,26 +56,29 @@ inline void create_config_dir() {   *   * @return The string containing the HostID or NULL   */ -char* get_host_id() { -	char* host_id = NULL; -	gchar* config_file; -	GKeyFile* key_file; -	gchar* loc_host_id; +char *get_host_id() +{ +	char *host_id = NULL; +	gchar *config_file; +	GKeyFile *key_file; +	gchar *loc_host_id; -	config_file = g_build_path(G_DIR_SEPARATOR_S,  g_get_user_config_dir(), LIBIPHONE_CONF_DIR,  LIBIPHONE_CONF_FILE, NULL); +	config_file = +		g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, LIBIPHONE_CONF_FILE, NULL);  	/* now parse file to get the HostID */  	key_file = g_key_file_new(); -	if(g_key_file_load_from_file(key_file, config_file, G_KEY_FILE_KEEP_COMMENTS, NULL)) { +	if (g_key_file_load_from_file(key_file, config_file, G_KEY_FILE_KEEP_COMMENTS, NULL)) {  		loc_host_id = g_key_file_get_value(key_file, "Global", "HostID", NULL);  		if (loc_host_id) -			host_id = strdup((char*)loc_host_id); +			host_id = strdup((char *) loc_host_id);  		g_free(loc_host_id);  	}  	g_key_file_free(key_file);  	g_free(config_file); -	if (debug) printf("get_host_id(): Using %s as HostID\n",host_id); +	if (debug) +		printf("get_host_id(): Using %s as HostID\n", host_id);  	return host_id;  } @@ -85,16 +89,17 @@ char* get_host_id() {   * @return 1 if the iPhone has been connected previously to this configuration   *         or 0 otherwise.   */ -int is_device_known(char* uid) { +int is_device_known(char *uid) +{  	int ret = 0;  	gchar *config_file;  	GKeyFile *key_file;  	gchar **devices_list, **pcur, *keyfilepath, *stored_key;  	GIOChannel *keyfile; -	 +  	/* first get config file */ -	gchar* device_file = g_strconcat(uid, ".pem", NULL); -	config_file = g_build_path(G_DIR_SEPARATOR_S,  g_get_user_config_dir(), LIBIPHONE_CONF_DIR, device_file, NULL); +	gchar *device_file = g_strconcat(uid, ".pem", NULL); +	config_file = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, device_file, NULL);  	if (g_file_test(config_file, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)))  		ret = 1;  	g_free(config_file); @@ -110,7 +115,8 @@ int is_device_known(char* uid) {   * @return 1 on success and 0 if no public key is given or if it has already   *         been marked as connected previously.   */ -int store_device_public_key(char* uid, char* public_key) { +int store_device_public_key(char *uid, char *public_key) +{  	if (NULL == public_key || is_device_known(uid))  		return 0; @@ -119,14 +125,14 @@ int store_device_public_key(char* uid, char* public_key) {  	create_config_dir();  	/* build file path */ -	gchar* device_file = g_strconcat(uid, ".pem", NULL); -	gchar* pem = g_build_path(G_DIR_SEPARATOR_S,  g_get_user_config_dir(), LIBIPHONE_CONF_DIR, device_file, NULL); +	gchar *device_file = g_strconcat(uid, ".pem", NULL); +	gchar *pem = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, device_file, NULL);  	/* decode public key for storing */  	gsize decoded_size; -	gchar* data = g_base64_decode (public_key, &decoded_size); +	gchar *data = g_base64_decode(public_key, &decoded_size);  	/* store file */ -	FILE* pFile = fopen(pem , "wb"); +	FILE *pFile = fopen(pem, "wb");  	fwrite(data, 1, decoded_size, pFile);  	fclose(pFile);  	g_free(pem); @@ -142,24 +148,25 @@ int store_device_public_key(char* uid, char* public_key) {   *   * @return 1 if the file contents where read successfully and 0 otherwise.   */ -int read_file_in_confdir(char* file, gnutls_datum_t* data) { +int read_file_in_confdir(char *file, gnutls_datum_t * data) +{  	gboolean success;  	gsize size; -	char *content;		 +	char *content;  	gchar *filepath;  	if (NULL == file || NULL == data)  		return 0;  	/* Read file */ -	filepath = g_build_path(G_DIR_SEPARATOR_S,  g_get_user_config_dir(), LIBIPHONE_CONF_DIR,  file, NULL); +	filepath = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, file, NULL);  	success = g_file_get_contents(filepath, &content, &size, NULL);  	g_free(filepath);  	/* Add it to the gnutls_datnum_t structure */  	data->data = content;  	data->size = size; -	 +  	return success;  } @@ -169,7 +176,8 @@ int read_file_in_confdir(char* file, gnutls_datum_t* data) {   *   * @return 1 if the file was successfully read and 0 otherwise.   */ -int get_root_private_key(gnutls_datum_t* root_privkey) { +int get_root_private_key(gnutls_datum_t * root_privkey) +{  	return read_file_in_confdir(LIBIPHONE_ROOT_PRIVKEY, root_privkey);  } @@ -179,7 +187,8 @@ int get_root_private_key(gnutls_datum_t* root_privkey) {   *   * @return 1 if the file was successfully read and 0 otherwise.   */ -int get_host_private_key(gnutls_datum_t* host_privkey) { +int get_host_private_key(gnutls_datum_t * host_privkey) +{  	return read_file_in_confdir(LIBIPHONE_HOST_PRIVKEY, host_privkey);  } @@ -189,7 +198,8 @@ int get_host_private_key(gnutls_datum_t* host_privkey) {   *   * @return 1 if the file was successfully read and 0 otherwise.   */ -int get_root_certificate(gnutls_datum_t* root_cert) { +int get_root_certificate(gnutls_datum_t * root_cert) +{  	return read_file_in_confdir(LIBIPHONE_ROOT_CERTIF, root_cert);  } @@ -199,7 +209,8 @@ int get_root_certificate(gnutls_datum_t* root_cert) {   *   * @return 1 if the file was successfully read and 0 otherwise.   */ -int get_host_certificate(gnutls_datum_t* host_cert) { +int get_host_certificate(gnutls_datum_t * host_cert) +{  	return read_file_in_confdir(LIBIPHONE_HOST_CERTIF, host_cert);  } @@ -215,30 +226,34 @@ int get_host_certificate(gnutls_datum_t* host_cert) {   *   * @return 1 on success and 0 otherwise.   */ -int init_config_file(char* host_id, gnutls_datum_t* root_key, gnutls_datum_t* host_key, gnutls_datum_t* root_cert, gnutls_datum_t* host_cert) { -	FILE * pFile; -	gchar* pem; -	GKeyFile* key_file; +int init_config_file(char *host_id, gnutls_datum_t * root_key, gnutls_datum_t * host_key, gnutls_datum_t * root_cert, +					 gnutls_datum_t * host_cert) +{ +	FILE *pFile; +	gchar *pem; +	GKeyFile *key_file;  	gsize length;  	gchar *buf, *config_file; -	GIOChannel* file; +	GIOChannel *file;  	if (!host_id || !root_key || !host_key || !root_cert || !host_cert)  		return 0; -	/* Make sure config directory exists*/ +	/* Make sure config directory exists */  	create_config_dir();  	/* Now parse file to get the HostID */  	key_file = g_key_file_new();  	/* Store in config file */ -	if (debug) printf("init_config_file(): setting hostID to %s\n", host_id); +	if (debug) +		printf("init_config_file(): setting hostID to %s\n", host_id);  	g_key_file_set_value(key_file, "Global", "HostID", host_id);  	/* Write config file on disk */ -	buf = g_key_file_to_data(key_file, &length,NULL); -	config_file = g_build_path(G_DIR_SEPARATOR_S,  g_get_user_config_dir(), LIBIPHONE_CONF_DIR,  LIBIPHONE_CONF_FILE, NULL); +	buf = g_key_file_to_data(key_file, &length, NULL); +	config_file = +		g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, LIBIPHONE_CONF_FILE, NULL);  	file = g_io_channel_new_file(config_file, "w", NULL);  	g_free(config_file);  	g_io_channel_write_chars(file, buf, length, NULL, NULL); @@ -248,27 +263,27 @@ int init_config_file(char* host_id, gnutls_datum_t* root_key, gnutls_datum_t* ho  	g_key_file_free(key_file);  	/* Now write keys and certificates to disk */ -	pem = g_build_path(G_DIR_SEPARATOR_S,  g_get_user_config_dir(), LIBIPHONE_CONF_DIR, LIBIPHONE_ROOT_PRIVKEY, NULL); -	pFile = fopen(pem , "wb"); -	fwrite(root_key->data, 1 , root_key->size , pFile ); +	pem = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, LIBIPHONE_ROOT_PRIVKEY, NULL); +	pFile = fopen(pem, "wb"); +	fwrite(root_key->data, 1, root_key->size, pFile);  	fclose(pFile);  	g_free(pem); -	pem = g_build_path(G_DIR_SEPARATOR_S,  g_get_user_config_dir(), LIBIPHONE_CONF_DIR, LIBIPHONE_HOST_PRIVKEY, NULL); -	pFile = fopen(pem , "wb"); -	fwrite(host_key->data, 1 , host_key->size , pFile); +	pem = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, LIBIPHONE_HOST_PRIVKEY, NULL); +	pFile = fopen(pem, "wb"); +	fwrite(host_key->data, 1, host_key->size, pFile);  	fclose(pFile);  	g_free(pem); -	pem = g_build_path(G_DIR_SEPARATOR_S,  g_get_user_config_dir(), LIBIPHONE_CONF_DIR, LIBIPHONE_ROOT_CERTIF, NULL); -	pFile = fopen(pem , "wb"); -	fwrite(root_cert->data, 1 , root_cert->size , pFile); +	pem = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, LIBIPHONE_ROOT_CERTIF, NULL); +	pFile = fopen(pem, "wb"); +	fwrite(root_cert->data, 1, root_cert->size, pFile);  	fclose(pFile);  	g_free(pem); -	pem = g_build_path(G_DIR_SEPARATOR_S,  g_get_user_config_dir(), LIBIPHONE_CONF_DIR, LIBIPHONE_HOST_CERTIF, NULL); -	pFile = fopen(pem , "wb"); -	fwrite(host_cert->data, 1 , host_cert->size , pFile); +	pem = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), LIBIPHONE_CONF_DIR, LIBIPHONE_HOST_CERTIF, NULL); +	pFile = fopen(pem, "wb"); +	fwrite(host_cert->data, 1, host_cert->size, pFile);  	fclose(pFile);  	g_free(pem); diff --git a/src/userpref.h b/src/userpref.h index 553c5df..5171929 100644 --- a/src/userpref.h +++ b/src/userpref.h @@ -28,44 +28,44 @@   *    * @return the HostID if exist in config file. Returns NULL otherwise.   */ -char* get_host_id(); +char *get_host_id();  /**   * Determine if we already paired this device.   *    * @return 1 if device is already paired. Returns 0 otherwise.   */ -int is_device_known(char* uid); +int is_device_known(char *uid);  /**   * @return 1 if everything went well. Returns 0 otherwise.   */ -int store_device_public_key(char* uid, char* public_key); +int store_device_public_key(char *uid, char *public_key);  /**   * @return 1 if everything went well. Returns 0 otherwise.   */ -int get_root_private_key(gnutls_datum_t* root_privkey); +int get_root_private_key(gnutls_datum_t * root_privkey);  /**   * @return 1 if everything went well. Returns 0 otherwise.   */ -int get_host_private_key(gnutls_datum_t* host_privkey); +int get_host_private_key(gnutls_datum_t * host_privkey);  /**   * @return 1 if everything went well. Returns 0 otherwise.   */ -int get_root_certificate(gnutls_datum_t* root_cert); +int get_root_certificate(gnutls_datum_t * root_cert);  /**   * @return 1 if everything went well. Returns 0 otherwise.   */ -int get_host_certificate(gnutls_datum_t* host_cert); +int get_host_certificate(gnutls_datum_t * host_cert);  /**   * Setup a brand new config file.   * @return 1 if everything went well. Returns 0 otherwise.   */ -int init_config_file(char* host_id, gnutls_datum_t* root_key, gnutls_datum_t* host_key, gnutls_datum_t* root_cert, gnutls_datum_t* host_cert); +int init_config_file(char *host_id, gnutls_datum_t * root_key, gnutls_datum_t * host_key, gnutls_datum_t * root_cert, +					 gnutls_datum_t * host_cert);  #endif - | 
