Fix: Confusion between stream and stream class IDs
[babeltrace.git] / formats / ctf / writer / writer.c
index 75bf850c98080dbb16433d71c78deb5879715648..3ef4dae94d373be3b8396731f1a9c7c52d6858d8 100644 (file)
@@ -36,6 +36,7 @@
 #include <babeltrace/ctf-writer/stream-internal.h>
 #include <babeltrace/ctf-writer/stream.h>
 #include <babeltrace/compiler.h>
+#include <babeltrace/endian.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/stat.h>
@@ -115,8 +116,7 @@ struct bt_ctf_writer *bt_ctf_writer_create(const char *path)
                goto error_destroy;
        }
 
-       writer->trace_dir_fd = open(path, O_RDONLY | O_DIRECTORY,
-               S_IRWXU | S_IRWXG);
+       writer->trace_dir_fd = open(path, O_RDONLY, S_IRWXU | S_IRWXG);
        if (writer->trace_dir_fd < 0) {
                perror("open");
                goto error_destroy;
@@ -358,7 +358,7 @@ const char *get_byte_order_string(int byte_order)
 }
 
 static
-void append_trace_metadata(struct bt_ctf_writer *writer,
+int append_trace_metadata(struct bt_ctf_writer *writer,
                struct metadata_context *context)
 {
        unsigned char *uuid = writer->uuid;
@@ -383,10 +383,14 @@ void append_trace_metadata(struct bt_ctf_writer *writer,
        g_string_assign(context->field_name, "");
        ret = bt_ctf_field_type_serialize(writer->trace_packet_header_type,
                context);
-       assert(!ret);
+       if (ret) {
+               goto end;
+       }
        context->current_indentation_level--;
 
        g_string_append(context->string, ";\n};\n\n");
+end:
+       return ret;
 }
 
 static
@@ -430,7 +434,9 @@ char *bt_ctf_writer_get_metadata_string(struct bt_ctf_writer *writer)
        context->field_name = g_string_sized_new(DEFAULT_IDENTIFIER_SIZE);
        context->string = g_string_sized_new(DEFAULT_METADATA_STRING_SIZE);
        g_string_append(context->string, "/* CTF 1.8 */\n\n");
-       append_trace_metadata(writer, context);
+       if (append_trace_metadata(writer, context)) {
+               goto error;
+       }
        append_env_metadata(writer, context);
        g_ptr_array_foreach(writer->clocks,
                (GFunc)bt_ctf_clock_serialize, context);
@@ -561,8 +567,9 @@ int validate_identifier(const char *input_string)
 
        token = strtok_r(string, " ", &save_ptr);
        while (token) {
-               if (g_hash_table_contains(reserved_keywords_set,
-                       GINT_TO_POINTER(g_quark_from_string(token)))) {
+               if (g_hash_table_lookup_extended(reserved_keywords_set,
+                       GINT_TO_POINTER(g_quark_from_string(token)),
+                       NULL, NULL)) {
                        ret = -1;
                        goto end;
                }
@@ -717,7 +724,8 @@ void stream_flush_cb(struct bt_ctf_stream *stream, struct bt_ctf_writer *writer)
 
        stream_id = bt_ctf_field_structure_get_field(
                writer->trace_packet_header, "stream_id");
-       bt_ctf_field_unsigned_integer_set_value(stream_id, stream->id);
+       bt_ctf_field_unsigned_integer_set_value(stream_id,
+               stream->stream_class->id);
        bt_ctf_field_put(stream_id);
 
        /* Write the trace_packet_header */
@@ -738,8 +746,10 @@ void writer_init(void)
 
        reserved_keywords_set = g_hash_table_new(g_direct_hash, g_direct_equal);
        for (i = 0; i < reserved_keywords_count; i++) {
-               g_hash_table_add(reserved_keywords_set,
-               GINT_TO_POINTER(g_quark_from_string(reserved_keywords_str[i])));
+               gpointer quark = GINT_TO_POINTER(g_quark_from_string(
+                       reserved_keywords_str[i]));
+
+               g_hash_table_insert(reserved_keywords_set, quark, quark);
        }
 
        init_done = 1;
This page took 0.024082 seconds and 4 git commands to generate.