summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/idevicesyslog.c84
1 files changed, 79 insertions, 5 deletions
diff --git a/tools/idevicesyslog.c b/tools/idevicesyslog.c
index 67eaf69..830b76a 100644
--- a/tools/idevicesyslog.c
+++ b/tools/idevicesyslog.c
@@ -542,12 +542,69 @@ static void ostrace_syslog_callback(const void* buf, size_t len, void* user_data
542 } 542 }
543} 543}
544 544
545static plist_t get_pid_list()
546{
547 plist_t list = NULL;
548 ostrace_client_t ostrace_tmp = NULL;
549 ostrace_client_start_service(device, &ostrace_tmp, TOOL_NAME);
550 if (ostrace_tmp) {
551 ostrace_get_pid_list(ostrace_tmp, &list);
552 ostrace_client_free(ostrace_tmp);
553 }
554 return list;
555}
556
557static int pid_valid(int pid)
558{
559 plist_t list = get_pid_list();
560 if (!list) return 0;
561 char valbuf[16];
562 snprintf(valbuf, 16, "%d", pid);
563 return (plist_dict_get_item(list, valbuf)) ? 1 : 0;
564}
565
566static int pid_for_proc(const char* procname)
567{
568 int result = -1;
569 plist_t list = get_pid_list();
570 if (!list) {
571 return result;
572 }
573 plist_dict_iter iter = NULL;
574 plist_dict_new_iter(list, &iter);
575 if (iter) {
576 plist_t node = NULL;
577 do {
578 char* key = NULL;
579 node = NULL;
580 plist_dict_next_item(list, iter, &key, &node);
581 if (!key) {
582 break;
583 }
584 if (PLIST_IS_DICT(node)) {
585 plist_t pname = plist_dict_get_item(node, "ProcessName");
586 if (PLIST_IS_STRING(pname)) {
587 if (!strcmp(plist_get_string_ptr(pname, NULL), procname)) {
588 result = (int)strtol(key, NULL, 10);
589 }
590 }
591 }
592 free(key);
593 } while (node);
594 plist_mem_free(iter);
595 }
596 plist_free(list);
597 return result;
598}
599
545static int connect_service(int ostrace_required) 600static int connect_service(int ostrace_required)
546{ 601{
547 idevice_error_t ret = idevice_new_with_options(&device, udid, (use_network) ? IDEVICE_LOOKUP_NETWORK : IDEVICE_LOOKUP_USBMUX); 602 if (!device) {
548 if (ret != IDEVICE_E_SUCCESS) { 603 idevice_error_t ret = idevice_new_with_options(&device, udid, (use_network) ? IDEVICE_LOOKUP_NETWORK : IDEVICE_LOOKUP_USBMUX);
549 fprintf(stderr, "Device with udid %s not found!?\n", udid); 604 if (ret != IDEVICE_E_SUCCESS) {
550 return -1; 605 fprintf(stderr, "Device with udid %s not found!?\n", udid);
606 return -1;
607 }
551 } 608 }
552 609
553 lockdownd_client_t lockdown = NULL; 610 lockdownd_client_t lockdown = NULL;
@@ -628,7 +685,24 @@ static int start_logging(void)
628 685
629 /* start capturing syslog */ 686 /* start capturing syslog */
630 if (ostrace) { 687 if (ostrace) {
631 ostrace_error_t serr = ostrace_start_activity(ostrace, NULL, ostrace_syslog_callback, NULL); 688 plist_t options = plist_new_dict();
689 if (num_proc_filters == 0 && num_pid_filters == 1 && !proc_filter_excluding) {
690 if (pid_filters[0] > 0) {
691 if (!pid_valid(pid_filters[0])) {
692 fprintf(stderr, "NOTE: A process with pid doesn't exists!\n");
693 }
694 }
695 plist_dict_set_item(options, "Pid", plist_new_int(pid_filters[0]));
696 } else if (num_proc_filters == 1 && num_pid_filters == 0 && !proc_filter_excluding) {
697 int pid = pid_for_proc(proc_filters[0]);
698 if (!strcmp(proc_filters[0], "kernel")) {
699 pid = 0;
700 }
701 if (pid >= 0) {
702 plist_dict_set_item(options, "Pid", plist_new_int(pid));
703 }
704 }
705 ostrace_error_t serr = ostrace_start_activity(ostrace, options, ostrace_syslog_callback, NULL);
632 if (serr != OSTRACE_E_SUCCESS) { 706 if (serr != OSTRACE_E_SUCCESS) {
633 fprintf(stderr, "ERROR: Unable to start capturing syslog.\n"); 707 fprintf(stderr, "ERROR: Unable to start capturing syslog.\n");
634 ostrace_client_free(ostrace); 708 ostrace_client_free(ostrace);