diff options
| author | 2008-07-29 10:13:37 -0700 | |
|---|---|---|
| committer | 2008-07-29 10:13:37 -0700 | |
| commit | 3dc130f3049e250b2d5c0b48af1995fda2fad3d4 (patch) | |
| tree | 9d801459ef68e83a0d4ca038c0589d8e4c8aa2b2 /usbmux.c | |
| parent | 6039e5bbfc36aa5210295c38f251ed178ce5adbb (diff) | |
| download | libplist-3dc130f3049e250b2d5c0b48af1995fda2fad3d4.tar.gz libplist-3dc130f3049e250b2d5c0b48af1995fda2fad3d4.tar.bz2 | |
Autotooled the project with very basic versioning support.
Diffstat (limited to 'usbmux.c')
| -rw-r--r-- | usbmux.c | 198 | 
1 files changed, 0 insertions, 198 deletions
| diff --git a/usbmux.c b/usbmux.c deleted file mode 100644 index 8c5fc34..0000000 --- a/usbmux.c +++ /dev/null @@ -1,198 +0,0 @@ - -#include <sys/types.h> -#include <arpa/inet.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "usbmux.h" - -extern int debug; - -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); -	conn->dport = htons(d_port); -	conn->scnt = 0; -	conn->ocnt = 0; -	conn->offset = 0x50; -	conn->window = htons(0x0200); -	conn->nullnull = 0x0000; -	conn->length16 = 28; -	return conn; -} - -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); -	version->minor = 0; -	version->allnull = 0; -	return version; -} - -/* mux_connect(phone, s_port, d_port) - * This is a higher-level USBMuxTCP-type function. - * 	phone: the iPhone to initialize a connection on. - * 	s_port: the source port - * 	d_port: the destination port -- 0xf27e for lockdownd.  - * Initializes a connection on phone, with source port s_port and destination port d_port - *  - * Returns a mux TCP header for the connection which is used for tracking and data transfer. - */  - -usbmux_tcp_header *mux_connect(iPhone *phone, uint16 s_port, uint16 d_port) { -	if (!phone || !s_port || !d_port) return NULL; -	int bytes = 0; -	// Initialize connection stuff -	usbmux_tcp_header *new_connection; -	new_connection = new_mux_packet(s_port, d_port); -	usbmux_tcp_header *response; -	response = (usbmux_tcp_header*)malloc(sizeof(usbmux_tcp_header)); -	// blargg -	if (new_connection) { -		new_connection->tcp_flags = 0x02; -		new_connection->length = htonl(new_connection->length); -		new_connection->length16 = htons(new_connection->length16); -		 -		if (send_to_phone(phone, (char*)new_connection, sizeof(*new_connection)) >= 0) { -			bytes = recv_from_phone(phone, (char*)response, sizeof(*response)); -			if (response->tcp_flags != 0x12) return NULL; -			else { -				new_connection->tcp_flags = 0x10; -				new_connection->scnt = 1; -				new_connection->ocnt = 1; -				return new_connection; -			} -		} else { -			return NULL; -		} -	} -	 -	// if we get to this point it's probably bad -	return NULL; -} - -/* mux_close_connection(phone, connection) - * This is a higher-level USBmuxTCP-type function. - * 	phone: the iPhone to close a connection with. - * 	connection: the connection to close. - *  - * Doesn't return anything; WILL FREE THE CONNECTION'S MEMORY!!! - */ -void mux_close_connection(iPhone *phone, usbmux_tcp_header *connection) { -	if (!phone || !connection) return; -	 -	connection->tcp_flags = 0x04; -	connection->scnt = htonl(connection->scnt); -	connection->ocnt = htonl(connection->ocnt); -	int bytes = 0; -	 -	bytes = usb_bulk_write(phone->device, BULKOUT, (char*)connection, sizeof(*connection), 800); -	bytes = usb_bulk_read(phone->device, BULKIN, (char*)connection, sizeof(*connection), 800); -	 -	free(connection); -} - -/* mux_send(phone, connection, data, datalen) - * This is a higher-level USBMuxTCP-like function. - * 	phone: the iPhone to send to. - * 	connection: the connection we're sending data on. - * 	data: a pointer to the data to send. - * 	datalen: how much data we're sending. - *  - * Returns number of bytes sent, minus the header (28), or -1 on error. - */ -int mux_send(iPhone *phone, usbmux_tcp_header *connection, char *data, uint32 datalen) { -	if (!phone || !connection || !data || datalen == 0) return -1; -	// connection->scnt and connection->ocnt should already be in host notation... -	// we don't need to change them juuuust yet.  -	int bytes = 0; -	if (debug) printf("mux_send(): client wants to send %i bytes\n", datalen); -	char *buffer = (char*)malloc(sizeof(*connection) + datalen + 2); // allow 2 bytes of safety padding -	// Set the length and pre-emptively htonl/htons it -	connection->length = htonl(sizeof(*connection) + datalen); -	connection->length16 = htons(sizeof(*connection) + datalen); -	 -	// Put scnt and ocnt into big-endian notation -	connection->scnt = htonl(connection->scnt); -	connection->ocnt = htonl(connection->ocnt); -	// Concatenation of stuff in the buffer. -	memcpy(buffer, connection, sizeof(*connection)); -	memcpy(buffer+sizeof(*connection)/*+sizeof(datalen)*/, data, datalen); -	 -	// We have a buffer full of data, we should now send it to the phone. -	if (debug) printf("actually sending %i bytes of data at %x\n", sizeof(*connection)+datalen, buffer); - -	 -	bytes = send_to_phone(phone, buffer, sizeof(*connection)+datalen); -	 -	// Now that we've sent it off, we can clean up after our sloppy selves. -	free(buffer); -	 -	// Re-calculate scnt and ocnt -	connection->scnt = ntohl(connection->scnt) + datalen; -	connection->ocnt = ntohl(connection->ocnt); -	 -	// Revert lengths -	connection->length = ntohl(connection->length); -	connection->length16 = ntohs(connection->length16); -	 -	// Now return the bytes. -	if (bytes < sizeof(*connection)+datalen) { -		return -1; // blah -	} else { -		return bytes - 28; // actual length sent. :/ -	} -	 -	return bytes; // or something -} - -/* mux_recv(phone, connection, data, datalen) - * This is a higher-level USBMuxTCP-like function - * 	phone: the phone to receive data from. - * 	connection: the connection to receive data on. - * 	data: where to put the data we receive.  - * 	datalen: how much data to read. - *  - * Returns: how many bytes were read, or -1 if something bad happens. - */ - -int mux_recv(iPhone *phone, usbmux_tcp_header *connection, char *data, uint32 datalen) { -	char *buffer = (char*)malloc(sizeof(*connection) + sizeof(datalen) + datalen); -	int bytes = 0, my_datalen = 0; -	if (debug) printf("mux_recv: datalen == %i\n", datalen); -	bytes = recv_from_phone(phone, buffer, sizeof(*connection) + datalen); -	if (debug) printf("mux_recv: bytes == %i\n", bytes); -	if (bytes < datalen) { -		if (bytes < 28) { -			// if they didn't do that annoying thing, something else mighta happened. -			if (debug) printf("mux_recv: bytes too low anyway!\n"); -			free(buffer); -			return -1; -		} else if (bytes == 28) { // no data... -			free(buffer); -			return 0; -		} else { // bytes > 28 -			my_datalen = ntohl(buffer[4]) - 28; -			connection->ocnt += my_datalen; -			memcpy(data, buffer+28, bytes - 28); -			free(buffer); -			if (debug) printf("mux_recv: bytes received: %i\n", bytes - 28); -			return bytes - 28; -		} -	} else {// all's good, they didn't do anything bonky. -		my_datalen = ntohl(buffer[4]) - 28;  -		connection->ocnt += my_datalen; -		memcpy(data, buffer+28, datalen);  -		free(buffer); -		if (debug) printf("mux_recv: bytes received: %i\n", bytes - 28); -		return bytes - 28; -	} -	 -	return bytes; -} - | 
