trace-cmd split: Copy trace_clock from input handler to output handler

When splitting a trace file, the clock is needed to create a output file
from the input file. But the output descriptor clock is never set, and the
clock returned from retrieving the descriptor is NULL (unless you are
root, in which case the code will read the machine trace clock instead,
and continue as if nothing was wrong). This caused a failure, and once
again, trace-cmd split, errored out without failure, but just did not
append all the data.

Although this fixes the commit listed below, the problem was there before,
as the code before that commit tried to read the clock from the file
system, but just wouldn't error out if it couldn't read it.

Add a new function to retrieve the trace_clock from the input handle, to
be used to pass it to the output handle before appending the CPU data.

Link: https://lore.kernel.org/linux-trace-devel/20210622171338.6447f199@gandalf.local.home

Reported-by: Julia Lawall <julia.lawall@inria.fr>
Fixes: 72670886 ("trace-cmd: Save only the selected clock in the trace.dat file")
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
diff --git a/lib/trace-cmd/include/private/trace-cmd-private.h b/lib/trace-cmd/include/private/trace-cmd-private.h
index 7194cb3..6440084 100644
--- a/lib/trace-cmd/include/private/trace-cmd-private.h
+++ b/lib/trace-cmd/include/private/trace-cmd-private.h
@@ -87,7 +87,8 @@
 
 void tracecmd_set_quiet(struct tracecmd_output *handle, bool set_quiet);
 bool tracecmd_get_quiet(struct tracecmd_output *handle);
-void tracecmd_set_out_clock(struct tracecmd_output *handle, char *clock);
+void tracecmd_set_out_clock(struct tracecmd_output *handle, const char *clock);
+const char *tracecmd_get_trace_clock(struct tracecmd_input *handle);
 
 static inline int tracecmd_host_bigendian(void)
 {
diff --git a/lib/trace-cmd/trace-input.c b/lib/trace-cmd/trace-input.c
index 655bd65..ac57bc4 100644
--- a/lib/trace-cmd/trace-input.c
+++ b/lib/trace-cmd/trace-input.c
@@ -4076,6 +4076,19 @@
 }
 
 /**
+ * tracecmd_get_trace_clock - return the saved trace clock
+ * @handle: input handle for the trace.dat file
+ *
+ * Returns a string of the clock that was saved in the trace.dat file.
+ * The string should not be freed, as it points to the internal
+ * structure data.
+ */
+const char *tracecmd_get_trace_clock(struct tracecmd_input *handle)
+{
+	return handle->trace_clock;
+}
+
+/**
  * tracecmd_get_show_data_func - return the show data func
  * @handle: input handle for the trace.dat file
  */
diff --git a/lib/trace-cmd/trace-output.c b/lib/trace-cmd/trace-output.c
index 78a2535..a8de107 100644
--- a/lib/trace-cmd/trace-output.c
+++ b/lib/trace-cmd/trace-output.c
@@ -122,7 +122,7 @@
 		handle->quiet = set_quiet;
 }
 
-void tracecmd_set_out_clock(struct tracecmd_output *handle, char *clock)
+void tracecmd_set_out_clock(struct tracecmd_output *handle, const char *clock)
 {
 	if (handle && clock)
 		handle->trace_clock = strdup(clock);
diff --git a/tracecmd/trace-split.c b/tracecmd/trace-split.c
index 8366d12..10d0943 100644
--- a/tracecmd/trace-split.c
+++ b/tracecmd/trace-split.c
@@ -384,6 +384,7 @@
 	for (cpu = 0; cpu < cpus; cpu ++)
 		cpu_list[cpu] = cpu_data[cpu].file;
 
+	tracecmd_set_out_clock(ohandle, tracecmd_get_trace_clock(handle));
 	tracecmd_append_cpu_data(ohandle, cpus, cpu_list);
 
 	current = end;