Add new option --clock-offset-ns
[babeltrace.git] / converter / babeltrace.c
index b1f32c94b4d097d425e34910c56b1e68728b802c..2fd371c396a9f218c575eaaff704ca2571f33656 100644 (file)
@@ -31,6 +31,7 @@
 #include <babeltrace/babeltrace.h>
 #include <babeltrace/format.h>
 #include <babeltrace/context.h>
+#include <babeltrace/context-internal.h>
 #include <babeltrace/ctf/types.h>
 #include <babeltrace/ctf/events.h>
 /* TODO: fix object model for format-agnostic callbacks */
@@ -68,7 +69,7 @@ static char *opt_input_format, *opt_output_format;
 static GPtrArray *opt_input_paths;
 static char *opt_output_path;
 
-static struct format *fmt_read;
+static struct bt_format *fmt_read;
 
 static
 void strlower(char *str)
@@ -92,6 +93,7 @@ enum {
        OPT_FIELDS,
        OPT_NO_DELTA,
        OPT_CLOCK_OFFSET,
+       OPT_CLOCK_OFFSET_NS,
        OPT_CLOCK_CYCLES,
        OPT_CLOCK_SECONDS,
        OPT_CLOCK_DATE,
@@ -120,6 +122,7 @@ static struct poptOption long_options[] = {
        { "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-offset-ns", 0, POPT_ARG_STRING, NULL, OPT_CLOCK_OFFSET_NS, NULL, NULL },
        { "clock-cycles", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_CYCLES, 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 },
@@ -163,6 +166,7 @@ static void usage(FILE *fp)
        fprintf(fp, "                                     (default: trace:hostname,trace:procname,trace:vpid)\n");
        fprintf(fp, "      --clock-cycles             Timestamp in cycles\n");
        fprintf(fp, "      --clock-offset seconds     Clock offset in seconds\n");
+       fprintf(fp, "      --clock-offset-ns ns       Clock offset in nanoseconds\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");
@@ -204,7 +208,6 @@ static int get_names_args(poptContext *pc)
                        opt_payload_field_names = 0;
                } else {
                        fprintf(stderr, "[error] unknown field name type %s\n", str);
-                       free(strlist);
                        ret = -EINVAL;
                        goto end;
                }
@@ -357,6 +360,29 @@ static int parse_options(int argc, char **argv)
                case OPT_CLOCK_SECONDS:
                        opt_clock_seconds = 1;
                        break;
+               case OPT_CLOCK_OFFSET_NS:
+               {
+                       char *str;
+                       char *endptr;
+
+                       str = (char *) poptGetOptArg(pc);
+                       if (!str) {
+                               fprintf(stderr, "[error] Missing --clock-offset-ns argument\n");
+                               ret = -EINVAL;
+                               goto end;
+                       }
+                       errno = 0;
+                       opt_clock_offset_ns = strtoull(str, &endptr, 0);
+                       if (*endptr != '\0' || str == endptr || errno != 0) {
+                               fprintf(stderr, "[error] Incorrect --clock-offset-ns argument: %s\n", str);
+                               ret = -EINVAL;
+                               free(str);
+                               goto end;
+                       }
+                       free(str);
+                       break;
+               }
+
                case OPT_CLOCK_DATE:
                        opt_clock_date = 1;
                        break;
@@ -516,7 +542,68 @@ int bt_context_add_traces_recursive(struct bt_context *ctx, const char *path,
        return ret;
 }
 
-int convert_trace(struct trace_descriptor *td_write,
+static
+int trace_pre_handler(struct bt_trace_descriptor *td_write,
+                 struct bt_context *ctx)
+{
+       struct ctf_text_stream_pos *sout;
+       struct trace_collection *tc;
+       int ret, i;
+
+       sout = container_of(td_write, struct ctf_text_stream_pos,
+                       trace_descriptor);
+
+       if (!sout->parent.pre_trace_cb)
+               return 0;
+
+       tc = ctx->tc;
+       for (i = 0; i < tc->array->len; i++) {
+               struct bt_trace_descriptor *td =
+                       g_ptr_array_index(tc->array, i);
+
+               ret = sout->parent.pre_trace_cb(&sout->parent, td);
+               if (ret) {
+                       fprintf(stderr, "[error] Writing to trace pre handler failed.\n");
+                       goto end;
+               }
+       }
+       ret = 0;
+end:
+       return ret;
+}
+
+static
+int trace_post_handler(struct bt_trace_descriptor *td_write,
+                 struct bt_context *ctx)
+{
+       struct ctf_text_stream_pos *sout;
+       struct trace_collection *tc;
+       int ret, i;
+
+       sout = container_of(td_write, struct ctf_text_stream_pos,
+                       trace_descriptor);
+
+       if (!sout->parent.post_trace_cb)
+               return 0;
+
+       tc = ctx->tc;
+       for (i = 0; i < tc->array->len; i++) {
+               struct bt_trace_descriptor *td =
+                       g_ptr_array_index(tc->array, i);
+
+               ret = sout->parent.post_trace_cb(&sout->parent, td);
+               if (ret) {
+                       fprintf(stderr, "[error] Writing to trace post handler failed.\n");
+                       goto end;
+               }
+       }
+       ret = 0;
+end:
+       return ret;
+}
+
+static
+int convert_trace(struct bt_trace_descriptor *td_write,
                  struct bt_context *ctx)
 {
        struct bt_ctf_iter *iter;
@@ -528,6 +615,9 @@ int convert_trace(struct trace_descriptor *td_write,
        sout = container_of(td_write, struct ctf_text_stream_pos,
                        trace_descriptor);
 
+       if (!sout->parent.event_cb)
+               return 0;
+
        begin_pos.type = BT_SEEK_BEGIN;
        iter = bt_ctf_iter_create(ctx, &begin_pos, NULL);
        if (!iter) {
@@ -555,8 +645,8 @@ error_iter:
 int main(int argc, char **argv)
 {
        int ret, partial_error = 0, open_success = 0;
-       struct format *fmt_write;
-       struct trace_descriptor *td_write;
+       struct bt_format *fmt_write;
+       struct bt_trace_descriptor *td_write;
        struct bt_context *ctx;
        int i;
 
@@ -587,7 +677,7 @@ int main(int argc, char **argv)
        }
        printf_verbose("Converting from format: %s\n",
                opt_input_format ? : "ctf <default>");
-       printf_verbose("Converting to directory: %s\n",
+       printf_verbose("Converting to target: %s\n",
                opt_output_path ? : "<stdout>");
        printf_verbose("Converting to format: %s\n",
                opt_output_format ? : "text <default>");
@@ -607,7 +697,7 @@ int main(int argc, char **argv)
                }
        }
        fmt_read = bt_lookup_format(g_quark_from_static_string(opt_input_format));
-       if (!fmt_read) {
+       if (!fmt_read || fmt_read->name != g_quark_from_static_string("ctf")) {
                fprintf(stderr, "[error] Format \"%s\" is not supported.\n\n",
                        opt_input_format);
                partial_error = 1;
@@ -661,12 +751,24 @@ int main(int argc, char **argv)
        if (partial_error)
                sleep(PARTIAL_ERROR_SLEEP);
 
+       ret = trace_pre_handler(td_write, ctx);
+       if (ret) {
+               fprintf(stderr, "Error in trace pre handle.\n\n");
+               goto error_copy_trace;
+       }
+
        ret = convert_trace(td_write, ctx);
        if (ret) {
                fprintf(stderr, "Error printing trace.\n\n");
                goto error_copy_trace;
        }
 
+       ret = trace_post_handler(td_write, ctx);
+       if (ret) {
+               fprintf(stderr, "Error in trace post handle.\n\n");
+               goto error_copy_trace;
+       }
+
        fmt_write->close_trace(td_write);
 
        bt_context_put(ctx);
This page took 0.026456 seconds and 4 git commands to generate.