struct tracing_data *tracing_data_get(struct list_head *pattrs, int fd, bool temp) { struct tracepoint_path *tps; struct tracing_data *tdata; output_fd = fd; tps = get_tracepoints_path(pattrs); if (!tps) return NULL; tdata = malloc_or_die(sizeof(*tdata)); tdata->temp = temp; tdata->size = 0; if (temp) { int temp_fd; snprintf(tdata->temp_file, sizeof(tdata->temp_file), "/tmp/perf-XXXXXX"); if (!mkstemp(tdata->temp_file)) die("Can't make temp file"); temp_fd = open(tdata->temp_file, O_RDWR); if (temp_fd < 0) die("Can't read '%s'", tdata->temp_file); /* * Set the temp file the default output, so all the * tracing data are stored into it. */ output_fd = temp_fd; } tracing_data_header(); read_header_files(); read_ftrace_files(tps); read_event_files(tps); read_proc_kallsyms(); read_ftrace_printk(); /* * All tracing data are stored by now, we can restore * the default output file in case we used temp file. */ if (temp) { tdata->size = lseek(output_fd, 0, SEEK_CUR); close(output_fd); output_fd = fd; } put_tracepoints_path(tps); return tdata; }
int read_tracing_data(int fd, struct list_head *pattrs) { char buf[BUFSIZ]; struct tracepoint_path *tps = get_tracepoints_path(pattrs); /* * What? No tracepoints? No sense writing anything here, bail out. */ if (tps == NULL) return -1; output_fd = fd; buf[0] = 23; buf[1] = 8; buf[2] = 68; memcpy(buf + 3, "tracing", 7); write_or_die(buf, 10); write_or_die(VERSION, strlen(VERSION) + 1); /* save endian */ if (bigendian()) buf[0] = 1; else buf[0] = 0; write_or_die(buf, 1); /* save size of long */ buf[0] = sizeof(long); write_or_die(buf, 1); /* save page_size */ page_size = sysconf(_SC_PAGESIZE); write_or_die(&page_size, 4); read_header_files(); read_ftrace_files(tps); read_event_files(tps); read_proc_kallsyms(); #ifdef CONFIG_DEBUG_PRINTK read_ftrace_printk(); #else read_ftrace_; #endif return 0; }