+/*
+ * TODO: for now, we treat the metadata file as a simple text file
+ * (without any header nor packets nor padding).
+ */
+static
+int ctf_open_trace_metadata_read(struct trace_descriptor *td)
+{
+ struct ctf_scanner *scanner;
+ FILE *fp;
+ int ret = 0;
+
+ td->ctf_trace.metadata.fd = openat(td->ctf_trace.dirfd,
+ "metadata", O_RDONLY);
+ if (td->ctf_trace.metadata.fd < 0) {
+ fprintf(stdout, "Unable to open metadata.\n");
+ return td->ctf_trace.metadata.fd;
+ }
+
+ if (babeltrace_debug)
+ yydebug = 1;
+
+ fp = fdopen(td->ctf_trace.metadata.fd, "r");
+ if (!fp) {
+ fprintf(stdout, "Unable to open metadata stream.\n");
+ ret = -errno;
+ goto end_stream;
+ }
+
+ scanner = ctf_scanner_alloc(fp);
+ if (!scanner) {
+ fprintf(stdout, "Error allocating scanner\n");
+ ret = -ENOMEM;
+ goto end_scanner_alloc;
+ }
+ ret = ctf_scanner_append_ast(scanner);
+ if (ret) {
+ fprintf(stdout, "Error creating AST\n");
+ goto end;
+ }
+
+ if (babeltrace_debug) {
+ ret = ctf_visitor_print_xml(stdout, 0, &scanner->ast->root);
+ if (ret) {
+ fprintf(stdout, "Error visiting AST for XML output\n");
+ goto end;
+ }
+ }
+
+ ret = ctf_visitor_semantic_check(stdout, 0, &scanner->ast->root);
+ if (ret) {
+ fprintf(stdout, "Error in CTF semantic validation %d\n", ret);
+ goto end;
+ }
+ ret = ctf_visitor_construct_metadata(stdout, 0, &scanner->ast->root,
+ &td->ctf_trace, BYTE_ORDER);
+ if (ret) {
+ fprintf(stdout, "Error in CTF metadata constructor %d\n", ret);
+ goto end;
+ }
+end:
+ ctf_scanner_free(scanner);
+end_scanner_alloc:
+ fclose(fp);
+end_stream:
+ close(td->ctf_trace.metadata.fd);
+ return ret;
+}
+