ctf: append error causes when returning errors
[babeltrace.git] / src / plugins / ctf / common / metadata / ctf-meta-validate.c
CommitLineData
44c440bc 1/*
0235b0db 2 * SPDX-License-Identifier: MIT
44c440bc 3 *
0235b0db 4 * Copyright 2018 Philippe Proulx <pproulx@efficios.com>
44c440bc
PP
5 */
6
f7b785ac 7#define BT_COMP_LOG_SELF_COMP (log_cfg->self_comp)
50f6fce8 8#define BT_COMP_LOG_SELF_COMP_CLASS (log_cfg->self_comp_class)
f7b785ac 9#define BT_LOG_OUTPUT_LEVEL (log_cfg->log_level)
350ad6c1 10#define BT_LOG_TAG "PLUGIN/CTF/META/VALIDATE"
d9c39b0a 11#include "logging/comp-logging.h"
44c440bc 12
3fadfbc0 13#include <babeltrace2/babeltrace.h>
91d81473 14#include "common/macros.h"
578e048b 15#include "common/assert.h"
44c440bc
PP
16#include <glib.h>
17#include <stdint.h>
18#include <string.h>
19#include <inttypes.h>
20
21#include "ctf-meta-visitors.h"
f7b785ac 22#include "logging.h"
44c440bc
PP
23
24static
0746848c 25int validate_stream_class(struct ctf_stream_class *sc,
f7b785ac 26 struct meta_log_config *log_cfg)
44c440bc
PP
27{
28 int ret = 0;
5cd6d0e5
PP
29 struct ctf_field_class_int *int_fc;
30 struct ctf_field_class *fc;
44c440bc
PP
31
32 if (sc->is_translated) {
33 goto end;
34 }
35
5cd6d0e5
PP
36 fc = ctf_field_class_struct_borrow_member_field_class_by_name(
37 (void *) sc->packet_context_fc, "timestamp_begin");
38 if (fc) {
864cad70
PP
39 if (fc->type != CTF_FIELD_CLASS_TYPE_INT &&
40 fc->type != CTF_FIELD_CLASS_TYPE_ENUM) {
50f6fce8 41 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet context field class: "
5cd6d0e5 42 "`timestamp_begin` member is not an integer field class.");
44c440bc
PP
43 goto invalid;
44 }
45
5cd6d0e5 46 int_fc = (void *) fc;
44c440bc 47
5cd6d0e5 48 if (int_fc->is_signed) {
50f6fce8 49 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet context field class: "
44c440bc
PP
50 "`timestamp_begin` member is signed.");
51 goto invalid;
52 }
53 }
54
5cd6d0e5
PP
55 fc = ctf_field_class_struct_borrow_member_field_class_by_name(
56 (void *) sc->packet_context_fc, "timestamp_end");
57 if (fc) {
864cad70
PP
58 if (fc->type != CTF_FIELD_CLASS_TYPE_INT &&
59 fc->type != CTF_FIELD_CLASS_TYPE_ENUM) {
50f6fce8 60 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet context field class: "
5cd6d0e5 61 "`timestamp_end` member is not an integer field class.");
44c440bc
PP
62 goto invalid;
63 }
64
5cd6d0e5 65 int_fc = (void *) fc;
44c440bc 66
5cd6d0e5 67 if (int_fc->is_signed) {
50f6fce8 68 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet context field class: "
44c440bc
PP
69 "`timestamp_end` member is signed.");
70 goto invalid;
71 }
72 }
73
5cd6d0e5
PP
74 fc = ctf_field_class_struct_borrow_member_field_class_by_name(
75 (void *) sc->packet_context_fc, "events_discarded");
76 if (fc) {
864cad70
PP
77 if (fc->type != CTF_FIELD_CLASS_TYPE_INT &&
78 fc->type != CTF_FIELD_CLASS_TYPE_ENUM) {
50f6fce8 79 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet context field class: "
5cd6d0e5 80 "`events_discarded` member is not an integer field class.");
44c440bc
PP
81 goto invalid;
82 }
83
5cd6d0e5 84 int_fc = (void *) fc;
44c440bc 85
5cd6d0e5 86 if (int_fc->is_signed) {
50f6fce8 87 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet context field class: "
44c440bc
PP
88 "`events_discarded` member is signed.");
89 goto invalid;
90 }
91 }
92
5cd6d0e5
PP
93 fc = ctf_field_class_struct_borrow_member_field_class_by_name(
94 (void *) sc->packet_context_fc, "packet_seq_num");
95 if (fc) {
864cad70
PP
96 if (fc->type != CTF_FIELD_CLASS_TYPE_INT &&
97 fc->type != CTF_FIELD_CLASS_TYPE_ENUM) {
50f6fce8 98 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet context field class: "
5cd6d0e5 99 "`packet_seq_num` member is not an integer field class.");
44c440bc
PP
100 goto invalid;
101 }
102
5cd6d0e5 103 int_fc = (void *) fc;
44c440bc 104
5cd6d0e5 105 if (int_fc->is_signed) {
50f6fce8 106 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet context field class: "
44c440bc
PP
107 "`packet_seq_num` member is signed.");
108 goto invalid;
109 }
110 }
111
5cd6d0e5
PP
112 fc = ctf_field_class_struct_borrow_member_field_class_by_name(
113 (void *) sc->packet_context_fc, "packet_size");
114 if (fc) {
864cad70
PP
115 if (fc->type != CTF_FIELD_CLASS_TYPE_INT &&
116 fc->type != CTF_FIELD_CLASS_TYPE_ENUM) {
50f6fce8 117 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet context field class: "
5cd6d0e5 118 "`packet_size` member is not an integer field class.");
44c440bc
PP
119 goto invalid;
120 }
121
5cd6d0e5 122 int_fc = (void *) fc;
44c440bc 123
5cd6d0e5 124 if (int_fc->is_signed) {
50f6fce8 125 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet context field class: "
44c440bc
PP
126 "`packet_size` member is signed.");
127 goto invalid;
128 }
44c440bc
PP
129 }
130
5cd6d0e5
PP
131 fc = ctf_field_class_struct_borrow_member_field_class_by_name(
132 (void *) sc->packet_context_fc, "content_size");
133 if (fc) {
864cad70
PP
134 if (fc->type != CTF_FIELD_CLASS_TYPE_INT &&
135 fc->type != CTF_FIELD_CLASS_TYPE_ENUM) {
50f6fce8 136 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet context field class: "
5cd6d0e5 137 "`content_size` member is not an integer field class.");
44c440bc
PP
138 goto invalid;
139 }
140
5cd6d0e5 141 int_fc = (void *) fc;
44c440bc 142
5cd6d0e5 143 if (int_fc->is_signed) {
50f6fce8 144 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet context field class: "
44c440bc
PP
145 "`content_size` member is signed.");
146 goto invalid;
147 }
44c440bc
PP
148 }
149
5cd6d0e5
PP
150 fc = ctf_field_class_struct_borrow_member_field_class_by_name(
151 (void *) sc->event_header_fc, "id");
152 if (fc) {
864cad70
PP
153 if (fc->type != CTF_FIELD_CLASS_TYPE_INT &&
154 fc->type != CTF_FIELD_CLASS_TYPE_ENUM) {
50f6fce8 155 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid event header field class: "
5cd6d0e5 156 "`id` member is not an integer field class.");
44c440bc
PP
157 goto invalid;
158 }
159
5cd6d0e5 160 int_fc = (void *) fc;
44c440bc 161
5cd6d0e5 162 if (int_fc->is_signed) {
50f6fce8 163 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid event header field class: "
44c440bc
PP
164 "`id` member is signed.");
165 goto invalid;
166 }
167 } else {
168 if (sc->event_classes->len > 1) {
50f6fce8 169 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid event header field class: "
44c440bc
PP
170 "missing `id` member as there's "
171 "more than one event class.");
172 goto invalid;
173 }
174 }
175
176 goto end;
177
178invalid:
179 ret = -1;
180
181end:
182 return ret;
183}
184
185BT_HIDDEN
0746848c 186int ctf_trace_class_validate(struct ctf_trace_class *ctf_tc,
f7b785ac 187 struct meta_log_config *log_cfg)
44c440bc
PP
188{
189 int ret = 0;
5cd6d0e5 190 struct ctf_field_class_int *int_fc;
44c440bc
PP
191 uint64_t i;
192
193 if (!ctf_tc->is_translated) {
5cd6d0e5
PP
194 struct ctf_field_class *fc;
195
196 fc = ctf_field_class_struct_borrow_member_field_class_by_name(
197 (void *) ctf_tc->packet_header_fc, "magic");
198 if (fc) {
199 struct ctf_named_field_class *named_fc =
200 ctf_field_class_struct_borrow_member_by_index(
201 (void *) ctf_tc->packet_header_fc,
44c440bc
PP
202 0);
203
5cd6d0e5 204 if (named_fc->fc != fc) {
50f6fce8 205 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet header field class: "
44c440bc
PP
206 "`magic` member is not the first member.");
207 goto invalid;
208 }
209
864cad70
PP
210 if (fc->type != CTF_FIELD_CLASS_TYPE_INT &&
211 fc->type != CTF_FIELD_CLASS_TYPE_ENUM) {
50f6fce8 212 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet header field class: "
5cd6d0e5 213 "`magic` member is not an integer field class.");
44c440bc
PP
214 goto invalid;
215 }
216
5cd6d0e5 217 int_fc = (void *) fc;
44c440bc 218
5cd6d0e5 219 if (int_fc->is_signed) {
50f6fce8 220 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet header field class: "
44c440bc
PP
221 "`magic` member is signed.");
222 goto invalid;
223 }
224
5cd6d0e5 225 if (int_fc->base.size != 32) {
50f6fce8 226 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet header field class: "
44c440bc
PP
227 "`magic` member is not 32-bit.");
228 goto invalid;
229 }
230 }
231
5cd6d0e5
PP
232 fc = ctf_field_class_struct_borrow_member_field_class_by_name(
233 (void *) ctf_tc->packet_header_fc, "stream_id");
234 if (fc) {
864cad70
PP
235 if (fc->type != CTF_FIELD_CLASS_TYPE_INT &&
236 fc->type != CTF_FIELD_CLASS_TYPE_ENUM) {
50f6fce8 237 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet header field class: "
5cd6d0e5 238 "`stream_id` member is not an integer field class.");
44c440bc
PP
239 goto invalid;
240 }
241
5cd6d0e5 242 int_fc = (void *) fc;
44c440bc 243
5cd6d0e5 244 if (int_fc->is_signed) {
50f6fce8 245 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet header field class: "
44c440bc
PP
246 "`stream_id` member is signed.");
247 goto invalid;
248 }
249 } else {
250 if (ctf_tc->stream_classes->len > 1) {
50f6fce8 251 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet header field class: "
44c440bc
PP
252 "missing `stream_id` member as there's "
253 "more than one stream class.");
254 goto invalid;
255 }
256 }
257
5cd6d0e5
PP
258 fc = ctf_field_class_struct_borrow_member_field_class_by_name(
259 (void *) ctf_tc->packet_header_fc,
44c440bc 260 "stream_instance_id");
5cd6d0e5 261 if (fc) {
864cad70
PP
262 if (fc->type != CTF_FIELD_CLASS_TYPE_INT &&
263 fc->type != CTF_FIELD_CLASS_TYPE_ENUM) {
50f6fce8 264 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet header field class: "
5cd6d0e5 265 "`stream_instance_id` member is not an integer field class.");
44c440bc
PP
266 goto invalid;
267 }
268
5cd6d0e5 269 int_fc = (void *) fc;
44c440bc 270
5cd6d0e5 271 if (int_fc->is_signed) {
50f6fce8 272 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet header field class: "
44c440bc
PP
273 "`stream_instance_id` member is signed.");
274 goto invalid;
275 }
276 }
277
5cd6d0e5
PP
278 fc = ctf_field_class_struct_borrow_member_field_class_by_name(
279 (void *) ctf_tc->packet_header_fc, "uuid");
280 if (fc) {
281 struct ctf_field_class_array *array_fc = (void *) fc;
44c440bc 282
864cad70 283 if (fc->type != CTF_FIELD_CLASS_TYPE_ARRAY) {
50f6fce8 284 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet header field class: "
5cd6d0e5 285 "`uuid` member is not an array field class.");
44c440bc
PP
286 goto invalid;
287 }
288
5cd6d0e5 289 array_fc = (void *) fc;
44c440bc 290
5cd6d0e5 291 if (array_fc->length != 16) {
50f6fce8 292 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet header field class: "
5cd6d0e5 293 "`uuid` member is not a 16-element array field class.");
44c440bc
PP
294 goto invalid;
295 }
296
864cad70 297 if (array_fc->base.elem_fc->type != CTF_FIELD_CLASS_TYPE_INT) {
50f6fce8 298 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet header field class: "
5cd6d0e5
PP
299 "`uuid` member's element field class is not "
300 "an integer field class.");
44c440bc
PP
301 goto invalid;
302 }
303
5cd6d0e5 304 int_fc = (void *) array_fc->base.elem_fc;
44c440bc 305
5cd6d0e5 306 if (int_fc->is_signed) {
50f6fce8 307 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet header field class: "
5cd6d0e5
PP
308 "`uuid` member's element field class "
309 "is a signed integer field class.");
44c440bc
PP
310 goto invalid;
311 }
312
5cd6d0e5 313 if (int_fc->base.size != 8) {
50f6fce8 314 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet header field class: "
5cd6d0e5
PP
315 "`uuid` member's element field class "
316 "is not an 8-bit integer field class.");
44c440bc
PP
317 goto invalid;
318 }
319
5cd6d0e5 320 if (int_fc->base.base.alignment != 8) {
50f6fce8 321 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid packet header field class: "
5cd6d0e5 322 "`uuid` member's element field class's "
44c440bc
PP
323 "alignment is not 8.");
324 goto invalid;
325 }
326 }
327 }
328
329 for (i = 0; i < ctf_tc->stream_classes->len; i++) {
330 struct ctf_stream_class *sc =
331 ctf_tc->stream_classes->pdata[i];
332
f7b785ac 333 ret = validate_stream_class(sc, log_cfg);
44c440bc 334 if (ret) {
50f6fce8 335 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Invalid stream class: sc-id=%" PRIu64, sc->id);
44c440bc
PP
336 goto invalid;
337 }
338 }
339
340 goto end;
341
342invalid:
343 ret = -1;
344
345end:
346 return ret;
347}
This page took 0.077494 seconds and 4 git commands to generate.