summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/lockdown.c98
1 files changed, 19 insertions, 79 deletions
diff --git a/src/lockdown.c b/src/lockdown.c
index fb5f8f5..2532999 100644
--- a/src/lockdown.c
+++ b/src/lockdown.c
@@ -239,61 +239,21 @@ lockdownd_error_t lockdownd_recv(lockdownd_client_t client, plist_t *plist)
239{ 239{
240 if (!client || !plist || (plist && *plist)) 240 if (!client || !plist || (plist && *plist))
241 return LOCKDOWN_E_INVALID_ARG; 241 return LOCKDOWN_E_INVALID_ARG;
242 lockdownd_error_t ret = LOCKDOWN_E_UNKNOWN_ERROR; 242 lockdownd_error_t ret = LOCKDOWN_E_SUCCESS;
243 char *receive = NULL; 243 iphone_error_t err;
244 uint32_t datalen = 0, bytes = 0, received_bytes = 0;
245
246 if (!client->in_SSL)
247 ret = iphone_device_recv(client->connection, (char *) &datalen, sizeof(datalen), &bytes);
248 else {
249 ssize_t res = gnutls_record_recv(client->ssl_session, &datalen, sizeof(datalen));
250 if (res < 0) {
251 log_dbg_msg(DBGMASK_LOCKDOWND, "gnutls_record_recv: Error occured: %s\n", gnutls_strerror(res));
252 return LOCKDOWN_E_SSL_ERROR;
253 } else {
254 bytes = res;
255 ret = LOCKDOWN_E_SUCCESS;
256 }
257 }
258 datalen = ntohl(datalen);
259 log_dbg_msg(DBGMASK_LOCKDOWND, "%s: datalen = %d\n", __func__, datalen);
260
261 receive = (char *) malloc(sizeof(char) * datalen);
262 244
263 /* fill buffer and request more packets if needed */
264 if (!client->in_SSL) { 245 if (!client->in_SSL) {
265 while ((received_bytes < datalen) && (ret == LOCKDOWN_E_SUCCESS)) { 246 err = iphone_device_receive_plist(client->connection, plist);
266 ret = iphone_device_recv(client->connection, receive + received_bytes, datalen - received_bytes, &bytes); 247 if (err != IPHONE_E_SUCCESS) {
267 received_bytes += bytes; 248 ret = LOCKDOWN_E_UNKNOWN_ERROR;
268 } 249 }
269 } else { 250 } else {
270 ssize_t res = 0; 251 err = iphone_device_receive_encrypted_plist(client->ssl_session, plist);
271 while ((received_bytes < datalen) && (ret == LOCKDOWN_E_SUCCESS)) { 252 if (err != IPHONE_E_SUCCESS) {
272 res = gnutls_record_recv(client->ssl_session, receive + received_bytes, datalen - received_bytes); 253 return LOCKDOWN_E_SSL_ERROR;
273 if (res < 0) {
274 log_dbg_msg(DBGMASK_LOCKDOWND, "gnutls_record_recv: Error occured: %s\n", gnutls_strerror(res));
275 ret = LOCKDOWN_E_SSL_ERROR;
276 } else {
277 received_bytes += res;
278 ret = LOCKDOWN_E_SUCCESS;
279 }
280 } 254 }
281 } 255 }
282 256
283 if (ret != LOCKDOWN_E_SUCCESS) {
284 free(receive);
285 return ret;
286 }
287
288 if ((ssize_t)received_bytes <= 0) {
289 free(receive);
290 return LOCKDOWN_E_NOT_ENOUGH_DATA;
291 }
292
293 log_dbg_msg(DBGMASK_LOCKDOWND, "%s: received msg size: %i, buffer follows:\n%s", __func__, received_bytes, receive);
294 plist_from_xml(receive, received_bytes, plist);
295 free(receive);
296
297 if (!*plist) 257 if (!*plist)
298 ret = LOCKDOWN_E_PLIST_ERROR; 258 ret = LOCKDOWN_E_PLIST_ERROR;
299 259
@@ -314,41 +274,21 @@ lockdownd_error_t lockdownd_send(lockdownd_client_t client, plist_t plist)
314{ 274{
315 if (!client || !plist) 275 if (!client || !plist)
316 return LOCKDOWN_E_INVALID_ARG; 276 return LOCKDOWN_E_INVALID_ARG;
317 char *real_query;
318 int bytes;
319 char *XMLContent = NULL;
320 uint32_t length = 0;
321 lockdownd_error_t ret = LOCKDOWN_E_UNKNOWN_ERROR;
322 277
323 plist_to_xml(plist, &XMLContent, &length); 278 lockdownd_error_t ret = LOCKDOWN_E_SUCCESS;
324 log_dbg_msg(DBGMASK_LOCKDOWND, "%s: sending msg size %i, buffer follows:\n%s", __func__, length, XMLContent); 279 iphone_error_t err;
325 280
326 real_query = (char *) malloc(sizeof(char) * (length + 4)); 281 if (!client->in_SSL) {
327 length = htonl(length); 282 err = iphone_device_send_xml_plist(client->connection, plist);
328 memcpy(real_query, &length, sizeof(length)); 283 if (err != IPHONE_E_SUCCESS) {
329 memcpy(real_query + 4, XMLContent, ntohl(length)); 284 ret = LOCKDOWN_E_UNKNOWN_ERROR;
330 free(XMLContent);
331 log_dbg_msg(DBGMASK_LOCKDOWND, "%s: made the query, sending it along\n", __func__);
332
333 if (!client->in_SSL)
334 ret = iphone_device_send(client->connection, real_query, ntohl(length) + sizeof(length), (uint32_t*)&bytes);
335 else {
336 ssize_t res = gnutls_record_send(client->ssl_session, real_query, ntohl(length) + sizeof(length));
337 if (res < 0) {
338 log_dbg_msg(DBGMASK_LOCKDOWND, "gnutls_record_send: Error occured: %s\n", gnutls_strerror(res));
339 ret = LOCKDOWN_E_SSL_ERROR;
340 } else {
341 bytes = res;
342 ret = LOCKDOWN_E_SUCCESS;
343 } 285 }
344 }
345 if (ret == LOCKDOWN_E_SUCCESS) {
346 log_dbg_msg(DBGMASK_LOCKDOWND, "%s: sent it!\n", __func__);
347 } else { 286 } else {
348 log_dbg_msg(DBGMASK_LOCKDOWND, "%s: sending failed!\n", __func__); 287 err = iphone_device_send_encrypted_xml_plist(client->ssl_session, plist);
288 if (err != IPHONE_E_SUCCESS) {
289 ret = LOCKDOWN_E_SSL_ERROR;
290 }
349 } 291 }
350 free(real_query);
351
352 return ret; 292 return ret;
353} 293}
354 294