+/*
+ * 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;
+
+ metadata_stream = viewer_stream->ctf_trace->metadata_stream;
+ 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);
+ } while (ret > 0);
+
+ fclose(metadata_stream->metadata_fp_write);
+ metadata_stream->metadata_fp_write = NULL;
+
+error:
+ return ret;
+}
+