#include <ust-fd.h>
#include <ust-helper.h>
#include <lttng/ust-error.h>
-#include <lttng/ust-events.h>
#include <ust-dynamic-type.h>
#include <usterr-signal-safe.h>
+#include "../liblttng-ust/ust-events-internal.h"
#include "../liblttng-ust/compat.h"
#define USTCOMM_CODE_OFFSET(code) \
case atype_integer:
case atype_float:
case atype_string:
- case atype_enum:
- case atype_array:
- case atype_sequence:
return 1;
- case atype_struct:
- return count_fields_recursive(lt->u.legacy._struct.nr_fields,
- lt->u.legacy._struct.fields) + 1;
case atype_enum_nestable:
return count_one_type(lt->u.enum_nestable.container_type) + 1;
case atype_array_nestable:
return 0;
}
-static
-int serialize_basic_type(struct lttng_session *session,
- enum ustctl_abstract_types *uatype,
- enum lttng_abstract_types atype,
- union _ustctl_basic_type *ubt,
- const union _lttng_basic_type *lbt)
-{
- switch (atype) {
- case atype_integer:
- {
- if (serialize_integer_type(&ubt->integer, &lbt->integer))
- return -EINVAL;
- *uatype = ustctl_atype_integer;
- break;
- }
- case atype_string:
- {
- int32_t encoding;
-
- if (serialize_string_encoding(&encoding, lbt->string.encoding))
- return -EINVAL;
- ubt->string.encoding = encoding;
- *uatype = ustctl_atype_string;
- break;
- }
- case atype_float:
- {
- struct ustctl_float_type *uft;
- const struct lttng_float_type *lft;
-
- uft = &ubt->_float;
- lft = &lbt->_float;
- uft->exp_dig = lft->exp_dig;
- uft->mant_dig = lft->mant_dig;
- uft->alignment = lft->alignment;
- uft->reverse_byte_order = lft->reverse_byte_order;
- *uatype = ustctl_atype_float;
- break;
- }
- case atype_enum:
- {
- strncpy(ubt->enumeration.name, lbt->enumeration.desc->name,
- LTTNG_UST_SYM_NAME_LEN);
- ubt->enumeration.name[LTTNG_UST_SYM_NAME_LEN - 1] = '\0';
- if (serialize_integer_type(&ubt->enumeration.container_type,
- &lbt->enumeration.container_type))
- return -EINVAL;
- if (session) {
- const struct lttng_enum *_enum;
-
- _enum = lttng_ust_enum_get_from_desc(session, lbt->enumeration.desc);
- if (!_enum)
- return -EINVAL;
- ubt->enumeration.id = _enum->id;
- } else {
- ubt->enumeration.id = -1ULL;
- }
- *uatype = ustctl_atype_enum;
- break;
- }
- case atype_array:
- case atype_array_nestable:
- case atype_sequence:
- case atype_sequence_nestable:
- case atype_enum_nestable:
- default:
- return -EINVAL;
- }
- return 0;
-}
-
static
int serialize_dynamic_type(struct lttng_session *session,
struct ustctl_field *fields, size_t *iter_output,
switch (lt->atype) {
case atype_integer:
- case atype_float:
- case atype_string:
- case atype_enum:
{
struct ustctl_field *uf = &fields[*iter_output];
struct ustctl_type *ut = &uf->type;
- enum ustctl_abstract_types atype;
if (field_name) {
strncpy(uf->name, field_name, LTTNG_UST_SYM_NAME_LEN);
} else {
uf->name[0] = '\0';
}
- ret = serialize_basic_type(session, &atype, lt->atype,
- &ut->u.legacy.basic, <->u.legacy.basic);
+ ret = serialize_integer_type(&ut->u.integer, <->u.integer);
if (ret)
return ret;
- ut->atype = atype;
+ ut->atype = ustctl_atype_integer;
(*iter_output)++;
break;
}
- case atype_array:
+ case atype_float:
{
struct ustctl_field *uf = &fields[*iter_output];
struct ustctl_type *ut = &uf->type;
- struct ustctl_basic_type *ubt;
- const struct lttng_basic_type *lbt;
- enum ustctl_abstract_types atype;
+ struct ustctl_float_type *uft;
+ const struct lttng_float_type *lft;
if (field_name) {
strncpy(uf->name, field_name, LTTNG_UST_SYM_NAME_LEN);
} else {
uf->name[0] = '\0';
}
- ut->atype = ustctl_atype_array;
- ubt = &ut->u.legacy.array.elem_type;
- lbt = <->u.legacy.array.elem_type;
- ut->u.legacy.array.length = lt->u.legacy.array.length;
- ret = serialize_basic_type(session, &atype, lbt->atype,
- &ubt->u.basic, &lbt->u.basic);
- if (ret)
- return -EINVAL;
- ubt->atype = atype;
+ uft = &ut->u._float;
+ lft = <->u._float;
+ uft->exp_dig = lft->exp_dig;
+ uft->mant_dig = lft->mant_dig;
+ uft->alignment = lft->alignment;
+ uft->reverse_byte_order = lft->reverse_byte_order;
+ ut->atype = ustctl_atype_float;
(*iter_output)++;
break;
}
- case atype_array_nestable:
+ case atype_string:
{
struct ustctl_field *uf = &fields[*iter_output];
struct ustctl_type *ut = &uf->type;
+ int32_t encoding;
if (field_name) {
strncpy(uf->name, field_name, LTTNG_UST_SYM_NAME_LEN);
} else {
uf->name[0] = '\0';
}
- ut->atype = ustctl_atype_array_nestable;
- ut->u.array_nestable.length = lt->u.array_nestable.length;
- ut->u.array_nestable.alignment = lt->u.array_nestable.alignment;
- (*iter_output)++;
-
- ret = serialize_one_type(session, fields, iter_output, NULL,
- lt->u.array_nestable.elem_type);
+ ret = serialize_string_encoding(&encoding, lt->u.string.encoding);
if (ret)
- return -EINVAL;
+ return ret;
+ ut->u.string.encoding = encoding;
+ ut->atype = ustctl_atype_string;
+ (*iter_output)++;
break;
}
- case atype_sequence:
+ case atype_array_nestable:
{
struct ustctl_field *uf = &fields[*iter_output];
struct ustctl_type *ut = &uf->type;
- struct ustctl_basic_type *ubt;
- const struct lttng_basic_type *lbt;
- enum ustctl_abstract_types atype;
if (field_name) {
strncpy(uf->name, field_name, LTTNG_UST_SYM_NAME_LEN);
} else {
uf->name[0] = '\0';
}
- uf->type.atype = ustctl_atype_sequence;
- ubt = &ut->u.legacy.sequence.length_type;
- lbt = <->u.legacy.sequence.length_type;
- ret = serialize_basic_type(session, &atype, lbt->atype,
- &ubt->u.basic, &lbt->u.basic);
- if (ret)
- return -EINVAL;
- ubt->atype = atype;
- ubt = &ut->u.legacy.sequence.elem_type;
- lbt = <->u.legacy.sequence.elem_type;
- ret = serialize_basic_type(session, &atype, lbt->atype,
- &ubt->u.basic, &lbt->u.basic);
+ ut->atype = ustctl_atype_array_nestable;
+ ut->u.array_nestable.length = lt->u.array_nestable.length;
+ ut->u.array_nestable.alignment = lt->u.array_nestable.alignment;
+ (*iter_output)++;
+
+ ret = serialize_one_type(session, fields, iter_output, NULL,
+ lt->u.array_nestable.elem_type);
if (ret)
return -EINVAL;
- ubt->atype = atype;
- (*iter_output)++;
break;
}
case atype_sequence_nestable:
return -EINVAL;
break;
}
- case atype_struct:
- {
- struct ustctl_field *uf = &fields[*iter_output];
-
- if (field_name) {
- strncpy(uf->name, field_name, LTTNG_UST_SYM_NAME_LEN);
- uf->name[LTTNG_UST_SYM_NAME_LEN - 1] = '\0';
- } else {
- uf->name[0] = '\0';
- }
- uf->type.atype = ustctl_atype_struct;
- uf->type.u.legacy._struct.nr_fields = lt->u.legacy._struct.nr_fields;
- (*iter_output)++;
-
- ret = serialize_fields(session, fields, iter_output,
- lt->u.legacy._struct.nr_fields,
- lt->u.legacy._struct.fields);
- if (ret)
- return -EINVAL;
- break;
- }
case atype_struct_nestable:
{
struct ustctl_field *uf = &fields[*iter_output];