OPT_NAMES,
OPT_FIELDS,
OPT_NO_DELTA,
+ OPT_CLOCK_OFFSET,
+ OPT_CLOCK_RAW,
+ OPT_CLOCK_SECONDS,
+ OPT_CLOCK_DATE,
+ OPT_CLOCK_GMT,
};
static struct poptOption long_options[] = {
{ "names", 'n', POPT_ARG_STRING, NULL, OPT_NAMES, NULL, NULL },
{ "fields", 'f', POPT_ARG_STRING, NULL, OPT_FIELDS, NULL, NULL },
{ "no-delta", 0, POPT_ARG_NONE, NULL, OPT_NO_DELTA, NULL, NULL },
+ { "clock-offset", 0, POPT_ARG_STRING, NULL, OPT_CLOCK_OFFSET, NULL, NULL },
+ { "clock-raw", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_RAW, NULL, NULL },
+ { "clock-seconds", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_SECONDS, NULL, NULL },
+ { "clock-date", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_DATE, NULL, NULL },
+ { "clock-gmt", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_GMT, NULL, NULL },
{ NULL, 0, 0, NULL, 0, NULL, NULL },
};
fprintf(fp, " -f, --fields name1<,name2,...> Print additional fields:\n");
fprintf(fp, " all, trace, trace:domain, trace:procname,\n");
fprintf(fp, " trace:vpid, loglevel.\n");
+ fprintf(fp, " --clock-raw Disregard internal clock offset (use raw value)\n");
+ fprintf(fp, " --clock-offset seconds Clock offset in seconds\n");
+ fprintf(fp, " --clock-seconds Print the timestamps as [sec.ns]\n");
+ fprintf(fp, " (default is: [hh:mm:ss.ns])\n");
+ fprintf(fp, " --clock-date Print clock date\n");
+ fprintf(fp, " --clock-gmt Print clock in GMT time zone (default: local time zone)\n");
list_formats(fp);
fprintf(fp, "\n");
}
case OPT_NO_DELTA:
opt_delta_field = 0;
break;
+ case OPT_CLOCK_RAW:
+ opt_clock_raw = 1;
+ break;
+ case OPT_CLOCK_OFFSET:
+ {
+ char *str, *endptr;
+
+ str = poptGetOptArg(pc);
+ if (!str) {
+ fprintf(stderr, "[error] Missing --clock-offset argument\n");
+ ret = -EINVAL;
+ goto end;
+ }
+ errno = 0;
+ opt_clock_offset = strtoull(str, &endptr, 0);
+ if (*endptr != '\0' || str == endptr || errno != 0) {
+ fprintf(stderr, "[error] Incorrect --clock-offset argument: %s\n", str);
+ ret = -EINVAL;
+ goto end;
+ }
+ break;
+ }
+ case OPT_CLOCK_SECONDS:
+ opt_clock_seconds = 1;
+ break;
+ case OPT_CLOCK_DATE:
+ opt_clock_date = 1;
+ break;
+ case OPT_CLOCK_GMT:
+ opt_clock_gmt = 1;
+ break;
+
default:
ret = -EINVAL;
goto end;
opt_trace_procname_field,
opt_trace_vpid_field,
opt_loglevel_field,
- opt_delta_field = 1;
+ opt_delta_field = 1,
+ opt_clock_raw,
+ opt_clock_seconds,
+ opt_clock_date,
+ opt_clock_gmt;
+
+uint64_t opt_clock_offset;
enum field_item {
ITEM_SCOPE,
}
}
+static
+void ctf_text_print_timestamp(struct ctf_text_stream_pos *pos,
+ struct ctf_stream *stream)
+{
+ uint64_t ts_sec = 0, ts_nsec;
+ //need to get the clock offset at trace collection level. TODO
+ //struct ctf_trace *trace = stream->stream_class->trace;
+
+ ts_nsec = stream->timestamp;
+
+ /* Add offsets */
+ if (!opt_clock_raw) {
+ //ts_sec += pos->clock_offset_s;
+ //ts_nsec += pos->clock_offset;
+ }
+ ts_sec += opt_clock_offset;
+
+ ts_sec += ts_nsec / NSEC_PER_SEC;
+ ts_nsec = ts_nsec % NSEC_PER_SEC;
+
+ if (!opt_clock_seconds) {
+ struct tm tm;
+ time_t time_s = (time_t) ts_sec;
+
+ if (!opt_clock_gmt) {
+ struct tm *res;
+
+ res = localtime_r(&time_s, &tm);
+ if (!res) {
+ fprintf(stderr, "[warning] Unable to get localtime.\n");
+ goto seconds;
+ }
+ } else {
+ struct tm *res;
+
+ res = gmtime_r(&time_s, &tm);
+ if (!res) {
+ fprintf(stderr, "[warning] Unable to get gmtime.\n");
+ goto seconds;
+ }
+ }
+ if (opt_clock_date) {
+ char timestr[26];
+ size_t res;
+
+ /* Print date and time */
+ res = strftime(timestr, sizeof(timestr),
+ "%F ", &tm);
+ if (!res) {
+ fprintf(stderr, "[warning] Unable to print ascii time.\n");
+ goto seconds;
+ }
+ fprintf(pos->fp, "%s", timestr);
+ }
+ /* Print time in HH:MM:SS.ns */
+ fprintf(pos->fp, "%02d:%02d:%02d.%09" PRIu64,
+ tm.tm_hour, tm.tm_min, tm.tm_sec, ts_nsec);
+ goto end;
+ }
+seconds:
+ fprintf(pos->fp, "%3" PRIu64 ".%09" PRIu64,
+ ts_sec, ts_nsec);
+
+end:
+ return;
+}
+
static
int ctf_text_write_event(struct stream_pos *ppos,
struct ctf_stream *stream)
}
if (stream->has_timestamp) {
- uint64_t ts_sec, ts_nsec;
-
- ts_sec = stream->timestamp / NSEC_PER_SEC;
- ts_nsec = stream->timestamp % NSEC_PER_SEC;
set_field_names_print(pos, ITEM_HEADER);
if (pos->print_names)
fprintf(pos->fp, "timestamp = ");
else
fprintf(pos->fp, "[");
- fprintf(pos->fp, "%3" PRIu64 ".%09" PRIu64,
- ts_sec, ts_nsec);
+ ctf_text_print_timestamp(pos, stream);
if (!pos->print_names)
fprintf(pos->fp, "]");