+ * Return 0 on success, a negative value on error.
+ */
+static
+int get_new_metadata(struct lttng_live_ctx *ctx,
+ struct lttng_live_viewer_stream *viewer_stream,
+ char **metadata_buf)
+{
+ int ret = 0;
+ struct lttng_live_viewer_stream *metadata_stream;
+ size_t size, len_read = 0;
+
+ metadata_stream = viewer_stream->ctf_trace->metadata_stream;
+ if (!metadata_stream) {
+ fprintf(stderr, "[error] No metadata stream\n");
+ ret = -1;
+ goto error;
+ }
+ metadata_stream->metadata_len = 0;
+ ret = open_metadata_fp_write(metadata_stream, metadata_buf, &size);
+ if (ret < 0) {
+ goto error;
+ }
+
+ do {
+ if (lttng_live_should_quit()) {
+ ret = -1;
+ goto error;
+ }
+ /*
+ * get_one_metadata_packet returns the number of bytes
+ * received, 0 when we have received everything, a
+ * negative value on error.
+ */
+ ret = get_one_metadata_packet(ctx, metadata_stream);
+ if (ret > 0) {
+ len_read += ret;
+ }
+ if (!len_read) {
+ (void) poll(NULL, 0, ACTIVE_POLL_DELAY);
+ }
+ } while (ret > 0 || !len_read);
+
+ if (babeltrace_close_memstream(metadata_buf, &size,
+ metadata_stream->metadata_fp_write)) {
+ perror("babeltrace_close_memstream");
+ }
+ metadata_stream->metadata_fp_write = NULL;
+
+error:
+ return ret;
+}
+
+/*
+ * Assign the fields from a lttng_viewer_index to a packet_index.
+ */
+static
+void lttng_index_to_packet_index(struct lttng_viewer_index *lindex,
+ struct packet_index *pindex)
+{
+ assert(lindex);
+ assert(pindex);
+
+ pindex->offset = be64toh(lindex->offset);
+ pindex->packet_size = be64toh(lindex->packet_size);
+ pindex->content_size = be64toh(lindex->content_size);
+ pindex->ts_cycles.timestamp_begin = be64toh(lindex->timestamp_begin);
+ pindex->ts_cycles.timestamp_end = be64toh(lindex->timestamp_end);
+ pindex->events_discarded = be64toh(lindex->events_discarded);
+}
+
+/*
+ * Get one index for a stream.