diff options
-rw-r--r-- | tools/perf/builtin-trace.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 1ee1e3006649..2eefb33c9679 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c | |||
@@ -561,6 +561,65 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) | |||
561 | suffix = REPORT_SUFFIX; | 561 | suffix = REPORT_SUFFIX; |
562 | } | 562 | } |
563 | 563 | ||
564 | if (!suffix && argc >= 2 && strncmp(argv[1], "-", strlen("-")) != 0) { | ||
565 | char *record_script_path, *report_script_path; | ||
566 | int live_pipe[2]; | ||
567 | pid_t pid; | ||
568 | |||
569 | record_script_path = get_script_path(argv[1], RECORD_SUFFIX); | ||
570 | if (!record_script_path) { | ||
571 | fprintf(stderr, "record script not found\n"); | ||
572 | return -1; | ||
573 | } | ||
574 | |||
575 | report_script_path = get_script_path(argv[1], REPORT_SUFFIX); | ||
576 | if (!report_script_path) { | ||
577 | fprintf(stderr, "report script not found\n"); | ||
578 | return -1; | ||
579 | } | ||
580 | |||
581 | if (pipe(live_pipe) < 0) { | ||
582 | perror("failed to create pipe"); | ||
583 | exit(-1); | ||
584 | } | ||
585 | |||
586 | pid = fork(); | ||
587 | if (pid < 0) { | ||
588 | perror("failed to fork"); | ||
589 | exit(-1); | ||
590 | } | ||
591 | |||
592 | if (!pid) { | ||
593 | dup2(live_pipe[1], 1); | ||
594 | close(live_pipe[0]); | ||
595 | |||
596 | __argv = malloc(5 * sizeof(const char *)); | ||
597 | __argv[0] = "/bin/sh"; | ||
598 | __argv[1] = record_script_path; | ||
599 | __argv[2] = "-o"; | ||
600 | __argv[3] = "-"; | ||
601 | __argv[4] = NULL; | ||
602 | |||
603 | execvp("/bin/sh", (char **)__argv); | ||
604 | exit(-1); | ||
605 | } | ||
606 | |||
607 | dup2(live_pipe[0], 0); | ||
608 | close(live_pipe[1]); | ||
609 | |||
610 | __argv = malloc((argc + 3) * sizeof(const char *)); | ||
611 | __argv[0] = "/bin/sh"; | ||
612 | __argv[1] = report_script_path; | ||
613 | for (i = 2; i < argc; i++) | ||
614 | __argv[i] = argv[i]; | ||
615 | __argv[i++] = "-i"; | ||
616 | __argv[i++] = "-"; | ||
617 | __argv[i++] = NULL; | ||
618 | |||
619 | execvp("/bin/sh", (char **)__argv); | ||
620 | exit(-1); | ||
621 | } | ||
622 | |||
564 | if (suffix) { | 623 | if (suffix) { |
565 | script_path = get_script_path(argv[2], suffix); | 624 | script_path = get_script_path(argv[2], suffix); |
566 | if (!script_path) { | 625 | if (!script_path) { |