diff options
| author | 2020-02-11 14:45:46 -0500 | |
|---|---|---|
| committer | 2022-03-29 12:11:18 +0200 | |
| commit | 2f1e0660ef0a3dcfa35c8003b0806bae3acd411d (patch) | |
| tree | 75fdfa5356f92dbae0b71bb7d308a6a8be64db63 /src | |
| parent | 66a56a1e37e6df108c8dbcd99b7f60dec1fe4622 (diff) | |
| download | libimobiledevice-2f1e0660ef0a3dcfa35c8003b0806bae3acd411d.tar.gz libimobiledevice-2f1e0660ef0a3dcfa35c8003b0806bae3acd411d.tar.bz2 | |
Add timeout and interrupt handling to debugserver. Fix debugserver_client_handle_response
Diffstat (limited to 'src')
| -rw-r--r-- | src/debugserver.c | 25 | ||||
| -rw-r--r-- | src/debugserver.h | 2 |
2 files changed, 24 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 | ||
| 163 | LIBIMOBILEDEVICE_API debugserver_error_t debugserver_client_receive(debugserver_client_t client, char* data, uint32_t size, uint32_t *received) | 165 | LIBIMOBILEDEVICE_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 | ||
| 168 | LIBIMOBILEDEVICE_API debugserver_error_t debugserver_command_new(const char* name, int argc, char* argv[], debugserver_command_t* command) | 174 | LIBIMOBILEDEVICE_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 | ||
| 364 | LIBIMOBILEDEVICE_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 | |||
| 358 | static int debugserver_client_receive_internal_check(debugserver_client_t client, char* received_char) | 377 | static 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; |
diff --git a/src/debugserver.h b/src/debugserver.h index 05cd97b..ee3ba62 100644 --- a/src/debugserver.h +++ b/src/debugserver.h | |||
| @@ -30,6 +30,8 @@ | |||
| 30 | struct debugserver_client_private { | 30 | struct debugserver_client_private { |
| 31 | service_client_t parent; | 31 | service_client_t parent; |
| 32 | int noack_mode; | 32 | int noack_mode; |
| 33 | int (*cancel_receive)(); | ||
| 34 | int receive_loop_timeout; | ||
| 33 | }; | 35 | }; |
| 34 | 36 | ||
| 35 | struct debugserver_command_private { | 37 | struct debugserver_command_private { |
