diff options
| -rw-r--r-- | tools/idevicedebug.c | 44 |
1 files changed, 32 insertions, 12 deletions
diff --git a/tools/idevicedebug.c b/tools/idevicedebug.c index a9ef5c6..7b49a46 100644 --- a/tools/idevicedebug.c +++ b/tools/idevicedebug.c | |||
| @@ -108,7 +108,7 @@ static instproxy_error_t instproxy_client_get_object_by_key_from_info_dictionary | |||
| 108 | return INSTPROXY_E_SUCCESS; | 108 | return INSTPROXY_E_SUCCESS; |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | static debugserver_error_t debugserver_client_handle_response(debugserver_client_t client, char** response, int send_reply) | 111 | static debugserver_error_t debugserver_client_handle_response(debugserver_client_t client, char** response, int send_reply, int* exit_status) |
| 112 | { | 112 | { |
| 113 | debugserver_error_t dres = DEBUGSERVER_E_SUCCESS; | 113 | debugserver_error_t dres = DEBUGSERVER_E_SUCCESS; |
| 114 | debugserver_command_t command = NULL; | 114 | debugserver_command_t command = NULL; |
| @@ -149,12 +149,24 @@ static debugserver_error_t debugserver_client_handle_response(debugserver_client | |||
| 149 | 149 | ||
| 150 | dres = DEBUGSERVER_E_UNKNOWN_ERROR; | 150 | dres = DEBUGSERVER_E_UNKNOWN_ERROR; |
| 151 | } else if (r[0] == 'E' || r[0] == 'W') { | 151 | } else if (r[0] == 'E' || r[0] == 'W') { |
| 152 | printf("%s: %s\n", (r[0] == 'E' ? "ERROR": "WARNING") , r + 1); | 152 | debugserver_decode_string(r + 1, strlen(r) - 1, &o); |
| 153 | 153 | /* dogben: 'W' + byte seems to mean "process exited with this status." */ | |
| 154 | if (r[0] == 'W' && strlen(o) == 1) { | ||
| 155 | printf("Exit status: %u\n", o[0]); | ||
| 156 | if (exit_status != NULL) { | ||
| 157 | *exit_status = o[0]; | ||
| 158 | } | ||
| 159 | } else { | ||
| 160 | printf("%s: %s\n", (r[0] == 'E' ? "ERROR": "WARNING") , o); | ||
| 161 | } | ||
| 162 | if (o != NULL) { | ||
| 163 | free(o); | ||
| 164 | o = NULL; | ||
| 165 | } | ||
| 154 | free(*response); | 166 | free(*response); |
| 155 | *response = NULL; | 167 | *response = NULL; |
| 156 | 168 | ||
| 157 | if (!send_reply) | 169 | if (!send_reply || (exit_status != NULL && *exit_status >= 0)) |
| 158 | return dres; | 170 | return dres; |
| 159 | 171 | ||
| 160 | /* send reply */ | 172 | /* send reply */ |
| @@ -229,6 +241,7 @@ int main(int argc, char *argv[]) | |||
| 229 | char* response = NULL; | 241 | char* response = NULL; |
| 230 | debugserver_command_t command = NULL; | 242 | debugserver_command_t command = NULL; |
| 231 | debugserver_error_t dres = DEBUGSERVER_E_UNKNOWN_ERROR; | 243 | debugserver_error_t dres = DEBUGSERVER_E_UNKNOWN_ERROR; |
| 244 | int exit_status = -1; | ||
| 232 | 245 | ||
| 233 | /* map signals */ | 246 | /* map signals */ |
| 234 | signal(SIGINT, on_signal); | 247 | signal(SIGINT, on_signal); |
| @@ -376,7 +389,7 @@ int main(int argc, char *argv[]) | |||
| 376 | command = NULL; | 389 | command = NULL; |
| 377 | if (response) { | 390 | if (response) { |
| 378 | if (strncmp(response, "OK", 2)) { | 391 | if (strncmp(response, "OK", 2)) { |
| 379 | debugserver_client_handle_response(debugserver_client, &response, 0); | 392 | debugserver_client_handle_response(debugserver_client, &response, 0, NULL); |
| 380 | goto cleanup; | 393 | goto cleanup; |
| 381 | } | 394 | } |
| 382 | free(response); | 395 | free(response); |
| @@ -394,7 +407,7 @@ int main(int argc, char *argv[]) | |||
| 394 | command = NULL; | 407 | command = NULL; |
| 395 | if (response) { | 408 | if (response) { |
| 396 | if (strncmp(response, "OK", 2)) { | 409 | if (strncmp(response, "OK", 2)) { |
| 397 | debugserver_client_handle_response(debugserver_client, &response, 0); | 410 | debugserver_client_handle_response(debugserver_client, &response, 0, NULL); |
| 398 | goto cleanup; | 411 | goto cleanup; |
| 399 | } | 412 | } |
| 400 | free(response); | 413 | free(response); |
| @@ -410,7 +423,7 @@ int main(int argc, char *argv[]) | |||
| 410 | command = NULL; | 423 | command = NULL; |
| 411 | if (response) { | 424 | if (response) { |
| 412 | if (strncmp(response, "OK", 2)) { | 425 | if (strncmp(response, "OK", 2)) { |
| 413 | debugserver_client_handle_response(debugserver_client, &response, 0); | 426 | debugserver_client_handle_response(debugserver_client, &response, 0, NULL); |
| 414 | goto cleanup; | 427 | goto cleanup; |
| 415 | } | 428 | } |
| 416 | free(response); | 429 | free(response); |
| @@ -451,7 +464,7 @@ int main(int argc, char *argv[]) | |||
| 451 | command = NULL; | 464 | command = NULL; |
| 452 | if (response) { | 465 | if (response) { |
| 453 | if (strncmp(response, "OK", 2)) { | 466 | if (strncmp(response, "OK", 2)) { |
| 454 | debugserver_client_handle_response(debugserver_client, &response, 0); | 467 | debugserver_client_handle_response(debugserver_client, &response, 0, NULL); |
| 455 | goto cleanup; | 468 | goto cleanup; |
| 456 | } | 469 | } |
| 457 | free(response); | 470 | free(response); |
| @@ -477,7 +490,7 @@ int main(int argc, char *argv[]) | |||
| 477 | command = NULL; | 490 | command = NULL; |
| 478 | if (response) { | 491 | if (response) { |
| 479 | if (strncmp(response, "OK", 2)) { | 492 | if (strncmp(response, "OK", 2)) { |
| 480 | debugserver_client_handle_response(debugserver_client, &response, 0); | 493 | debugserver_client_handle_response(debugserver_client, &response, 0, NULL); |
| 481 | goto cleanup; | 494 | goto cleanup; |
| 482 | } | 495 | } |
| 483 | free(response); | 496 | free(response); |
| @@ -502,9 +515,12 @@ int main(int argc, char *argv[]) | |||
| 502 | if (response) { | 515 | if (response) { |
| 503 | log_debug("response: %s", response); | 516 | log_debug("response: %s", response); |
| 504 | if (strncmp(response, "OK", 2)) { | 517 | if (strncmp(response, "OK", 2)) { |
| 505 | dres = debugserver_client_handle_response(debugserver_client, &response, 1); | 518 | dres = debugserver_client_handle_response(debugserver_client, &response, 1, &exit_status); |
| 506 | } | 519 | } |
| 507 | } | 520 | } |
| 521 | if (exit_status > 0) { | ||
| 522 | goto cleanup; | ||
| 523 | } | ||
| 508 | 524 | ||
| 509 | sleep(1); | 525 | sleep(1); |
| 510 | } | 526 | } |
| @@ -517,7 +533,7 @@ int main(int argc, char *argv[]) | |||
| 517 | command = NULL; | 533 | command = NULL; |
| 518 | if (response) { | 534 | if (response) { |
| 519 | if (strncmp(response, "OK", 2)) { | 535 | if (strncmp(response, "OK", 2)) { |
| 520 | debugserver_client_handle_response(debugserver_client, &response, 0); | 536 | debugserver_client_handle_response(debugserver_client, &response, 0, NULL); |
| 521 | goto cleanup; | 537 | goto cleanup; |
| 522 | } | 538 | } |
| 523 | free(response); | 539 | free(response); |
| @@ -552,5 +568,9 @@ cleanup: | |||
| 552 | if (device) | 568 | if (device) |
| 553 | idevice_free(device); | 569 | idevice_free(device); |
| 554 | 570 | ||
| 555 | return res; | 571 | if (exit_status > 0) { |
| 572 | return exit_status; | ||
| 573 | } else { | ||
| 574 | return res; | ||
| 575 | } | ||
| 556 | } | 576 | } |
