diff options
| author | 2020-05-18 03:01:28 +0200 | |
|---|---|---|
| committer | 2020-05-18 03:01:28 +0200 | |
| commit | 2c83cae88c50217f0fbbff5c3d2eab5f252f164e (patch) | |
| tree | d410bc434417caceef9a3298504a37288be5a4cf | |
| parent | 798601d8ff09d4f80a2fd42119112846ea8f050e (diff) | |
| download | libimobiledevice-2c83cae88c50217f0fbbff5c3d2eab5f252f164e.tar.gz libimobiledevice-2c83cae88c50217f0fbbff5c3d2eab5f252f164e.tar.bz2 | |
Use direct socket connection for network devices
Instead of relaying data via usbmuxd this change will have it connect directly to
the device via network after retrieving its address from usbmuxd
| -rw-r--r-- | src/idevice.c | 83 |
1 files changed, 76 insertions, 7 deletions
diff --git a/src/idevice.c b/src/idevice.c index 0a62907..418ee86 100644 --- a/src/idevice.c +++ b/src/idevice.c | |||
| @@ -421,7 +421,7 @@ LIBIMOBILEDEVICE_API idevice_error_t idevice_connect(idevice_t device, uint16_t | |||
| 421 | return IDEVICE_E_INVALID_ARG; | 421 | return IDEVICE_E_INVALID_ARG; |
| 422 | } | 422 | } |
| 423 | 423 | ||
| 424 | if (device->conn_type == CONNECTION_USBMUXD || device->conn_type == CONNECTION_NETWORK) { | 424 | if (device->conn_type == CONNECTION_USBMUXD) { |
| 425 | int sfd = usbmuxd_connect(device->mux_id, port); | 425 | int sfd = usbmuxd_connect(device->mux_id, port); |
| 426 | if (sfd < 0) { | 426 | if (sfd < 0) { |
| 427 | debug_info("ERROR: Connecting to usbmuxd failed: %d (%s)", sfd, strerror(-sfd)); | 427 | debug_info("ERROR: Connecting to usbmuxd failed: %d (%s)", sfd, strerror(-sfd)); |
| @@ -434,6 +434,45 @@ LIBIMOBILEDEVICE_API idevice_error_t idevice_connect(idevice_t device, uint16_t | |||
| 434 | new_connection->device = device; | 434 | new_connection->device = device; |
| 435 | *connection = new_connection; | 435 | *connection = new_connection; |
| 436 | return IDEVICE_E_SUCCESS; | 436 | return IDEVICE_E_SUCCESS; |
| 437 | } else if (device->conn_type == CONNECTION_NETWORK) { | ||
| 438 | unsigned char saddr_[32]; | ||
| 439 | memset(saddr_, '\0', sizeof(saddr_)); | ||
| 440 | struct sockaddr* saddr = (struct sockaddr*)&saddr_[0]; | ||
| 441 | if (((char*)device->conn_data)[1] == 0x02) { // AF_INET | ||
| 442 | saddr->sa_family = AF_INET; | ||
| 443 | memcpy(&saddr->sa_data[0], (char*)device->conn_data+2, 14); | ||
| 444 | } | ||
| 445 | else if (((char*)device->conn_data)[1] == 0x1E) { //AF_INET6 (bsd) | ||
| 446 | #ifdef AF_INET6 | ||
| 447 | saddr->sa_family = AF_INET6; | ||
| 448 | memcpy(&saddr->sa_data[0], (char*)device->conn_data+2, 26); | ||
| 449 | #else | ||
| 450 | debug_info("ERROR: Got an IPv6 address but this system doesn't support IPv6"); | ||
| 451 | return IDEVICE_E_UNKNOWN_ERROR; | ||
| 452 | #endif | ||
| 453 | } | ||
| 454 | else { | ||
| 455 | debug_info("Unsupported address family 0x%02x", ((char*)device->conn_data)[1]); | ||
| 456 | return IDEVICE_E_UNKNOWN_ERROR; | ||
| 457 | } | ||
| 458 | char addrtxt[48]; | ||
| 459 | addrtxt[0] = '\0'; | ||
| 460 | if (!socket_addr_to_string(saddr, addrtxt, sizeof(addrtxt))) { | ||
| 461 | debug_info("Failed to convert network address: %d (%s)", errno, strerror(errno)); | ||
| 462 | } | ||
| 463 | debug_info("Connecting to %s port %d...", addrtxt, port); | ||
| 464 | int sfd = socket_connect_addr(saddr, port); | ||
| 465 | if (sfd < 0) { | ||
| 466 | debug_info("ERROR: Connecting to network device failed: %d (%s)", errno, strerror(errno)); | ||
| 467 | return IDEVICE_E_NO_DEVICE; | ||
| 468 | } | ||
| 469 | idevice_connection_t new_connection = (idevice_connection_t)malloc(sizeof(struct idevice_connection_private)); | ||
| 470 | new_connection->type = CONNECTION_NETWORK; | ||
| 471 | new_connection->data = (void*)(long)sfd; | ||
| 472 | new_connection->ssl_data = NULL; | ||
| 473 | new_connection->device = device; | ||
| 474 | *connection = new_connection; | ||
| 475 | return IDEVICE_E_SUCCESS; | ||
| 437 | } else { | 476 | } else { |
| 438 | debug_info("Unknown connection type %d", device->conn_type); | 477 | debug_info("Unknown connection type %d", device->conn_type); |
| 439 | } | 478 | } |
| @@ -451,10 +490,14 @@ LIBIMOBILEDEVICE_API idevice_error_t idevice_disconnect(idevice_connection_t con | |||
| 451 | idevice_connection_disable_ssl(connection); | 490 | idevice_connection_disable_ssl(connection); |
| 452 | } | 491 | } |
| 453 | idevice_error_t result = IDEVICE_E_UNKNOWN_ERROR; | 492 | idevice_error_t result = IDEVICE_E_UNKNOWN_ERROR; |
| 454 | if (connection->type == CONNECTION_USBMUXD || connection->type == CONNECTION_NETWORK) { | 493 | if (connection->type == CONNECTION_USBMUXD) { |
| 455 | usbmuxd_disconnect((int)(long)connection->data); | 494 | usbmuxd_disconnect((int)(long)connection->data); |
| 456 | connection->data = NULL; | 495 | connection->data = NULL; |
| 457 | result = IDEVICE_E_SUCCESS; | 496 | result = IDEVICE_E_SUCCESS; |
| 497 | } else if (connection->type == CONNECTION_NETWORK) { | ||
| 498 | socket_close((int)(long)connection->data); | ||
| 499 | connection->data = NULL; | ||
| 500 | result = IDEVICE_E_SUCCESS; | ||
| 458 | } else { | 501 | } else { |
| 459 | debug_info("Unknown connection type %d", connection->type); | 502 | debug_info("Unknown connection type %d", connection->type); |
| 460 | } | 503 | } |
| @@ -474,13 +517,21 @@ static idevice_error_t internal_connection_send(idevice_connection_t connection, | |||
| 474 | return IDEVICE_E_INVALID_ARG; | 517 | return IDEVICE_E_INVALID_ARG; |
| 475 | } | 518 | } |
| 476 | 519 | ||
| 477 | if (connection->type == CONNECTION_USBMUXD || connection->type == CONNECTION_NETWORK) { | 520 | if (connection->type == CONNECTION_USBMUXD) { |
| 478 | int res = usbmuxd_send((int)(long)connection->data, data, len, sent_bytes); | 521 | int res = usbmuxd_send((int)(long)connection->data, data, len, sent_bytes); |
| 479 | if (res < 0) { | 522 | if (res < 0) { |
| 480 | debug_info("ERROR: usbmuxd_send returned %d (%s)", res, strerror(-res)); | 523 | debug_info("ERROR: usbmuxd_send returned %d (%s)", res, strerror(-res)); |
| 481 | return IDEVICE_E_UNKNOWN_ERROR; | 524 | return IDEVICE_E_UNKNOWN_ERROR; |
| 482 | } | 525 | } |
| 483 | return IDEVICE_E_SUCCESS; | 526 | return IDEVICE_E_SUCCESS; |
| 527 | } else if (connection->type == CONNECTION_NETWORK) { | ||
| 528 | int s = socket_send((int)(long)connection->data, (void*)data, len); | ||
| 529 | if (s < 0) { | ||
| 530 | *sent_bytes = 0; | ||
| 531 | return IDEVICE_E_UNKNOWN_ERROR; | ||
| 532 | } | ||
| 533 | *sent_bytes = s; | ||
| 534 | return IDEVICE_E_SUCCESS; | ||
| 484 | } else { | 535 | } else { |
| 485 | debug_info("Unknown connection type %d", connection->type); | 536 | debug_info("Unknown connection type %d", connection->type); |
| 486 | } | 537 | } |
| @@ -545,7 +596,7 @@ static idevice_error_t internal_connection_receive_timeout(idevice_connection_t | |||
| 545 | return IDEVICE_E_INVALID_ARG; | 596 | return IDEVICE_E_INVALID_ARG; |
| 546 | } | 597 | } |
| 547 | 598 | ||
| 548 | if (connection->type == CONNECTION_USBMUXD || connection->type == CONNECTION_NETWORK) { | 599 | if (connection->type == CONNECTION_USBMUXD) { |
| 549 | int conn_error = usbmuxd_recv_timeout((int)(long)connection->data, data, len, recv_bytes, timeout); | 600 | int conn_error = usbmuxd_recv_timeout((int)(long)connection->data, data, len, recv_bytes, timeout); |
| 550 | idevice_error_t error = socket_recv_to_idevice_error(conn_error, len, *recv_bytes); | 601 | idevice_error_t error = socket_recv_to_idevice_error(conn_error, len, *recv_bytes); |
| 551 | 602 | ||
| @@ -554,6 +605,14 @@ static idevice_error_t internal_connection_receive_timeout(idevice_connection_t | |||
| 554 | } | 605 | } |
| 555 | 606 | ||
| 556 | return error; | 607 | return error; |
| 608 | } else if (connection->type == CONNECTION_NETWORK) { | ||
| 609 | int res = socket_receive_timeout((int)(long)connection->data, data, len, 0, timeout); | ||
| 610 | if (res < 0) { | ||
| 611 | debug_info("ERROR: socket_receive_timeout failed: %d (%s)", res, strerror(-res)); | ||
| 612 | return (res == -EAGAIN ? IDEVICE_E_NOT_ENOUGH_DATA : IDEVICE_E_UNKNOWN_ERROR); | ||
| 613 | } | ||
| 614 | *recv_bytes = (uint32_t)res; | ||
| 615 | return IDEVICE_E_SUCCESS; | ||
| 557 | } else { | 616 | } else { |
| 558 | debug_info("Unknown connection type %d", connection->type); | 617 | debug_info("Unknown connection type %d", connection->type); |
| 559 | } | 618 | } |
| @@ -630,13 +689,20 @@ static idevice_error_t internal_connection_receive(idevice_connection_t connecti | |||
| 630 | return IDEVICE_E_INVALID_ARG; | 689 | return IDEVICE_E_INVALID_ARG; |
| 631 | } | 690 | } |
| 632 | 691 | ||
| 633 | if (connection->type == CONNECTION_USBMUXD || connection->type == CONNECTION_NETWORK) { | 692 | if (connection->type == CONNECTION_USBMUXD) { |
| 634 | int res = usbmuxd_recv((int)(long)connection->data, data, len, recv_bytes); | 693 | int res = usbmuxd_recv((int)(long)connection->data, data, len, recv_bytes); |
| 635 | if (res < 0) { | 694 | if (res < 0) { |
| 636 | debug_info("ERROR: usbmuxd_recv returned %d (%s)", res, strerror(-res)); | 695 | debug_info("ERROR: usbmuxd_recv returned %d (%s)", res, strerror(-res)); |
| 637 | return IDEVICE_E_UNKNOWN_ERROR; | 696 | return IDEVICE_E_UNKNOWN_ERROR; |
| 638 | } | 697 | } |
| 639 | 698 | return IDEVICE_E_SUCCESS; | |
| 699 | } else if (connection->type == CONNECTION_NETWORK) { | ||
| 700 | int res = socket_receive((int)(long)connection->data, data, len); | ||
| 701 | if (res < 0) { | ||
| 702 | debug_info("ERROR: socket_receive returned %d (%s)", res, strerror(-res)); | ||
| 703 | return IDEVICE_E_UNKNOWN_ERROR; | ||
| 704 | } | ||
| 705 | *recv_bytes = (uint32_t)res; | ||
| 640 | return IDEVICE_E_SUCCESS; | 706 | return IDEVICE_E_SUCCESS; |
| 641 | } else { | 707 | } else { |
| 642 | debug_info("Unknown connection type %d", connection->type); | 708 | debug_info("Unknown connection type %d", connection->type); |
| @@ -674,7 +740,10 @@ LIBIMOBILEDEVICE_API idevice_error_t idevice_connection_get_fd(idevice_connectio | |||
| 674 | } | 740 | } |
| 675 | 741 | ||
| 676 | idevice_error_t result = IDEVICE_E_UNKNOWN_ERROR; | 742 | idevice_error_t result = IDEVICE_E_UNKNOWN_ERROR; |
| 677 | if (connection->type == CONNECTION_USBMUXD || connection->type == CONNECTION_NETWORK) { | 743 | if (connection->type == CONNECTION_USBMUXD) { |
| 744 | *fd = (int)(long)connection->data; | ||
| 745 | result = IDEVICE_E_SUCCESS; | ||
| 746 | } else if (connection->type == CONNECTION_NETWORK) { | ||
| 678 | *fd = (int)(long)connection->data; | 747 | *fd = (int)(long)connection->data; |
| 679 | result = IDEVICE_E_SUCCESS; | 748 | result = IDEVICE_E_SUCCESS; |
| 680 | } else { | 749 | } else { |
