From 25ffa16730ddc1c2a3eae5df2b0223654cad5408 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Wed, 3 Feb 2021 21:22:31 +0100 Subject: tools: Fix delays in idevicedebugserverproxy when using SSL Turns out using select() wasn't the best idea for the debugserver connection. libimobildevice already does select internally, and doing it here again would cause delays especially when transferring larger amounts of data. --- tools/idevicedebugserverproxy.c | 46 ++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 23 deletions(-) (limited to 'tools') diff --git a/tools/idevicedebugserverproxy.c b/tools/idevicedebugserverproxy.c index 035a231..37d03ea 100644 --- a/tools/idevicedebugserverproxy.c +++ b/tools/idevicedebugserverproxy.c @@ -91,19 +91,12 @@ static void print_usage(int argc, char **argv) printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n"); } -struct service_client_private { - idevice_connection_t connection; -}; -struct debugserver_client_private { - struct service_client_private* parent; - int noack_mode; -}; - static void* connection_handler(void* data) { debugserver_error_t derr = DEBUGSERVER_E_SUCCESS; socket_info_t* socket_info = (socket_info_t*)data; - char buf[4096]; + const int bufsize = 65536; + char* buf; int client_fd = socket_info->client_fd; @@ -114,30 +107,29 @@ static void* connection_handler(void* data) fprintf(stderr, "Could not start debugserver on device!\nPlease make sure to mount a developer disk image first.\n"); return NULL; } - int dbgsvr_fd = -1; - idevice_connection_get_fd(socket_info->debugserver_client->parent->connection, &dbgsvr_fd); - if (dbgsvr_fd == -1) { - fprintf(stderr, "Could not get debugserver connection fd.\n"); + + buf = malloc(bufsize); + if (!buf) { + fprintf(stderr, "Failed to allocate buffer\n"); return NULL; } fd_set fds; - int maxfd = 0; FD_ZERO(&fds); FD_SET(client_fd, &fds); - if (client_fd > maxfd) maxfd = client_fd; - FD_SET(dbgsvr_fd, &fds); - if (dbgsvr_fd > maxfd) maxfd = dbgsvr_fd; + + int dtimeout = 1; while (!quit_flag) { fd_set read_fds = fds; - int ret_sel = select(maxfd+1, &read_fds, NULL, NULL, NULL); + struct timeval tv = { 0, 1000 }; + int ret_sel = select(client_fd+1, &read_fds, NULL, NULL, &tv); if (ret_sel < 0) { perror("select"); break; } if (FD_ISSET(client_fd, &read_fds)) { - ssize_t n = socket_receive(client_fd, buf, sizeof(buf)); + ssize_t n = socket_receive(client_fd, buf, bufsize); if (n < 0) { fprintf(stderr, "Failed to read from client fd: %s\n", strerror(-n)); break; @@ -149,17 +141,25 @@ static void* connection_handler(void* data) uint32_t sent = 0; debugserver_client_send(socket_info->debugserver_client, buf, n, &sent); } - if (FD_ISSET(dbgsvr_fd, &read_fds)) { + do { uint32_t r = 0; - derr = debugserver_client_receive_with_timeout(socket_info->debugserver_client, buf, sizeof(buf), &r, 1); + derr = debugserver_client_receive_with_timeout(socket_info->debugserver_client, buf, bufsize, &r, dtimeout); if (r > 0) { socket_send(client_fd, buf, r); - } else if (derr != DEBUGSERVER_E_TIMEOUT) { - fprintf(stderr, "Failed to read from debugserver (%d)\n", derr); + dtimeout = 1; + } else if (derr == DEBUGSERVER_E_TIMEOUT) { + dtimeout = 5; + break; + } else { + fprintf(stderr, "debugserver connection closed\n"); break; } + } while (derr == DEBUGSERVER_E_SUCCESS); + if (derr != DEBUGSERVER_E_TIMEOUT && derr != DEBUGSERVER_E_SUCCESS) { + break; } } + free(buf); debug("%s: shutting down...\n", __func__); -- cgit v1.1-32-gdbae