+ }
+ nesting--;
+ sanitize_ctf_identifier(identifier, field_name);
+ ret = print_tabs(session, nesting);
+ if (ret) {
+ goto end;
+ }
+ ret = lttng_metadata_printf(session, "} _%s;\n",
+ identifier);
+end:
+ (*iter_field)++;
+ return ret;
+}
+
+static
+int _lttng_variant_statedump(struct ust_registry_session *session,
+ const struct ustctl_field *fields, size_t nr_fields,
+ size_t *iter_field, size_t nesting)
+{
+ const struct ustctl_field *variant = &fields[*iter_field];
+ uint32_t nr_choices, i;
+ int ret;
+ char identifier[LTTNG_UST_SYM_NAME_LEN];
+
+ if (variant->type.atype != ustctl_atype_variant) {
+ ret = -EINVAL;
+ goto end;
+ }
+ nr_choices = variant->type.u.variant.nr_choices;
+ (*iter_field)++;
+ sanitize_ctf_identifier(identifier, variant->type.u.variant.tag_name);
+ ret = print_tabs(session, nesting);
+ if (ret) {
+ goto end;
+ }
+ ret = lttng_metadata_printf(session,
+ "variant <_%s> {\n",
+ identifier);
+ if (ret) {
+ goto end;
+ }
+
+ for (i = 0; i < nr_choices; i++) {
+ if (*iter_field >= nr_fields) {
+ ret = -EOVERFLOW;
+ goto end;
+ }
+ ret = _lttng_field_statedump(session,
+ fields, nr_fields,
+ iter_field, nesting + 1);