summaryrefslogtreecommitdiffstats
path: root/src/debugserver.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/debugserver.c')
-rw-r--r--src/debugserver.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/debugserver.c b/src/debugserver.c
index 46686f6..20ffe01 100644
--- a/src/debugserver.c
+++ b/src/debugserver.c
@@ -89,6 +89,8 @@ LIBIMOBILEDEVICE_API debugserver_error_t debugserver_client_new(idevice_t device
89 debugserver_client_t client_loc = (debugserver_client_t) malloc(sizeof(struct debugserver_client_private)); 89 debugserver_client_t client_loc = (debugserver_client_t) malloc(sizeof(struct debugserver_client_private));
90 client_loc->parent = parent; 90 client_loc->parent = parent;
91 client_loc->noack_mode = 0; 91 client_loc->noack_mode = 0;
92 client_loc->cancel_receive = NULL;
93 client_loc->receive_loop_timeout = 1000;
92 94
93 *client = client_loc; 95 *client = client_loc;
94 96
@@ -150,7 +152,7 @@ LIBIMOBILEDEVICE_API debugserver_error_t debugserver_client_receive_with_timeout
150 } 152 }
151 153
152 res = debugserver_error(service_receive_with_timeout(client->parent, data, size, (uint32_t*)&bytes, timeout)); 154 res = debugserver_error(service_receive_with_timeout(client->parent, data, size, (uint32_t*)&bytes, timeout));
153 if (bytes <= 0) { 155 if (bytes <= 0 && res != DEBUGSERVER_E_TIMEOUT) {
154 debug_info("Could not read data, error %d", res); 156 debug_info("Could not read data, error %d", res);
155 } 157 }
156 if (received) { 158 if (received) {
@@ -162,7 +164,11 @@ LIBIMOBILEDEVICE_API debugserver_error_t debugserver_client_receive_with_timeout
162 164
163LIBIMOBILEDEVICE_API debugserver_error_t debugserver_client_receive(debugserver_client_t client, char* data, uint32_t size, uint32_t *received) 165LIBIMOBILEDEVICE_API debugserver_error_t debugserver_client_receive(debugserver_client_t client, char* data, uint32_t size, uint32_t *received)
164{ 166{
165 return debugserver_client_receive_with_timeout(client, data, size, received, 1000); 167 debugserver_error_t res = DEBUGSERVER_E_UNKNOWN_ERROR;
168 do {
169 res = debugserver_client_receive_with_timeout(client, data, size, received, client->receive_loop_timeout);
170 while (res == DEBUGSERVER_E_TIMEOUT && client->cancel_receive != NULL && !client->cancel_receive());
171 return res;
166} 172}
167 173
168LIBIMOBILEDEVICE_API debugserver_error_t debugserver_command_new(const char* name, int argc, char* argv[], debugserver_command_t* command) 174LIBIMOBILEDEVICE_API debugserver_error_t debugserver_command_new(const char* name, int argc, char* argv[], debugserver_command_t* command)
@@ -355,6 +361,19 @@ LIBIMOBILEDEVICE_API debugserver_error_t debugserver_client_set_ack_mode(debugse
355 return DEBUGSERVER_E_SUCCESS; 361 return DEBUGSERVER_E_SUCCESS;
356} 362}
357 363
364LIBIMOBILEDEVICE_API debugserver_error_t debugserver_client_set_receive_params(debugserver_client_t client, int (*cancel_receive)(), int receive_loop_timeout)
365{
366 if (!client)
367 return DEBUGSERVER_E_INVALID_ARG;
368
369 client->cancel_receive = cancel_receive;
370 client->receive_loop_timeout = receive_loop_timeout;
371
372 debug_info("receive params: cancel_receive %s, receive_loop_timeout %dms", (client->cancel_receive == NULL ? "unset": "set"), client->receive_loop_timeout);
373
374 return DEBUGSERVER_E_SUCCESS;
375}
376
358static int debugserver_client_receive_internal_check(debugserver_client_t client, char* received_char) 377static int debugserver_client_receive_internal_check(debugserver_client_t client, char* received_char)
359{ 378{
360 debugserver_error_t res = DEBUGSERVER_E_SUCCESS; 379 debugserver_error_t res = DEBUGSERVER_E_SUCCESS;
@@ -363,7 +382,7 @@ static int debugserver_client_receive_internal_check(debugserver_client_t client
363 uint32_t bytes = 0; 382 uint32_t bytes = 0;
364 383
365 /* we loop here as we expect an answer */ 384 /* we loop here as we expect an answer */
366 res = debugserver_client_receive_with_timeout(client, &buffer, sizeof(char), &bytes, 1000); 385 res = debugserver_client_receive(client, &buffer, sizeof(char), &bytes);
367 if (res == DEBUGSERVER_E_SUCCESS && received_char[0] != 0) { 386 if (res == DEBUGSERVER_E_SUCCESS && received_char[0] != 0) {
368 if (memcmp(&buffer, received_char, sizeof(char)) == 0) { 387 if (memcmp(&buffer, received_char, sizeof(char)) == 0) {
369 did_receive_char = 1; 388 did_receive_char = 1;