aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-probe.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/builtin-probe.c')
-rw-r--r--tools/perf/builtin-probe.c43
1 files changed, 40 insertions, 3 deletions
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
index ee3d84a7c895..e215ae61b2ae 100644
--- a/tools/perf/builtin-probe.c
+++ b/tools/perf/builtin-probe.c
@@ -85,21 +85,58 @@ static int parse_probe_event(const char *str)
85 return ret; 85 return ret;
86} 86}
87 87
88static int set_target(const char *ptr)
89{
90 int found = 0;
91 const char *buf;
92
93 /*
94 * The first argument after options can be an absolute path
95 * to an executable / library or kernel module.
96 *
97 * TODO: Support relative path, and $PATH, $LD_LIBRARY_PATH,
98 * short module name.
99 */
100 if (!params.target && ptr && *ptr == '/') {
101 params.target = ptr;
102 found = 1;
103 buf = ptr + (strlen(ptr) - 3);
104
105 if (strcmp(buf, ".ko"))
106 params.uprobes = true;
107
108 }
109
110 return found;
111}
112
88static int parse_probe_event_argv(int argc, const char **argv) 113static int parse_probe_event_argv(int argc, const char **argv)
89{ 114{
90 int i, len, ret; 115 int i, len, ret, found_target;
91 char *buf; 116 char *buf;
92 117
118 found_target = set_target(argv[0]);
119 if (found_target && argc == 1)
120 return 0;
121
93 /* Bind up rest arguments */ 122 /* Bind up rest arguments */
94 len = 0; 123 len = 0;
95 for (i = 0; i < argc; i++) 124 for (i = 0; i < argc; i++) {
125 if (i == 0 && found_target)
126 continue;
127
96 len += strlen(argv[i]) + 1; 128 len += strlen(argv[i]) + 1;
129 }
97 buf = zalloc(len + 1); 130 buf = zalloc(len + 1);
98 if (buf == NULL) 131 if (buf == NULL)
99 return -ENOMEM; 132 return -ENOMEM;
100 len = 0; 133 len = 0;
101 for (i = 0; i < argc; i++) 134 for (i = 0; i < argc; i++) {
135 if (i == 0 && found_target)
136 continue;
137
102 len += sprintf(&buf[len], "%s ", argv[i]); 138 len += sprintf(&buf[len], "%s ", argv[i]);
139 }
103 params.mod_events = true; 140 params.mod_events = true;
104 ret = parse_probe_event(buf); 141 ret = parse_probe_event(buf);
105 free(buf); 142 free(buf);