aboutsummaryrefslogtreecommitdiffstats
path: root/trace-capture.c
diff options
context:
space:
mode:
Diffstat (limited to 'trace-capture.c')
-rw-r--r--trace-capture.c58
1 files changed, 57 insertions, 1 deletions
diff --git a/trace-capture.c b/trace-capture.c
index b5e8852..27ae757 100644
--- a/trace-capture.c
+++ b/trace-capture.c
@@ -274,6 +274,51 @@ static int calculate_trace_cmd_words(struct trace_capture *cap)
274 return words; 274 return words;
275} 275}
276 276
277static char *find_tracecmd(void)
278{
279 struct stat st;
280 char *path = getenv("PATH");
281 char *saveptr;
282 char *str;
283 char *loc;
284 char *tracecmd = NULL;
285 int len;
286 int ret;
287
288 if (!path)
289 return NULL;
290
291 path = strdup(path);
292
293 for (str = path; ; str = NULL) {
294 loc = strtok_r(str, ":", &saveptr);
295 if (!loc)
296 break;
297 len = strlen(loc) + 11;
298 tracecmd = malloc_or_die(len);
299 snprintf(tracecmd, len, "%s/trace-cmd", loc);
300 ret = stat(tracecmd, &st);
301
302 if (ret >= 0 && S_ISREG(st.st_mode)) {
303 /* Do we have execute permissions */
304 if (st.st_uid == geteuid() &&
305 st.st_mode & S_IXUSR)
306 break;
307 if (st.st_gid == getegid() &&
308 st.st_mode & S_IXGRP)
309 break;
310 if (st.st_mode & S_IXOTH)
311 break;
312 }
313
314 free(tracecmd);
315 tracecmd = NULL;
316 }
317 free(path);
318
319 return tracecmd;
320}
321
277static int add_trace_cmd_words(struct trace_capture *cap, char **args) 322static int add_trace_cmd_words(struct trace_capture *cap, char **args)
278{ 323{
279 struct event_format *event; 324 struct event_format *event;
@@ -286,7 +331,10 @@ static int add_trace_cmd_words(struct trace_capture *cap, char **args)
286 331
287 output = gtk_entry_get_text(GTK_ENTRY(cap->file_entry)); 332 output = gtk_entry_get_text(GTK_ENTRY(cap->file_entry));
288 333
289 args[words++] = strdup("trace-cmd"); 334 args[words++] = find_tracecmd();
335 if (!args[0])
336 return -1;
337
290 args[words++] = strdup("record"); 338 args[words++] = strdup("record");
291 args[words++] = strdup("-o"); 339 args[words++] = strdup("-o");
292 args[words++] = strdup(output); 340 args[words++] = strdup(output);
@@ -706,6 +754,14 @@ static void execute_button_clicked(GtkWidget *widget, gpointer data)
706 GtkWidget *dialog; 754 GtkWidget *dialog;
707 GtkWidget *label; 755 GtkWidget *label;
708 const char *filename; 756 const char *filename;
757 char *tracecmd;
758
759 tracecmd = find_tracecmd();
760 if (!tracecmd) {
761 warning("trace-cmd not found in path");
762 return;
763 }
764 free(tracecmd);
709 765
710 filename = gtk_entry_get_text(GTK_ENTRY(cap->file_entry)); 766 filename = gtk_entry_get_text(GTK_ENTRY(cap->file_entry));
711 767