|
@@ -341,6 +341,31 @@ static int read_event_files(struct pevent *pevent)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int read_saved_cmdline(struct pevent *pevent)
|
|
|
+{
|
|
|
+ unsigned long long size;
|
|
|
+ char *buf;
|
|
|
+
|
|
|
+ /* it can have 0 size */
|
|
|
+ size = read8(pevent);
|
|
|
+ if (!size)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ buf = malloc(size + 1);
|
|
|
+ if (buf == NULL)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ if (do_read(buf, size) < 0) {
|
|
|
+ free(buf);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ parse_saved_cmdline(pevent, buf, size);
|
|
|
+
|
|
|
+ free(buf);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
ssize_t trace_report(int fd, struct trace_event *tevent, bool __repipe)
|
|
|
{
|
|
|
char buf[BUFSIZ];
|
|
@@ -379,10 +404,11 @@ ssize_t trace_report(int fd, struct trace_event *tevent, bool __repipe)
|
|
|
return -1;
|
|
|
if (show_version)
|
|
|
printf("version = %s\n", version);
|
|
|
- free(version);
|
|
|
|
|
|
- if (do_read(buf, 1) < 0)
|
|
|
+ if (do_read(buf, 1) < 0) {
|
|
|
+ free(version);
|
|
|
return -1;
|
|
|
+ }
|
|
|
file_bigendian = buf[0];
|
|
|
host_bigendian = bigendian();
|
|
|
|
|
@@ -423,6 +449,11 @@ ssize_t trace_report(int fd, struct trace_event *tevent, bool __repipe)
|
|
|
err = read_ftrace_printk(pevent);
|
|
|
if (err)
|
|
|
goto out;
|
|
|
+ if (atof(version) >= 0.6) {
|
|
|
+ err = read_saved_cmdline(pevent);
|
|
|
+ if (err)
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
|
|
|
size = trace_data_size;
|
|
|
repipe = false;
|
|
@@ -438,5 +469,6 @@ ssize_t trace_report(int fd, struct trace_event *tevent, bool __repipe)
|
|
|
out:
|
|
|
if (pevent)
|
|
|
trace_event__cleanup(tevent);
|
|
|
+ free(version);
|
|
|
return size;
|
|
|
}
|