diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/libusbmuxd.c | 31 | 
1 files changed, 23 insertions, 8 deletions
| diff --git a/src/libusbmuxd.c b/src/libusbmuxd.c index 77b2f43..352a578 100644 --- a/src/libusbmuxd.c +++ b/src/libusbmuxd.c @@ -170,10 +170,11 @@ static int receive_packet(int sfd, struct usbmuxd_header *header, void **payload  		}  		plist_t node = plist_dict_get_item(plist, "MessageType"); -		if (plist_get_node_type(node) != PLIST_STRING) { -			DEBUG(1, "%s: Error getting message type from plist!\n", __func__); -			plist_free(plist); -			return -EBADMSG; +		if (!node || plist_get_node_type(node) != PLIST_STRING) { +			*payload = plist; +			hdr.length = sizeof(hdr); +			memcpy(header, &hdr, sizeof(hdr)); +			return hdr.length;  		}  		plist_get_string_val(node, &message); @@ -258,7 +259,7 @@ static int receive_packet(int sfd, struct usbmuxd_header *header, void **payload  /**   * Retrieves the result code to a previously sent request.   */ -static int usbmuxd_get_result(int sfd, uint32_t tag, uint32_t * result) +static int usbmuxd_get_result(int sfd, uint32_t tag, uint32_t *result, void **result_plist)  {  	struct usbmuxd_header hdr;  	int recv_len; @@ -268,6 +269,9 @@ static int usbmuxd_get_result(int sfd, uint32_t tag, uint32_t * result)  		return -EINVAL;  	}  	*result = -1; +	if (result_plist) { +		*result_plist = NULL; +	}  	if ((recv_len = receive_packet(sfd, &hdr, (void**)&res, 5000)) < 0) {  		DEBUG(1, "%s: Error receiving packet: %d\n", __func__, errno); @@ -292,6 +296,17 @@ static int usbmuxd_get_result(int sfd, uint32_t tag, uint32_t * result)  			free(res);  		return ret;  	} +#ifdef HAVE_PLIST +	else if (hdr.message == MESSAGE_PLIST) { +		if (!result_plist) { +			DEBUG(1, "%s: MESSAGE_PLIST result but result_plist pointer is NULL!\n", __func__); +			return -1; +		} +		*result_plist = (plist_t)res; +		*result = RESULT_OK; +		return 1; +	} +#endif  	DEBUG(1, "%s: Unexpected message of type %d received!\n", __func__, hdr.message);  	if (res)  		free(res); @@ -533,7 +548,7 @@ retry:  		close_socket(sfd);  		return -1;  	} -	if (usbmuxd_get_result(sfd, use_tag, &res) && (res != 0)) { +	if (usbmuxd_get_result(sfd, use_tag, &res, NULL) && (res != 0)) {  		UNLOCK;  		close_socket(sfd);  #ifdef HAVE_PLIST @@ -740,7 +755,7 @@ retry:  	if (send_listen_packet(sfd, use_tag) > 0) {  		res = -1;  		// get response -		if (usbmuxd_get_result(sfd, use_tag, &res) && (res == 0)) { +		if (usbmuxd_get_result(sfd, use_tag, &res, NULL) && (res == 0)) {  			listen_success = 1;  		} else {  			UNLOCK; @@ -903,7 +918,7 @@ retry:  	} else {  		// read ACK  		DEBUG(2, "%s: Reading connect result...\n", __func__); -		if (usbmuxd_get_result(sfd, use_tag, &res)) { +		if (usbmuxd_get_result(sfd, use_tag, &res, NULL)) {  			if (res == 0) {  				DEBUG(2, "%s: Connect success!\n", __func__);  				connected = 1; | 
