summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2021-02-03 21:22:31 +0100
committerGravatar Nikias Bassen2021-02-03 21:22:31 +0100
commit25ffa16730ddc1c2a3eae5df2b0223654cad5408 (patch)
treeab9ee1b666a346204a4278a03d5174cfe09dcb5d /tools
parent086e24e3808b7042532ea3d02c519da30f025728 (diff)
downloadlibimobiledevice-25ffa16730ddc1c2a3eae5df2b0223654cad5408.tar.gz
libimobiledevice-25ffa16730ddc1c2a3eae5df2b0223654cad5408.tar.bz2
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.
Diffstat (limited to 'tools')
-rw-r--r--tools/idevicedebugserverproxy.c46
1 files changed, 23 insertions, 23 deletions
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__);