summaryrefslogtreecommitdiffstats
path: root/tools/idevicedebugserverproxy.c
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/idevicedebugserverproxy.c
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/idevicedebugserverproxy.c')
-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)
91 printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n"); 91 printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n");
92} 92}
93 93
94struct service_client_private {
95 idevice_connection_t connection;
96};
97struct debugserver_client_private {
98 struct service_client_private* parent;
99 int noack_mode;
100};
101
102static void* connection_handler(void* data) 94static void* connection_handler(void* data)
103{ 95{
104 debugserver_error_t derr = DEBUGSERVER_E_SUCCESS; 96 debugserver_error_t derr = DEBUGSERVER_E_SUCCESS;
105 socket_info_t* socket_info = (socket_info_t*)data; 97 socket_info_t* socket_info = (socket_info_t*)data;
106 char buf[4096]; 98 const int bufsize = 65536;
99 char* buf;
107 100
108 int client_fd = socket_info->client_fd; 101 int client_fd = socket_info->client_fd;
109 102
@@ -114,30 +107,29 @@ static void* connection_handler(void* data)
114 fprintf(stderr, "Could not start debugserver on device!\nPlease make sure to mount a developer disk image first.\n"); 107 fprintf(stderr, "Could not start debugserver on device!\nPlease make sure to mount a developer disk image first.\n");
115 return NULL; 108 return NULL;
116 } 109 }
117 int dbgsvr_fd = -1; 110
118 idevice_connection_get_fd(socket_info->debugserver_client->parent->connection, &dbgsvr_fd); 111 buf = malloc(bufsize);
119 if (dbgsvr_fd == -1) { 112 if (!buf) {
120 fprintf(stderr, "Could not get debugserver connection fd.\n"); 113 fprintf(stderr, "Failed to allocate buffer\n");
121 return NULL; 114 return NULL;
122 } 115 }
123 116
124 fd_set fds; 117 fd_set fds;
125 int maxfd = 0;
126 FD_ZERO(&fds); 118 FD_ZERO(&fds);
127 FD_SET(client_fd, &fds); 119 FD_SET(client_fd, &fds);
128 if (client_fd > maxfd) maxfd = client_fd; 120
129 FD_SET(dbgsvr_fd, &fds); 121 int dtimeout = 1;
130 if (dbgsvr_fd > maxfd) maxfd = dbgsvr_fd;
131 122
132 while (!quit_flag) { 123 while (!quit_flag) {
133 fd_set read_fds = fds; 124 fd_set read_fds = fds;
134 int ret_sel = select(maxfd+1, &read_fds, NULL, NULL, NULL); 125 struct timeval tv = { 0, 1000 };
126 int ret_sel = select(client_fd+1, &read_fds, NULL, NULL, &tv);
135 if (ret_sel < 0) { 127 if (ret_sel < 0) {
136 perror("select"); 128 perror("select");
137 break; 129 break;
138 } 130 }
139 if (FD_ISSET(client_fd, &read_fds)) { 131 if (FD_ISSET(client_fd, &read_fds)) {
140 ssize_t n = socket_receive(client_fd, buf, sizeof(buf)); 132 ssize_t n = socket_receive(client_fd, buf, bufsize);
141 if (n < 0) { 133 if (n < 0) {
142 fprintf(stderr, "Failed to read from client fd: %s\n", strerror(-n)); 134 fprintf(stderr, "Failed to read from client fd: %s\n", strerror(-n));
143 break; 135 break;
@@ -149,17 +141,25 @@ static void* connection_handler(void* data)
149 uint32_t sent = 0; 141 uint32_t sent = 0;
150 debugserver_client_send(socket_info->debugserver_client, buf, n, &sent); 142 debugserver_client_send(socket_info->debugserver_client, buf, n, &sent);
151 } 143 }
152 if (FD_ISSET(dbgsvr_fd, &read_fds)) { 144 do {
153 uint32_t r = 0; 145 uint32_t r = 0;
154 derr = debugserver_client_receive_with_timeout(socket_info->debugserver_client, buf, sizeof(buf), &r, 1); 146 derr = debugserver_client_receive_with_timeout(socket_info->debugserver_client, buf, bufsize, &r, dtimeout);
155 if (r > 0) { 147 if (r > 0) {
156 socket_send(client_fd, buf, r); 148 socket_send(client_fd, buf, r);
157 } else if (derr != DEBUGSERVER_E_TIMEOUT) { 149 dtimeout = 1;
158 fprintf(stderr, "Failed to read from debugserver (%d)\n", derr); 150 } else if (derr == DEBUGSERVER_E_TIMEOUT) {
151 dtimeout = 5;
152 break;
153 } else {
154 fprintf(stderr, "debugserver connection closed\n");
159 break; 155 break;
160 } 156 }
157 } while (derr == DEBUGSERVER_E_SUCCESS);
158 if (derr != DEBUGSERVER_E_TIMEOUT && derr != DEBUGSERVER_E_SUCCESS) {
159 break;
161 } 160 }
162 } 161 }
162 free(buf);
163 163
164 debug("%s: shutting down...\n", __func__); 164 debug("%s: shutting down...\n", __func__);
165 165