summaryrefslogtreecommitdiffstats
path: root/src/lockdown.c
diff options
context:
space:
mode:
authorGravatar Martin Szulecki2010-01-10 13:12:00 +0100
committerGravatar Martin Szulecki2010-01-10 13:12:00 +0100
commit2232caa09147bdbbf26b52f3bb17c264051d413d (patch)
treec1db37e1bc49c3e9d9f396e2614ede7cf92a3864 /src/lockdown.c
parentcec7e6b7591d018dd700c6fa6b5c85b29ec43b34 (diff)
parent69b4015bea6c32e523404e9784c225be8bfc0ef3 (diff)
downloadlibimobiledevice-2232caa09147bdbbf26b52f3bb17c264051d413d.tar.gz
libimobiledevice-2232caa09147bdbbf26b52f3bb17c264051d413d.tar.bz2
Merge branch 'master' of git://github.com/MattColyer/libiphone into martin
Diffstat (limited to 'src/lockdown.c')
-rw-r--r--src/lockdown.c98
1 files changed, 19 insertions, 79 deletions
diff --git a/src/lockdown.c b/src/lockdown.c
index 1b33830..24dd4a1 100644
--- a/src/lockdown.c
+++ b/src/lockdown.c
@@ -271,61 +271,21 @@ lockdownd_error_t lockdownd_recv(lockdownd_client_t client, plist_t *plist)
271{ 271{
272 if (!client || !plist || (plist && *plist)) 272 if (!client || !plist || (plist && *plist))
273 return LOCKDOWN_E_INVALID_ARG; 273 return LOCKDOWN_E_INVALID_ARG;
274 lockdownd_error_t ret = LOCKDOWN_E_UNKNOWN_ERROR; 274 lockdownd_error_t ret = LOCKDOWN_E_SUCCESS;
275 char *receive = NULL; 275 iphone_error_t err;
276 uint32_t datalen = 0, bytes = 0, received_bytes = 0;
277
278 if (!client->in_SSL)
279 ret = iphone_device_recv(client->connection, (char *) &datalen, sizeof(datalen), &bytes);
280 else {
281 ssize_t res = gnutls_record_recv(client->ssl_session, &datalen, sizeof(datalen));
282 if (res < 0) {
283 log_dbg_msg(DBGMASK_LOCKDOWND, "gnutls_record_recv: Error occured: %s\n", gnutls_strerror(res));
284 return LOCKDOWN_E_SSL_ERROR;
285 } else {
286 bytes = res;
287 ret = LOCKDOWN_E_SUCCESS;
288 }
289 }
290 datalen = ntohl(datalen);
291 log_dbg_msg(DBGMASK_LOCKDOWND, "%s: datalen = %d\n", __func__, datalen);
292
293 receive = (char *) malloc(sizeof(char) * datalen);
294 276
295 /* fill buffer and request more packets if needed */
296 if (!client->in_SSL) { 277 if (!client->in_SSL) {
297 while ((received_bytes < datalen) && (ret == LOCKDOWN_E_SUCCESS)) { 278 err = iphone_device_receive_plist(client->connection, plist);
298 ret = iphone_device_recv(client->connection, receive + received_bytes, datalen - received_bytes, &bytes); 279 if (err != IPHONE_E_SUCCESS) {
299 received_bytes += bytes; 280 ret = LOCKDOWN_E_UNKNOWN_ERROR;
300 } 281 }
301 } else { 282 } else {
302 ssize_t res = 0; 283 err = iphone_device_receive_encrypted_plist(client->ssl_session, plist);
303 while ((received_bytes < datalen) && (ret == LOCKDOWN_E_SUCCESS)) { 284 if (err != IPHONE_E_SUCCESS) {
304 res = gnutls_record_recv(client->ssl_session, receive + received_bytes, datalen - received_bytes); 285 return LOCKDOWN_E_SSL_ERROR;
305 if (res < 0) {
306 log_dbg_msg(DBGMASK_LOCKDOWND, "gnutls_record_recv: Error occured: %s\n", gnutls_strerror(res));
307 ret = LOCKDOWN_E_SSL_ERROR;
308 } else {
309 received_bytes += res;
310 ret = LOCKDOWN_E_SUCCESS;
311 }
312 } 286 }
313 } 287 }
314 288
315 if (ret != LOCKDOWN_E_SUCCESS) {
316 free(receive);
317 return ret;
318 }
319
320 if ((ssize_t)received_bytes <= 0) {
321 free(receive);
322 return LOCKDOWN_E_NOT_ENOUGH_DATA;
323 }
324
325 log_dbg_msg(DBGMASK_LOCKDOWND, "%s: received msg size: %i, buffer follows:\n%s", __func__, received_bytes, receive);
326 plist_from_xml(receive, received_bytes, plist);
327 free(receive);
328
329 if (!*plist) 289 if (!*plist)
330 ret = LOCKDOWN_E_PLIST_ERROR; 290 ret = LOCKDOWN_E_PLIST_ERROR;
331 291
@@ -346,41 +306,21 @@ lockdownd_error_t lockdownd_send(lockdownd_client_t client, plist_t plist)
346{ 306{
347 if (!client || !plist) 307 if (!client || !plist)
348 return LOCKDOWN_E_INVALID_ARG; 308 return LOCKDOWN_E_INVALID_ARG;
349 char *real_query;
350 int bytes;
351 char *XMLContent = NULL;
352 uint32_t length = 0;
353 lockdownd_error_t ret = LOCKDOWN_E_UNKNOWN_ERROR;
354 309
355 plist_to_xml(plist, &XMLContent, &length); 310 lockdownd_error_t ret = LOCKDOWN_E_SUCCESS;
356 log_dbg_msg(DBGMASK_LOCKDOWND, "%s: sending msg size %i, buffer follows:\n%s", __func__, length, XMLContent); 311 iphone_error_t err;
357 312
358 real_query = (char *) malloc(sizeof(char) * (length + 4)); 313 if (!client->in_SSL) {
359 length = htonl(length); 314 err = iphone_device_send_xml_plist(client->connection, plist);
360 memcpy(real_query, &length, sizeof(length)); 315 if (err != IPHONE_E_SUCCESS) {
361 memcpy(real_query + 4, XMLContent, ntohl(length)); 316 ret = LOCKDOWN_E_UNKNOWN_ERROR;
362 free(XMLContent);
363 log_dbg_msg(DBGMASK_LOCKDOWND, "%s: made the query, sending it along\n", __func__);
364
365 if (!client->in_SSL)
366 ret = iphone_device_send(client->connection, real_query, ntohl(length) + sizeof(length), (uint32_t*)&bytes);
367 else {
368 ssize_t res = gnutls_record_send(client->ssl_session, real_query, ntohl(length) + sizeof(length));
369 if (res < 0) {
370 log_dbg_msg(DBGMASK_LOCKDOWND, "gnutls_record_send: Error occured: %s\n", gnutls_strerror(res));
371 ret = LOCKDOWN_E_SSL_ERROR;
372 } else {
373 bytes = res;
374 ret = LOCKDOWN_E_SUCCESS;
375 } 317 }
376 }
377 if (ret == LOCKDOWN_E_SUCCESS) {
378 log_dbg_msg(DBGMASK_LOCKDOWND, "%s: sent it!\n", __func__);
379 } else { 318 } else {
380 log_dbg_msg(DBGMASK_LOCKDOWND, "%s: sending failed!\n", __func__); 319 err = iphone_device_send_encrypted_xml_plist(client->ssl_session, plist);
320 if (err != IPHONE_E_SUCCESS) {
321 ret = LOCKDOWN_E_SSL_ERROR;
322 }
381 } 323 }
382 free(real_query);
383
384 return ret; 324 return ret;
385} 325}
386 326