summaryrefslogtreecommitdiffstats
path: root/src/MobileSync.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/MobileSync.c')
-rw-r--r--src/MobileSync.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/MobileSync.c b/src/MobileSync.c
index b16a51b..25f9473 100644
--- a/src/MobileSync.c
+++ b/src/MobileSync.c
@@ -22,6 +22,7 @@
22#include "MobileSync.h" 22#include "MobileSync.h"
23#include <plist/plist.h> 23#include <plist/plist.h>
24#include <string.h> 24#include <string.h>
25#include <arpa/inet.h>
25 26
26 27
27#define MSYNC_VERSION_INT1 100 28#define MSYNC_VERSION_INT1 100
@@ -136,16 +137,27 @@ iphone_error_t iphone_msync_recv(iphone_msync_client_t client, plist_t * plist)
136 if (!client || !plist || (plist && *plist)) 137 if (!client || !plist || (plist && *plist))
137 return IPHONE_E_INVALID_ARG; 138 return IPHONE_E_INVALID_ARG;
138 iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR; 139 iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR;
139 char *receive; 140 char *receive = NULL;
140 uint32_t datalen = 0, bytes = 0; 141 uint32_t datalen = 0, bytes = 0, received_bytes = 0;
141 142
142 ret = iphone_mux_recv(client->connection, (char *) &datalen, sizeof(datalen), &bytes); 143 ret = iphone_mux_recv(client->connection, (char *) &datalen, sizeof(datalen), &bytes);
143 datalen = ntohl(datalen); 144 datalen = ntohl(datalen);
144 145
145 receive = (char *) malloc(sizeof(char) * datalen); 146 receive = (char *) malloc(sizeof(char) * datalen);
146 ret = iphone_mux_recv(client->connection, receive, datalen, &bytes);
147 147
148 plist_from_bin(receive, bytes, plist); 148 /* fill buffer and request more packets if needed */
149 while ((received_bytes < datalen) && (ret == IPHONE_E_SUCCESS)) {
150 ret = iphone_mux_recv(client->connection, receive + received_bytes, datalen - received_bytes, &bytes);
151 received_bytes += bytes;
152 }
153
154 if (ret != IPHONE_E_SUCCESS) {
155 free(receive);
156 return ret;
157 }
158
159 plist_from_bin(receive, received_bytes, plist);
160 free(receive);
149 161
150 char *XMLContent = NULL; 162 char *XMLContent = NULL;
151 uint32_t length = 0; 163 uint32_t length = 0;