Fix: -n "field names" option should allow "none"
[babeltrace.git] / converter / babeltrace.c
index 539734eeaa55df4e3ba23019f8cbe5d9560fef51..11c10cf8aa488657ac9fae1fcd0ac9e98d01525e 100644 (file)
 #include <babeltrace/format.h>
 #include <babeltrace/context.h>
 #include <babeltrace/ctf/types.h>
+#include <babeltrace/ctf/events.h>
+/* TODO: fix object model for format-agnostic callbacks */
+#include <babeltrace/ctf/events-internal.h>
+#include <babeltrace/ctf/iterator.h>
 #include <babeltrace/ctf-text/types.h>
 #include <babeltrace/iterator.h>
 #include <popt.h>
@@ -119,8 +123,8 @@ static void usage(FILE *fp)
        fprintf(fp, "      --no-delta                 Do not print time delta between consecutive events\n");
        fprintf(fp, "  -n, --names name1<,name2,...>  Print field names:\n");
        fprintf(fp, "                                     (payload OR args OR arg)\n");
-       fprintf(fp, "                                     all, scope, header, (context OR ctx)\n");
-       fprintf(fp, "                                        (payload active by default)\n");
+       fprintf(fp, "                                     none, all, scope, header, (context OR ctx)\n");
+       fprintf(fp, "                                        (default: payload,context)\n");
        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");
@@ -141,6 +145,7 @@ static int get_names_args(poptContext *pc)
        char *str, *strlist, *strctx;
 
        opt_payload_field_names = 0;
+       opt_context_field_names = 0;
        strlist = (char *) poptGetOptArg(*pc);
        if (!strlist) {
                return -EINVAL;
@@ -157,7 +162,13 @@ static int get_names_args(poptContext *pc)
                        opt_header_field_names = 1;
                else if (!strcmp(str, "payload") || !strcmp(str, "args") || !strcmp(str, "arg"))
                        opt_payload_field_names = 1;
-               else {
+               else if (!strcmp(str, "none")) {
+                       opt_all_field_names = 0;
+                       opt_scope_field_names = 0;
+                       opt_context_field_names = 0;
+                       opt_header_field_names = 0;
+                       opt_payload_field_names = 0;
+               } else {
                        fprintf(stderr, "[error] unknown field name type %s\n", str);
                        return -EINVAL;
                }
@@ -213,6 +224,7 @@ static int parse_options(int argc, char **argv)
        poptReadDefaultConfig(pc, 0);
 
        /* set default */
+       opt_context_field_names = 1;
        opt_payload_field_names = 1;
 
        while ((opt = poptGetNextOpt(pc)) != -1) {
@@ -306,21 +318,24 @@ end:
  * bt_context_add_traces_recursive: Open a trace recursively
  *
  * Find each trace present in the subdirectory starting from the given
- * path, and add them to the context.
+ * path, and add them to the context. The packet_seek parameter can be
+ * NULL: this specify to use the default format packet_seek.
  *
  * Return: 0 on success, nonzero on failure.
  * Unable to open toplevel: failure.
  * Unable to open some subdirectory or file: warn and continue;
  */
 int bt_context_add_traces_recursive(struct bt_context *ctx, const char *path,
-               const char *format_str)
+               const char *format_str,
+               void (*packet_seek)(struct stream_pos *pos,
+                       size_t offset, int whence))
 {
        FTS *tree;
        FTSENT *node;
        GArray *trace_ids;
        char lpath[PATH_MAX];
        char * const paths[2] = { lpath, NULL };
-       int ret;
+       int ret = -1;
 
        /*
         * Need to copy path, because fts_open can change it.
@@ -373,19 +388,20 @@ int bt_context_add_traces_recursive(struct bt_context *ctx, const char *path,
                        }
 
                        trace_id = bt_context_add_trace(ctx,
-                               node->fts_accpath, format_str);
+                               node->fts_accpath, format_str,
+                               packet_seek, NULL, NULL);
                        if (trace_id < 0) {
-                               fprintf(stderr, "[error] [Context] opening trace \"%s\" from %s "
+                               fprintf(stderr, "[warning] [Context] opening trace \"%s\" from %s "
                                        "for reading.\n", node->fts_accpath, path);
-                               ret = trace_id;
-                               goto error;
+                               /* Allow to skip erroneous traces. */
+                               continue;
                        }
                        g_array_append_val(trace_ids, trace_id);
                }
        }
 
        g_array_free(trace_ids, TRUE);
-       return 0;
+       return ret;
 
 error:
        return ret;
@@ -396,36 +412,35 @@ error:
 int convert_trace(struct trace_descriptor *td_write,
                  struct bt_context *ctx)
 {
-       struct bt_iter *iter;
-       struct ctf_stream *stream;
-       struct ctf_stream_event *event;
+       struct bt_ctf_iter *iter;
        struct ctf_text_stream_pos *sout;
        struct bt_iter_pos begin_pos;
+       struct bt_ctf_event *ctf_event;
        int ret;
 
        sout = container_of(td_write, struct ctf_text_stream_pos,
                        trace_descriptor);
 
        begin_pos.type = BT_SEEK_BEGIN;
-       iter = bt_iter_create(ctx, &begin_pos, NULL);
+       iter = bt_ctf_iter_create(ctx, &begin_pos, NULL);
        if (!iter) {
                ret = -1;
                goto error_iter;
        }
-       while (bt_iter_read_event(iter, &stream, &event) == 0) {
-               ret = sout->parent.event_cb(&sout->parent, stream);
+       while ((ctf_event = bt_ctf_iter_read_event(iter))) {
+               ret = sout->parent.event_cb(&sout->parent, ctf_event->parent->stream);
                if (ret) {
                        fprintf(stderr, "[error] Writing event failed.\n");
                        goto end;
                }
-               ret = bt_iter_next(iter);
+               ret = bt_iter_next(bt_ctf_get_iter(iter));
                if (ret < 0)
                        goto end;
        }
        ret = 0;
 
 end:
-       bt_iter_destroy(iter);
+       bt_ctf_iter_destroy(iter);
 error_iter:
        return ret;
 }
@@ -481,7 +496,7 @@ int main(int argc, char **argv)
        ctx = bt_context_create();
 
        ret = bt_context_add_traces_recursive(ctx, opt_input_path,
-                       opt_input_format);
+                       opt_input_format, NULL);
        if (ret) {
                fprintf(stderr, "[error] opening trace \"%s\" for reading.\n\n",
                        opt_input_path);
This page took 0.026348 seconds and 4 git commands to generate.