From: Mathieu Desnoyers Date: Tue, 17 May 2011 12:10:25 +0000 (-0400) Subject: trace_uuid -> uuid and add packet metadata support X-Git-Tag: v0.1~49 X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=commitdiff_plain;h=b4c19c1e0a905f94146e6f319218fb16b7ebbca1 trace_uuid -> uuid and add packet metadata support Signed-off-by: Mathieu Desnoyers --- diff --git a/converter/babeltrace-log.c b/converter/babeltrace-log.c index 3e37e538..19cf3692 100644 --- a/converter/babeltrace-log.c +++ b/converter/babeltrace-log.c @@ -59,7 +59,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" @@ -111,7 +111,7 @@ 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); diff --git a/formats/ctf/ctf.c b/formats/ctf/ctf.c index bdebaeb3..b0d3ebcf 100644 --- a/formats/ctf/ctf.c +++ b/formats/ctf/ctf.c @@ -21,9 +21,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -370,15 +372,128 @@ void ctf_move_pos_slow(struct ctf_stream_pos *pos, size_t offset, int whence) } } -/* - * TODO: for now, we treat the metadata file as a simple text file - * (without any header nor packets nor padding). - */ +static +int packet_metadata(struct ctf_trace *td, FILE *fp) +{ + uint32_t magic; + size_t len; + int ret = 0; + + len = fread(&magic, sizeof(magic), 1, fp); + if (len != sizeof(magic)) { + goto end; + } + if (magic == TSDL_MAGIC) { + ret = 1; + td->byte_order = BYTE_ORDER; + } else if (magic == GUINT32_SWAP_LE_BE(TSDL_MAGIC)) { + ret = 1; + td->byte_order = (BYTE_ORDER == BIG_ENDIAN) ? + LITTLE_ENDIAN : BIG_ENDIAN; + } +end: + rewind(fp); + return ret; +} + +static +int ctf_open_trace_metadata_packet_read(struct ctf_trace *td, FILE *in, + FILE *out) +{ + struct metadata_packet_header header; + size_t readlen, writelen; + char buf[4096]; + int ret = 0; + + readlen = fread(&header, sizeof(header), 1, in); + if (readlen < sizeof(header)) + return -EINVAL; + + if (td->byte_order != BYTE_ORDER) { + header.magic = GUINT32_SWAP_LE_BE(header.magic); + header.checksum = GUINT32_SWAP_LE_BE(header.checksum); + header.content_size = GUINT32_SWAP_LE_BE(header.content_size); + header.packet_size = GUINT32_SWAP_LE_BE(header.packet_size); + } + if (header.checksum) + fprintf(stdout, "[warning] checksum verification not supported yet.\n"); + if (header.compression_scheme) { + fprintf(stdout, "[error] compression (%u) not supported yet.\n", + header.compression_scheme); + return -EINVAL; + } + if (header.encryption_scheme) { + fprintf(stdout, "[error] encryption (%u) not supported yet.\n", + header.encryption_scheme); + return -EINVAL; + } + if (header.checksum_scheme) { + fprintf(stdout, "[error] checksum (%u) not supported yet.\n", + header.checksum_scheme); + return -EINVAL; + } + if (!CTF_TRACE_FIELD_IS_SET(td, uuid)) { + memcpy(td->uuid, header.uuid, sizeof(header.uuid)); + CTF_TRACE_SET_FIELD(td, uuid); + } else { + if (uuid_compare(header.uuid, td->uuid)) + return -EINVAL; + } + + while (!feof(in)) { + readlen = fread(buf, sizeof(char), sizeof(buf), in); + if (ferror(in)) { + ret = -EINVAL; + break; + } + writelen = fwrite(buf, sizeof(char), readlen, out); + if (writelen < readlen) { + ret = -EIO; + break; + } + if (ferror(out)) { + ret = -EINVAL; + break; + } + } + return ret; +} + +static +int ctf_open_trace_metadata_stream_read(struct ctf_trace *td, FILE **fp, + char **buf) +{ + FILE *in, *out; + size_t size; + int ret; + + in = *fp; + out = open_memstream(buf, &size); + if (out == NULL) + return -errno; + + for (;;) { + ret = ctf_open_trace_metadata_packet_read(td, in, out); + if (ret == -EOF) { + ret = 0; + break; + } else if (ret) { + break; + } + } + fclose(out); /* flush the buffer */ + fclose(in); + /* open for reading */ + *fp = fmemopen(*buf, size, "rb"); + return 0; +} + static int ctf_open_trace_metadata_read(struct ctf_trace *td) { struct ctf_scanner *scanner; FILE *fp; + char *buf = NULL; int ret = 0; td->metadata.pos.fd = openat(td->dirfd, "metadata", O_RDONLY); @@ -397,6 +512,12 @@ int ctf_open_trace_metadata_read(struct ctf_trace *td) goto end_stream; } + if (packet_metadata(td, fp)) { + ret = ctf_open_trace_metadata_stream_read(td, &fp, &buf); + if (ret) + goto end_packet_read; + } + scanner = ctf_scanner_alloc(fp); if (!scanner) { fprintf(stdout, "[error] Error allocating scanner\n"); @@ -431,7 +552,9 @@ int ctf_open_trace_metadata_read(struct ctf_trace *td) end: ctf_scanner_free(scanner); end_scanner_alloc: +end_packet_read: fclose(fp); + free(buf); end_stream: close(td->metadata.pos.fd); return ret; @@ -505,7 +628,7 @@ int create_stream_packet_index(struct ctf_trace *td, } /* check uuid */ - len_index = struct_declaration_lookup_field_index(td->packet_header->declaration, g_quark_from_static_string("trace_uuid")); + len_index = struct_declaration_lookup_field_index(td->packet_header->declaration, g_quark_from_static_string("uuid")); if (len_index >= 0) { struct definition_array *defarray; struct definition *field; diff --git a/formats/ctf/metadata/ctf-test/succeed/ctf-embedded-2.txt b/formats/ctf/metadata/ctf-test/succeed/ctf-embedded-2.txt index b9340158..859df662 100644 --- a/formats/ctf/metadata/ctf-test/succeed/ctf-embedded-2.txt +++ b/formats/ctf/metadata/ctf-test/succeed/ctf-embedded-2.txt @@ -14,7 +14,7 @@ trace { byte_order = be; packet.header := struct { uint32_t magic; - uint8_t trace_uuid[16]; + uint8_t uuid[16]; uint32_t stream_id; }; }; diff --git a/formats/ctf/metadata/ctf-test/succeed/ctf-single-stream-with-packet-context.txt b/formats/ctf/metadata/ctf-test/succeed/ctf-single-stream-with-packet-context.txt index c8cf5d21..e7dae679 100644 --- a/formats/ctf/metadata/ctf-test/succeed/ctf-single-stream-with-packet-context.txt +++ b/formats/ctf/metadata/ctf-test/succeed/ctf-single-stream-with-packet-context.txt @@ -8,7 +8,7 @@ trace { byte_order = le; packet.header := struct { uint32_t magic; - uint8_t trace_uuid[16]; + uint8_t uuid[16]; }; }; diff --git a/formats/ctf/metadata/ctf-test/succeed/ctf-single-stream.txt b/formats/ctf/metadata/ctf-test/succeed/ctf-single-stream.txt index 31465293..73c8850e 100644 --- a/formats/ctf/metadata/ctf-test/succeed/ctf-single-stream.txt +++ b/formats/ctf/metadata/ctf-test/succeed/ctf-single-stream.txt @@ -8,7 +8,7 @@ trace { byte_order = le; packet.header := struct { uint32_t magic; - uint8_t trace_uuid[16]; + uint8_t uuid[16]; }; }; diff --git a/formats/ctf/metadata/ctf-test/succeed/ctf-test-align-attribute.txt b/formats/ctf/metadata/ctf-test/succeed/ctf-test-align-attribute.txt index f9eefe32..caf5cabb 100644 --- a/formats/ctf/metadata/ctf-test/succeed/ctf-test-align-attribute.txt +++ b/formats/ctf/metadata/ctf-test/succeed/ctf-test-align-attribute.txt @@ -14,7 +14,7 @@ trace { byte_order = be; packet.header := struct { uint32_t magic; - uint8_t trace_uuid[16]; + uint8_t uuid[16]; uint32_t stream_id; }; }; diff --git a/formats/ctf/metadata/ctf-test/succeed/ctf-test-seq.txt b/formats/ctf/metadata/ctf-test/succeed/ctf-test-seq.txt index 763a7767..135a3780 100644 --- a/formats/ctf/metadata/ctf-test/succeed/ctf-test-seq.txt +++ b/formats/ctf/metadata/ctf-test/succeed/ctf-test-seq.txt @@ -14,7 +14,7 @@ trace { byte_order = be; packet.header := struct { uint32_t magic; - uint8_t trace_uuid[16]; + uint8_t uuid[16]; uint32_t stream_id; }; }; diff --git a/formats/ctf/metadata/ctf-test/succeed/ctf-test.txt b/formats/ctf/metadata/ctf-test/succeed/ctf-test.txt index c261a9a5..69e53851 100644 --- a/formats/ctf/metadata/ctf-test/succeed/ctf-test.txt +++ b/formats/ctf/metadata/ctf-test/succeed/ctf-test.txt @@ -44,7 +44,7 @@ struct event_packet_header { typealias integer { size = 8; align = 8; signed = false; } := uint8_t; uint32_t magic; - uint8_t trace_uuid[16]; + uint8_t uuid[16]; uint32_t stream_id; }; diff --git a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c index ecd9ffd9..9a5cda09 100644 --- a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c +++ b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c @@ -1887,17 +1887,19 @@ int ctf_trace_declaration_visit(FILE *fd, int depth, struct ctf_node *node, stru } CTF_TRACE_SET_FIELD(trace, minor); } else if (!strcmp(left, "uuid")) { - if (CTF_TRACE_FIELD_IS_SET(trace, uuid)) { - fprintf(fd, "[error] %s: uuid already declared in trace declaration\n", __func__); - ret = -EPERM; - goto error; - } + uuid_t uuid; ret = get_unary_uuid(&node->u.ctf_expression.right, &trace->uuid); if (ret) { fprintf(fd, "[error] %s: unexpected unary expression for trace uuid\n", __func__); ret = -EINVAL; goto error; } + if (CTF_TRACE_FIELD_IS_SET(trace, uuid) + && uuid_compare(uuid, trace->uuid)) { + fprintf(fd, "[error] %s: uuid mismatch\n", __func__); + ret = -EPERM; + goto error; + } CTF_TRACE_SET_FIELD(trace, uuid); } else if (!strcmp(left, "byte_order")) { struct ctf_node *right; diff --git a/include/babeltrace/ctf/metadata.h b/include/babeltrace/ctf/metadata.h index 903d018d..6ebd0c7c 100644 --- a/include/babeltrace/ctf/metadata.h +++ b/include/babeltrace/ctf/metadata.h @@ -29,6 +29,7 @@ #include #define CTF_MAGIC 0xC1FC1FC1 +#define TSDL_MAGIC 0x75D11D57 struct ctf_trace; struct ctf_stream_class; @@ -178,4 +179,15 @@ struct ctf_event { } field_mask; }; +struct metadata_packet_header { + uint32_t magic; /* 0x75D11D57 */ + uint8_t uuid[16]; /* Unique Universal Identifier */ + uint32_t checksum; /* 0 if unused */ + uint32_t content_size; /* in bits */ + uint32_t packet_size; /* in bits */ + uint8_t compression_scheme; /* 0 if unused */ + uint8_t encryption_scheme; /* 0 if unused */ + uint8_t checksum_scheme; /* 0 if unused */ +}; + #endif /* _BABELTRACE_CTF_METADATA_H */ diff --git a/tests/ctf-traces/fail/fail1/metadata b/tests/ctf-traces/fail/fail1/metadata index 8cd8e416..3a14896e 100644 --- a/tests/ctf-traces/fail/fail1/metadata +++ b/tests/ctf-traces/fail/fail1/metadata @@ -15,7 +15,7 @@ trace { byte_order = le; packet.header := struct { uint32_t magic; - uint8_t trace_uuid[16]; + uint8_t uuid[16]; uint32_t stream_id; }; }; diff --git a/tests/ctf-traces/succeed/succeed1/metadata b/tests/ctf-traces/succeed/succeed1/metadata index c8cf5d21..e7dae679 100644 --- a/tests/ctf-traces/succeed/succeed1/metadata +++ b/tests/ctf-traces/succeed/succeed1/metadata @@ -8,7 +8,7 @@ trace { byte_order = le; packet.header := struct { uint32_t magic; - uint8_t trace_uuid[16]; + uint8_t uuid[16]; }; }; diff --git a/tests/ctf-traces/succeed/succeed2/metadata b/tests/ctf-traces/succeed/succeed2/metadata index 9a2958d0..8db3e570 100644 --- a/tests/ctf-traces/succeed/succeed2/metadata +++ b/tests/ctf-traces/succeed/succeed2/metadata @@ -8,7 +8,7 @@ trace { byte_order = le; packet.header := struct { uint32_t magic; - uint8_t trace_uuid[16]; + uint8_t uuid[16]; }; };