+enum lttng_error_code lttng_session_get_trace_format_descriptor(const struct lttng_session *session,
+ struct lttng_trace_format_descriptor **p_lttng_trace_format_descriptor)
+{
+ lttng_error_code ret_code;
+ const struct lttng_session_extended *extended = nullptr;
+ struct lttng_trace_format_descriptor *local_descriptor = nullptr;
+ ssize_t deserialiazed = 0;
+ lttng::trace_format_descriptor::uptr p_trace_format;
+
+ if (!session || !session->extended.ptr) {
+ ret_code = LTTNG_ERR_INVALID;
+ goto error;
+ }
+
+ extended = (struct lttng_session_extended *) session->extended.ptr;
+
+ {
+ struct lttng_payload_view view = lttng_payload_view_from_buffer_view(
+ &extended->serialized_trace_format_descriptor, 0,
+ extended->serialized_trace_format_descriptor.size);
+ deserialiazed = lttng::trace_format_descriptor::create_from_payload(
+ &view, p_trace_format);
+ if (deserialiazed < 0 ||
+ deserialiazed !=
+ extended->serialized_trace_format_descriptor.size) {
+ ret_code = LTTNG_ERR_INVALID;
+ goto error;
+ }
+ }
+
+ local_descriptor = reinterpret_cast<struct lttng_trace_format_descriptor *>(
+ p_trace_format.release());
+
+ *p_lttng_trace_format_descriptor = local_descriptor;
+ local_descriptor = nullptr;
+ ret_code = LTTNG_OK;
+error:
+ lttng_trace_format_descriptor_destroy(local_descriptor);
+ return ret_code;
+}