+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;
+
+ if (variant->type.atype != ustctl_atype_variant) {
+ ret = -EINVAL;
+ goto end;
+ }
+ nr_choices = variant->type.u.variant.nr_choices;
+ (*iter_field)++;
+ ret = lttng_metadata_printf(session,
+ " variant <_%s> {\n",
+ variant->type.u.variant.tag_name);
+ 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);
+ }
+ ret = lttng_metadata_printf(session,
+ " } _%s;\n",
+ variant->name);
+ if (ret) {
+ goto end;
+ }