Babeltrace ctf-text duplicated error message
[babeltrace.git] / converter / babeltrace-log.c
index 711937352eea3c884f774178ad7076aaef05c11e..6ac94e69236c3cb7f29d806aa0369b63bf5b2d4b 100644 (file)
@@ -3,7 +3,9 @@
  *
  * BabelTrace - Convert Text Log to CTF
  *
- * Copyright 2010, 2011 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ * Copyright 2010-2011 EfficiOS Inc. and Linux Foundation
+ *
+ * Author: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -18,6 +20,8 @@
  * Depends on glibc 2.10 for getline().
  */
 
+#define _GNU_SOURCE
+#include <config.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <stdint.h>
 #include <unistd.h>
 #include <errno.h>
-#include <uuid/uuid.h>
 #include <string.h>
-#include <endian.h>
 
-#include <babeltrace/babeltrace.h>
+#include <babeltrace/babeltrace-internal.h>
 #include <babeltrace/ctf/types.h>
+#include <babeltrace/uuid.h>
+#include <babeltrace/endian.h>
 
 #define USEC_PER_SEC 1000000UL
 
-#ifndef UUID_STR_LEN
-#define UUID_STR_LEN   37      /* With \0 */
-#endif
-
 int babeltrace_debug, babeltrace_verbose;
 
 static char *s_outputname;
 static int s_timestamp;
-static uuid_t s_uuid;
+static int s_help;
+static unsigned char s_uuid[BABELTRACE_UUID_LEN];
 
 /* Metadata format string */
 static const char metadata_fmt[] =
+"/* CTF 1.8 */\n"
 "typealias integer { size = 8; align = 8; signed = false; } := uint8_t;\n"
 "typealias integer { size = 32; align = 32; signed = false; } := uint32_t;\n"
 "\n"
@@ -59,7 +61,7 @@ static const char metadata_fmt[] =
 "      byte_order = %s;\n"             /* be or le */
 "      packet.header := struct {\n"
 "              uint32_t magic;\n"
-"              uint8_t  trace_uuid[16];\n"
+"              uint8_t  uuid[16];\n"
 "      };\n"
 "};\n"
 "\n"
@@ -85,19 +87,24 @@ static const char metadata_stream_event_header_timestamp[] =
 static
 void print_metadata(FILE *fp)
 {
-       char uuid_str[UUID_STR_LEN];
+       char uuid_str[BABELTRACE_UUID_STR_LEN];
+       unsigned int major = 0, minor = 0;
+       int ret;
 
-       uuid_unparse(s_uuid, uuid_str);
+       ret = sscanf(VERSION, "%u.%u", &major, &minor);
+       if (ret != 2)
+               fprintf(stderr, "[warning] Incorrect babeltrace version format\n.");
+       babeltrace_uuid_unparse(s_uuid, uuid_str);
        fprintf(fp, metadata_fmt,
-               BABELTRACE_VERSION_MAJOR,
-               BABELTRACE_VERSION_MINOR,
+               major,
+               minor,
                uuid_str,
                BYTE_ORDER == LITTLE_ENDIAN ? "le" : "be",
                s_timestamp ? metadata_stream_event_header_timestamp : "");
 }
 
 static
-void write_packet_header(struct ctf_stream_pos *pos, uuid_t uuid)
+void write_packet_header(struct ctf_stream_pos *pos, unsigned char *uuid)
 {
        struct ctf_stream_pos dummy;
 
@@ -111,15 +118,15 @@ void write_packet_header(struct ctf_stream_pos *pos, uuid_t uuid)
        *(uint32_t *) ctf_get_pos_addr(pos) = 0xC1FC1FC1;
        ctf_move_pos(pos, sizeof(uint32_t) * CHAR_BIT);
 
-       /* trace_uuid */
+       /* uuid */
        ctf_dummy_pos(pos, &dummy);
        ctf_align_pos(&dummy, sizeof(uint8_t) * CHAR_BIT);
        ctf_move_pos(&dummy, 16 * CHAR_BIT);
        assert(!ctf_pos_packet(&dummy));
 
        ctf_align_pos(pos, sizeof(uint8_t) * CHAR_BIT);
-       memcpy(ctf_get_pos_addr(pos), uuid, 16);
-       ctf_move_pos(pos, 16 * CHAR_BIT);
+       memcpy(ctf_get_pos_addr(pos), uuid, BABELTRACE_UUID_LEN);
+       ctf_move_pos(pos, BABELTRACE_UUID_LEN * CHAR_BIT);
 }
 
 static
