diff options
Diffstat (limited to 'libusbmuxd/libusbmuxd.c')
| -rw-r--r-- | libusbmuxd/libusbmuxd.c | 89 | 
1 files changed, 59 insertions, 30 deletions
| diff --git a/libusbmuxd/libusbmuxd.c b/libusbmuxd/libusbmuxd.c index db8d1d4..f5e5d1b 100644 --- a/libusbmuxd/libusbmuxd.c +++ b/libusbmuxd/libusbmuxd.c @@ -46,6 +46,8 @@ static usbmuxd_event_cb_t event_cb = NULL;  pthread_t devmon;  static int listenfd = -1; +static int use_tag = 0; +  /**   * Finds a device info record by its handle.   * if the record is not found, NULL is returned. @@ -152,6 +154,53 @@ static int usbmuxd_get_result(int sfd, uint32_t tag, uint32_t * result)  	return -EPROTO;  } +static int send_packet(int sfd, uint32_t message, uint32_t tag, void *payload, uint32_t payload_size) +{ +	struct usbmuxd_header header; + +	header.length = sizeof(struct usbmuxd_header); +	header.version = USBMUXD_PROTOCOL_VERSION; +	header.message = message; +	header.tag = tag; +	if (payload && (payload_size > 0)) { +		header.length += payload_size; +	} +	int sent = send_buf(sfd, &header, sizeof(header)); +	if (sent != sizeof(header)) { +		fprintf(stderr, "%s: ERROR: could not send packet header\n", __func__); +		return -1; +	} +	if (payload && (payload_size > 0)) { +		sent += send_buf(sfd, payload, payload_size); +	} +	if (sent != (int)header.length) { +		fprintf(stderr, "%s: ERROR: could not send whole packet\n", __func__); +		close(sfd); +		return -1; +	} +	return sent; +} + +static int send_listen_packet(int sfd, uint32_t tag) +{ +	return send_packet(sfd, MESSAGE_LISTEN, tag, NULL, 0); +} + +static int send_connect_packet(int sfd, uint32_t tag, uint32_t device_id, uint16_t port) +{ +	struct { +		uint32_t device_id; +		uint16_t port; +		uint16_t reserved; +	} conninfo; + +	conninfo.device_id = device_id; +	conninfo.port = htons(port); +	conninfo.reserved = 0; + +	return send_packet(sfd, MESSAGE_CONNECT, tag, &conninfo, sizeof(conninfo)); + +}  /**   * Generates an event, i.e. calls the callback function. @@ -181,12 +230,6 @@ static int usbmuxd_listen()  {  	int sfd;  	uint32_t res = -1; -	struct usbmuxd_listen_request req; - -	req.header.length = sizeof(struct usbmuxd_listen_request); -	req.header.version = USBMUXD_PROTOCOL_VERSION; -	req.header.message = MESSAGE_LISTEN; -	req.header.tag = 2;  	sfd = connect_usbmuxd_socket();  	if (sfd < 0) { @@ -203,12 +246,13 @@ static int usbmuxd_listen()  		return sfd;  	} -	if (send_buf(sfd, &req, req.header.length) != (int)req.header.length) { +	use_tag++; +	if (send_listen_packet(sfd, use_tag) <= 0) {  		fprintf(stderr, "%s: ERROR: could not send listen packet\n", __func__);  		close(sfd);  		return -1;  	} -	if (usbmuxd_get_result(sfd, req.header.tag, &res) && (res != 0)) { +	if (usbmuxd_get_result(sfd, use_tag, &res) && (res != 0)) {  		close(sfd);  		fprintf(stderr, "%s: ERROR: did not get OK but %d\n", __func__, res);  		return -1; @@ -343,7 +387,6 @@ int usbmuxd_unsubscribe()  int usbmuxd_get_device_list(usbmuxd_device_info_t **device_list)  { -	struct usbmuxd_listen_request s_req;  	int sfd;  	int listen_success = 0;  	uint32_t res; @@ -359,17 +402,11 @@ int usbmuxd_get_device_list(usbmuxd_device_info_t **device_list)  		return sfd;  	} -	s_req.header.length = sizeof(struct usbmuxd_listen_request); -	s_req.header.version = USBMUXD_PROTOCOL_VERSION; -	s_req.header.message = MESSAGE_LISTEN; -	s_req.header.tag = 2; - -	// send scan request packet -	if (send_buf(sfd, &s_req, s_req.header.length) == -		(int) s_req.header.length) { +	use_tag++; +	if (send_listen_packet(sfd, use_tag) > 0) {  		res = -1;  		// get response -		if (usbmuxd_get_result(sfd, s_req.header.tag, &res) && (res == 0)) { +		if (usbmuxd_get_result(sfd, use_tag, &res) && (res == 0)) {  			listen_success = 1;  		} else {  			close(sfd); @@ -481,7 +518,6 @@ int usbmuxd_get_device_by_uuid(const char *uuid, usbmuxd_device_info_t *device)  int usbmuxd_connect(const int handle, const unsigned short port)  {  	int sfd; -	struct usbmuxd_connect_request c_req;  	int connected = 0;  	uint32_t res = -1; @@ -492,20 +528,13 @@ int usbmuxd_connect(const int handle, const unsigned short port)  		return sfd;  	} -	c_req.header.length = sizeof(c_req); -	c_req.header.version = USBMUXD_PROTOCOL_VERSION; -	c_req.header.message = MESSAGE_CONNECT; -	c_req.header.tag = 3; -	c_req.device_id = (uint32_t) handle; -	c_req.port = htons(port); -	c_req.reserved = 0; - -	if (send_buf(sfd, &c_req, sizeof(c_req)) < 0) { -		perror("send"); +	use_tag++; +	if (send_connect_packet(sfd, use_tag, (uint32_t)handle, (uint16_t)port) <= 0) { +		fprintf(stderr, "%s: Error sending connect message!\n", __func__);  	} else {  		// read ACK  		//fprintf(stderr, "%s: Reading connect result...\n", __func__); -		if (usbmuxd_get_result(sfd, c_req.header.tag, &res)) { +		if (usbmuxd_get_result(sfd, use_tag, &res)) {  			if (res == 0) {  				//fprintf(stderr, "%s: Connect success!\n", __func__);  				connected = 1; | 
