+/*
+ * 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 {
+ /*
+ * 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 (fclose(metadata_stream->metadata_fp_write))
+ perror("fclose");
+ metadata_stream->metadata_fp_write = NULL;
+
+error:
+ return ret;
+}
+