@@ -178,7 +185,7 @@ void write_event_header(struct ctf_stream_pos *pos, char *line,
        /* timestamp */
        ctf_align_pos(pos, sizeof(uint64_t) * CHAR_BIT);
        if (!pos->dummy)
-               *(uint32_t *) ctf_get_pos_addr(pos) = *ts;
+               *(uint64_t *) ctf_get_pos_addr(pos) = *ts;
        ctf_move_pos(pos, sizeof(uint64_t) * CHAR_BIT);
 }
 
@@ -202,7 +209,7 @@ retry:
                write_packet_header(pos, s_uuid);
                write_packet_context(pos);
                if (attempt++ == 1) {
-                       fprintf(stdout, "[Error] Line too large for packet size (%zukB) (discarded)\n",
+                       fprintf(stderr, "[Error] Line too large for packet size (%zukB) (discarded)\n",
                                pos->packet_size / CHAR_BIT / 1024);
                        return;
                }
@@ -242,16 +249,16 @@ void trace_text(FILE *input, int output)
 static
 void usage(FILE *fp)
 {
-       fprintf(fp, "BabelTrace Log Converter %u.%u\n",
-               BABELTRACE_VERSION_MAJOR,
-               BABELTRACE_VERSION_MINOR);
+       fprintf(fp, "BabelTrace Log Converter %s\n", VERSION);
        fprintf(fp, "\n");
        fprintf(fp, "Convert for a text log (read from standard input) to CTF.\n");
        fprintf(fp, "\n");
-       fprintf(fp, "usage : babeltrace-log OUTPUT\n");
+       fprintf(fp, "usage : babeltrace-log [OPTIONS] OUTPUT\n");
        fprintf(fp, "\n");
        fprintf(fp, "  OUTPUT                         Output trace path\n");
        fprintf(fp, "\n");
+       fprintf(fp, "  -t                             With timestamps (format: [sec.usec] string\\n)\n");
+       fprintf(fp, "\n");
 }
 
 static
@@ -262,6 +269,11 @@ int parse_args(int argc, char **argv)
        for (i = 1; i < argc; i++) {
                if (!strcmp(argv[i], "-t"))
                        s_timestamp = 1;
+               else if (!strcmp(argv[i], "-h")) {
+                       s_help = 1;
+                       return 0;
+               } else if (argv[i][0] == '-')
+                       return -EINVAL;
                else
                        s_outputname = argv[i];
        }
@@ -279,10 +291,16 @@ int main(int argc, char **argv)
 
        ret = parse_args(argc, argv);
        if (ret) {
-               usage(stdout);
+               fprintf(stderr, "Error: invalid argument.\n");
+               usage(stderr);
                goto error;
        }
 
+       if (s_help) {
+               usage(stdout);
+               exit(EXIT_SUCCESS);
+       }
+
        ret = mkdir(s_outputname, S_IRWXU|S_IRWXG);
        if (ret) {
                perror("mkdir");
@@ -319,7 +337,7 @@ int main(int argc, char **argv)
                goto error_closemetadatafd;
        }
 
-       uuid_generate(s_uuid);
+       babeltrace_uuid_generate(s_uuid);
        print_metadata(metadata_fp);
        trace_text(stdin, fd);
 
This page took 0.024708 seconds and 4 git commands to generate.