fix: optional fields
[babeltrace.git] / plugins / libctfcopytrace / ctfcopytrace.c
CommitLineData
91b73004
JD
1/*
2 * copytrace.c
3 *
4 * Babeltrace library to create a copy of a CTF trace
5 *
6 * Copyright 2017 Julien Desfossez <jdesfossez@efficios.com>
7 *
8 * Author: Julien Desfossez <jdesfossez@efficios.com>
9 *
10 * Permission is hereby granted, free of charge, to any person obtaining a copy
11 * of this software and associated documentation files (the "Software"), to deal
12 * in the Software without restriction, including without limitation the rights
13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 * copies of the Software, and to permit persons to whom the Software is
15 * furnished to do so, subject to the following conditions:
16 *
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
19 *
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 * SOFTWARE.
27 */
28
29#include <babeltrace/ctf-ir/event.h>
30#include <babeltrace/ctf-ir/packet.h>
31#include <babeltrace/ctf-ir/event-class.h>
32#include <babeltrace/ctf-ir/stream.h>
33#include <babeltrace/ctf-ir/stream-class.h>
34#include <babeltrace/ctf-ir/clock-class.h>
35#include <babeltrace/ctf-ir/fields.h>
36#include <babeltrace/ctf-writer/stream.h>
37#include <assert.h>
38
39#include "ctfcopytrace.h"
b2f1f465 40#include "clock-fields.h"
91b73004 41
9ac68eb1 42BT_HIDDEN
91b73004
JD
43struct bt_ctf_clock_class *ctf_copy_clock_class(FILE *err,
44 struct bt_ctf_clock_class *clock_class)
45{
46 int64_t offset, offset_s;
47 int int_ret;
48 uint64_t u64_ret;
49 const char *name, *description;
50 struct bt_ctf_clock_class *writer_clock_class = NULL;
51
52 assert(err && clock_class);
53
54 name = bt_ctf_clock_class_get_name(clock_class);
55 if (!name) {
56 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
57 __LINE__);
58 goto end;
59 }
60
61 writer_clock_class = bt_ctf_clock_class_create(name);
62 if (!writer_clock_class) {
63 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
64 __LINE__);
65 goto end;
66 }
67
68 description = bt_ctf_clock_class_get_description(clock_class);
69 if (!description) {
70 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
71 __LINE__);
72 goto end_destroy;
73 }
74
75 int_ret = bt_ctf_clock_class_set_description(writer_clock_class,
76 description);
77 if (int_ret != 0) {
78 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
79 __LINE__);
80 goto end_destroy;
81 }
82
83 u64_ret = bt_ctf_clock_class_get_frequency(clock_class);
84 if (u64_ret == -1ULL) {
85 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
86 __LINE__);
87 goto end_destroy;
88 }
89 int_ret = bt_ctf_clock_class_set_frequency(writer_clock_class, u64_ret);
90 if (int_ret != 0) {
91 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
92 __LINE__);
93 goto end_destroy;
94 }
95
96 u64_ret = bt_ctf_clock_class_get_precision(clock_class);
97 if (u64_ret == -1ULL) {
98 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
99 __LINE__);
100 goto end_destroy;
101 }
102 int_ret = bt_ctf_clock_class_set_precision(writer_clock_class,
103 u64_ret);
104 if (int_ret != 0) {
105 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
106 __LINE__);
107 goto end_destroy;
108 }
109
110 int_ret = bt_ctf_clock_class_get_offset_s(clock_class, &offset_s);
111 if (int_ret != 0) {
112 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
113 __LINE__);
114 goto end_destroy;
115 }
116
117 int_ret = bt_ctf_clock_class_set_offset_s(writer_clock_class, offset_s);
118 if (int_ret != 0) {
119 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
120 __LINE__);
121 goto end_destroy;
122 }
123
124 int_ret = bt_ctf_clock_class_get_offset_cycles(clock_class, &offset);
125 if (int_ret != 0) {
126 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
127 __LINE__);
128 goto end_destroy;
129 }
130
131 int_ret = bt_ctf_clock_class_set_offset_cycles(writer_clock_class, offset);
132 if (int_ret != 0) {
133 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
134 __LINE__);
135 goto end_destroy;
136 }
137
acd6aeb1 138 int_ret = bt_ctf_clock_class_is_absolute(clock_class);
91b73004
JD
139 if (int_ret == -1) {
140 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
141 __LINE__);
142 goto end_destroy;
143 }
144
145 int_ret = bt_ctf_clock_class_set_is_absolute(writer_clock_class, int_ret);
146 if (int_ret != 0) {
147 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
148 __LINE__);
149 goto end_destroy;
150 }
151
152 goto end;
153
154end_destroy:
155 BT_PUT(writer_clock_class);
156end:
157 return writer_clock_class;
158}
159
9ac68eb1 160BT_HIDDEN
91b73004
JD
161enum bt_component_status ctf_copy_clock_classes(FILE *err,
162 struct bt_ctf_trace *writer_trace,
163 struct bt_ctf_stream_class *writer_stream_class,
164 struct bt_ctf_trace *trace)
165{
166 enum bt_component_status ret;
91b73004
JD
167 int int_ret, clock_class_count, i;
168
169 clock_class_count = bt_ctf_trace_get_clock_class_count(trace);
170
171 for (i = 0; i < clock_class_count; i++) {
172 struct bt_ctf_clock_class *writer_clock_class;
173 struct bt_ctf_clock_class *clock_class =
9ac68eb1 174 bt_ctf_trace_get_clock_class_by_index(trace, i);
91b73004
JD
175
176 if (!clock_class) {
177 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
178 __LINE__);
179 ret = BT_COMPONENT_STATUS_ERROR;
180 goto end;
181 }
182
183 writer_clock_class = ctf_copy_clock_class(err, clock_class);
184 bt_put(clock_class);
185 if (!writer_clock_class) {
186 fprintf(err, "Failed to copy clock class");
187 ret = BT_COMPONENT_STATUS_ERROR;
188 goto end;
189 }
190
191 int_ret = bt_ctf_trace_add_clock_class(writer_trace, writer_clock_class);
192 if (int_ret != 0) {
193 BT_PUT(writer_clock_class);
194 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
195 __LINE__);
196 ret = BT_COMPONENT_STATUS_ERROR;
197 goto end;
198 }
199
200 /*
b2f1f465 201 * Ownership transferred to the trace.
91b73004
JD
202 */
203 bt_put(writer_clock_class);
204 }
205
206 ret = BT_COMPONENT_STATUS_OK;
207
208end:
209 return ret;
210}
211
9ac68eb1 212BT_HIDDEN
91b73004
JD
213struct bt_ctf_event_class *ctf_copy_event_class(FILE *err,
214 struct bt_ctf_event_class *event_class)
215{
216 struct bt_ctf_event_class *writer_event_class = NULL;
217 const char *name;
218 int count, i;
219
220 name = bt_ctf_event_class_get_name(event_class);
221 if (!name) {
222 fprintf(err, "[error] %s in %s:%d\n", __func__,
223 __FILE__, __LINE__);
224 goto end;
225 }
226
227 writer_event_class = bt_ctf_event_class_create(name);
228 if (!writer_event_class) {
229 fprintf(err, "[error] %s in %s:%d\n", __func__,
230 __FILE__, __LINE__);
231 goto end;
232 }
233
234 count = bt_ctf_event_class_get_attribute_count(event_class);
235 for (i = 0; i < count; i++) {
236 const char *attr_name;
237 struct bt_value *attr_value;
238 int ret;
239
9ac68eb1
PP
240 attr_name = bt_ctf_event_class_get_attribute_name_by_index(
241 event_class, i);
91b73004
JD
242 if (!attr_name) {
243 fprintf(err, "[error] %s in %s:%d\n", __func__,
244 __FILE__, __LINE__);
9ae49d3d 245 goto error;
91b73004 246 }
9ac68eb1
PP
247 attr_value = bt_ctf_event_class_get_attribute_value_by_index(
248 event_class, i);
91b73004
JD
249 if (!attr_value) {
250 fprintf(err, "[error] %s in %s:%d\n", __func__,
251 __FILE__, __LINE__);
9ae49d3d 252 goto error;
91b73004
JD
253 }
254
255 ret = bt_ctf_event_class_set_attribute(writer_event_class,
256 attr_name, attr_value);
9ae49d3d 257 BT_PUT(attr_value);
91b73004
JD
258 if (ret < 0) {
259 fprintf(err, "[error] %s in %s:%d\n", __func__,
260 __FILE__, __LINE__);
9ae49d3d 261 goto error;
91b73004
JD
262 }
263 }
264
9ac68eb1 265 count = bt_ctf_event_class_get_payload_type_field_count(event_class);
91b73004
JD
266 for (i = 0; i < count; i++) {
267 const char *field_name;
268 struct bt_ctf_field_type *field_type;
269 int ret;
270
9ac68eb1
PP
271 ret = bt_ctf_event_class_get_payload_type_field_by_index(
272 event_class, &field_name, &field_type, i);
91b73004
JD
273 if (ret < 0) {
274 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__);
9ae49d3d 275 goto error;
91b73004
JD
276 }
277
278 ret = bt_ctf_event_class_add_field(writer_event_class, field_type,
279 field_name);
9ae49d3d 280 BT_PUT(field_type);
91b73004
JD
281 if (ret < 0) {
282 fprintf(err, "[error] Cannot add field %s\n", field_name);
283 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__);
9ae49d3d 284 goto error;
91b73004 285 }
91b73004
JD
286 }
287
9ae49d3d
JD
288 goto end;
289
290error:
291 BT_PUT(writer_event_class);
91b73004
JD
292end:
293 return writer_event_class;
294}
295
9ac68eb1 296BT_HIDDEN
91b73004
JD
297enum bt_component_status ctf_copy_event_classes(FILE *err,
298 struct bt_ctf_stream_class *stream_class,
299 struct bt_ctf_stream_class *writer_stream_class)
300{
301 enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
9ae49d3d 302 struct bt_ctf_event_class *event_class = NULL, *writer_event_class = NULL;
91b73004
JD
303 int count, i;
304
305 count = bt_ctf_stream_class_get_event_class_count(stream_class);
306 if (count < 0) {
307 fprintf(err, "[error] %s in %s:%d\n", __func__,
308 __FILE__, __LINE__);
309 goto end;
310 }
311
312 for (i = 0; i < count; i++) {
91b73004
JD
313 struct bt_ctf_field_type *context;
314 int int_ret;
315
9ac68eb1 316 event_class = bt_ctf_stream_class_get_event_class_by_index(
91b73004
JD
317 stream_class, i);
318 if (!event_class) {
319 fprintf(err, "[error] %s in %s:%d\n", __func__,
320 __FILE__, __LINE__);
321 ret = BT_COMPONENT_STATUS_ERROR;
9ae49d3d 322 goto error;
91b73004
JD
323 }
324 writer_event_class = ctf_copy_event_class(err, event_class);
325 if (!writer_event_class) {
326 fprintf(err, "[error] %s in %s:%d\n", __func__,
327 __FILE__, __LINE__);
328 ret = BT_COMPONENT_STATUS_ERROR;
9ae49d3d 329 goto error;
91b73004
JD
330 }
331
332 context = bt_ctf_event_class_get_context_type(event_class);
9ae49d3d
JD
333 if (!context) {
334 fprintf(err, "[error] %s in %s:%d\n", __func__,
335 __FILE__, __LINE__);
336 ret = BT_COMPONENT_STATUS_ERROR;
337 goto error;
338 }
91b73004 339 ret = bt_ctf_event_class_set_context_type(writer_event_class, context);
9ae49d3d 340 BT_PUT(context);
91b73004
JD
341 if (ret < 0) {
342 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
343 __LINE__);
9ae49d3d 344 goto error;
91b73004
JD
345 }
346
347 int_ret = bt_ctf_stream_class_add_event_class(writer_stream_class,
348 writer_event_class);
349 if (int_ret < 0) {
350 fprintf(err, "[error] Failed to add event class\n");
351 fprintf(err, "[error] %s in %s:%d\n", __func__,
352 __FILE__, __LINE__);
353 ret = BT_COMPONENT_STATUS_ERROR;
9ae49d3d 354 goto error;
91b73004 355 }
9ae49d3d
JD
356 BT_PUT(writer_event_class);
357 BT_PUT(event_class);
91b73004
JD
358 }
359
9ae49d3d
JD
360 goto end;
361
362error:
363 bt_put(event_class);
364 bt_put(writer_event_class);
91b73004
JD
365end:
366 return ret;
367}
368
9ac68eb1 369BT_HIDDEN
91b73004 370struct bt_ctf_stream_class *ctf_copy_stream_class(FILE *err,
b2f1f465
JD
371 struct bt_ctf_stream_class *stream_class,
372 struct bt_ctf_trace *writer_trace,
373 bool override_ts64)
91b73004 374{
9ae49d3d
JD
375 struct bt_ctf_field_type *type = NULL;
376 struct bt_ctf_stream_class *writer_stream_class = NULL;
91b73004
JD
377 int ret_int;
378 const char *name = bt_ctf_stream_class_get_name(stream_class);
379
380 if (strlen(name) == 0) {
381 name = NULL;
382 }
383
384 writer_stream_class = bt_ctf_stream_class_create(name);
385 if (!writer_stream_class) {
386 fprintf(err, "[error] %s in %s:%d\n",
387 __func__, __FILE__, __LINE__);
388 goto end;
389 }
390
391 type = bt_ctf_stream_class_get_packet_context_type(stream_class);
392 if (!type) {
393 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
394 __LINE__);
395 goto error;
396 }
397
398 ret_int = bt_ctf_stream_class_set_packet_context_type(
399 writer_stream_class, type);
91b73004
JD
400 if (ret_int < 0) {
401 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
402 __LINE__);
403 goto error;
404 }
9ae49d3d 405 BT_PUT(type);
91b73004
JD
406
407 type = bt_ctf_stream_class_get_event_header_type(stream_class);
408 if (!type) {
409 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
410 __LINE__);
411 goto error;
412 }
413
b2f1f465 414 if (override_ts64) {
9ae49d3d
JD
415 struct bt_ctf_field_type *new_event_header_type;
416
b2f1f465
JD
417 new_event_header_type = override_header_type(err, type,
418 writer_trace);
b2f1f465
JD
419 if (!new_event_header_type) {
420 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
421 __LINE__);
422 goto error;
423 }
0f29db56
JD
424 ret_int = bt_ctf_stream_class_set_event_header_type(
425 writer_stream_class, new_event_header_type);
9ae49d3d 426 BT_PUT(new_event_header_type);
0f29db56
JD
427 if (ret_int < 0) {
428 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
429 __LINE__);
430 goto error;
431 }
b2f1f465 432 } else {
0f29db56
JD
433 ret_int = bt_ctf_stream_class_set_event_header_type(
434 writer_stream_class, type);
0f29db56
JD
435 if (ret_int < 0) {
436 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
437 __LINE__);
438 goto error;
439 }
91b73004 440 }
9ae49d3d 441 BT_PUT(type);
91b73004
JD
442
443 type = bt_ctf_stream_class_get_event_context_type(stream_class);
444 if (type) {
445 ret_int = bt_ctf_stream_class_set_event_context_type(
446 writer_stream_class, type);
91b73004
JD
447 if (ret_int < 0) {
448 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
449 __LINE__);
450 goto error;
451 }
452 }
9ae49d3d 453 BT_PUT(type);
91b73004
JD
454
455 goto end;
456
457error:
458 BT_PUT(writer_stream_class);
459end:
9ae49d3d 460 bt_put(type);
91b73004
JD
461 return writer_stream_class;
462}
463
9ac68eb1 464BT_HIDDEN
91b73004
JD
465enum bt_component_status ctf_copy_packet_context_field(FILE *err,
466 struct bt_ctf_field *field, const char *field_name,
467 struct bt_ctf_field *writer_packet_context,
468 struct bt_ctf_field_type *writer_packet_context_type)
469{
470 enum bt_component_status ret;
9ae49d3d
JD
471 struct bt_ctf_field *writer_field = NULL;
472 struct bt_ctf_field_type *field_type = NULL;
91b73004
JD
473 int int_ret;
474 uint64_t value;
475
476 field_type = bt_ctf_field_get_type(field);
477 if (!field_type) {
478 ret = BT_COMPONENT_STATUS_ERROR;
479 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
480 __LINE__);
481 goto end;
482 }
483 /*
484 * Only support for integers for now.
485 */
1487a16a 486 if (bt_ctf_field_type_get_type_id(field_type) != BT_CTF_FIELD_TYPE_ID_INTEGER) {
91b73004 487 fprintf(err, "[error] Unsupported packet context field type\n");
91b73004 488 ret = BT_COMPONENT_STATUS_ERROR;
9ae49d3d 489 goto error;
91b73004 490 }
9ae49d3d 491 BT_PUT(field_type);
91b73004 492
9ac68eb1
PP
493 writer_field = bt_ctf_field_structure_get_field_by_name(
494 writer_packet_context, field_name);
91b73004
JD
495 if (!writer_field) {
496 ret = BT_COMPONENT_STATUS_ERROR;
497 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
498 __LINE__);
499 goto end;
500 }
501
91b73004
JD
502 int_ret = bt_ctf_field_unsigned_integer_get_value(field, &value);
503 if (int_ret < 0) {
504 fprintf(err, "[error] Wrong packet_context field type\n");
505 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
506 __LINE__);
507 ret = BT_COMPONENT_STATUS_ERROR;
9ae49d3d 508 goto end;
91b73004
JD
509 }
510
511 int_ret = bt_ctf_field_unsigned_integer_set_value(writer_field, value);
512 if (int_ret < 0) {
513 ret = BT_COMPONENT_STATUS_ERROR;
514 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
515 __LINE__);
9ae49d3d 516 goto end;
91b73004
JD
517 }
518
519 ret = BT_COMPONENT_STATUS_OK;
520
9ae49d3d
JD
521 goto end;
522
523error:
524 bt_put(field_type);
91b73004 525end:
9ae49d3d 526 bt_put(writer_field);
91b73004
JD
527 return ret;
528}
529
9ac68eb1 530BT_HIDDEN
b2f1f465 531struct bt_ctf_field *ctf_copy_packet_context(FILE *err,
91b73004
JD
532 struct bt_ctf_packet *packet,
533 struct bt_ctf_stream *writer_stream)
534{
535 enum bt_component_status ret;
9ae49d3d
JD
536 struct bt_ctf_field *packet_context = NULL, *writer_packet_context = NULL;
537 struct bt_ctf_field_type *struct_type = NULL, *writer_packet_context_type = NULL;
538 struct bt_ctf_stream_class *writer_stream_class = NULL;
f6f999a3 539 struct bt_ctf_field *field = NULL;
9ae49d3d 540 struct bt_ctf_field_type *field_type;
b2f1f465 541 int nr_fields, i;
91b73004
JD
542
543 packet_context = bt_ctf_packet_get_context(packet);
544 if (!packet_context) {
60ef553b 545 goto end;
91b73004
JD
546 }
547
548 writer_stream_class = bt_ctf_stream_get_class(writer_stream);
549 if (!writer_stream_class) {
91b73004
JD
550 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
551 __LINE__);
9ae49d3d 552 goto error;
91b73004
JD
553 }
554
555 writer_packet_context_type = bt_ctf_stream_class_get_packet_context_type(
556 writer_stream_class);
9ae49d3d 557 BT_PUT(writer_stream_class);
91b73004 558 if (!writer_packet_context_type) {
91b73004
JD
559 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
560 __LINE__);
9ae49d3d 561 goto error;
91b73004
JD
562 }
563
564 struct_type = bt_ctf_field_get_type(packet_context);
565 if (!struct_type) {
91b73004
JD
566 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
567 __LINE__);
9ae49d3d 568 goto error;
91b73004
JD
569 }
570
571 writer_packet_context = bt_ctf_field_create(writer_packet_context_type);
572 if (!writer_packet_context) {
91b73004
JD
573 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
574 __LINE__);
9ae49d3d 575 goto error;
91b73004
JD
576 }
577
578 nr_fields = bt_ctf_field_type_structure_get_field_count(struct_type);
579 for (i = 0; i < nr_fields; i++) {
91b73004
JD
580 const char *field_name;
581
0f29db56 582 field = bt_ctf_field_structure_get_field_by_index(
91b73004
JD
583 packet_context, i);
584 if (!field) {
91b73004
JD
585 fprintf(err, "[error] %s in %s:%d\n", __func__,
586 __FILE__, __LINE__);
9ae49d3d 587 goto error;
91b73004 588 }
9ac68eb1 589 if (bt_ctf_field_type_structure_get_field_by_index(struct_type,
91b73004 590 &field_name, &field_type, i) < 0) {
91b73004
JD
591 fprintf(err, "[error] %s in %s:%d\n", __func__,
592 __FILE__, __LINE__);
9ae49d3d 593 goto error;
91b73004
JD
594 }
595 if (!strncmp(field_name, "content_size", strlen("content_size")) ||
596 !strncmp(field_name, "packet_size",
597 strlen("packet_size"))) {
9ae49d3d
JD
598 BT_PUT(field_type);
599 BT_PUT(field);
91b73004
JD
600 continue;
601 }
602
1487a16a 603 if (bt_ctf_field_type_get_type_id(field_type) != BT_CTF_FIELD_TYPE_ID_INTEGER) {
91b73004 604 fprintf(err, "[error] Unexpected packet context field type\n");
9ae49d3d 605 goto error;
91b73004
JD
606 }
607
608 ret = ctf_copy_packet_context_field(err, field, field_name,
609 writer_packet_context, writer_packet_context_type);
9ae49d3d
JD
610 BT_PUT(field_type);
611 BT_PUT(field);
91b73004
JD
612 if (ret != BT_COMPONENT_STATUS_OK) {
613 fprintf(err, "[error] %s in %s:%d\n", __func__,
614 __FILE__, __LINE__);
9ae49d3d 615 goto error;
91b73004
JD
616 }
617 }
618
9ae49d3d
JD
619 goto end;
620
621error:
622 BT_PUT(writer_packet_context);
623end:
624 bt_put(field);
625 bt_put(field_type);
91b73004 626 bt_put(struct_type);
91b73004 627 bt_put(writer_packet_context_type);
91b73004 628 bt_put(writer_stream_class);
91b73004 629 bt_put(packet_context);
b2f1f465
JD
630 return writer_packet_context;
631}
632
9ac68eb1 633BT_HIDDEN
0f29db56 634int ctf_copy_event_header(FILE *err, struct bt_ctf_event *event,
b2f1f465
JD
635 struct bt_ctf_event_class *writer_event_class,
636 struct bt_ctf_event *writer_event,
637 struct bt_ctf_field *event_header)
638{
9ae49d3d
JD
639 struct bt_ctf_clock_class *clock_class = NULL, *writer_clock_class = NULL;
640 struct bt_ctf_clock_value *clock_value = NULL, *writer_clock_value = NULL;
b2f1f465
JD
641
642 int ret;
0f29db56
JD
643 struct bt_ctf_field *writer_event_header = NULL;
644 uint64_t value;
b2f1f465 645
0f29db56
JD
646 clock_class = event_get_clock_class(err, event);
647 if (!clock_class) {
648 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
649 __LINE__);
650 goto error;
651 }
652
653 clock_value = bt_ctf_event_get_clock_value(event, clock_class);
9ae49d3d 654 BT_PUT(clock_class);
0f29db56
JD
655 if (!clock_value) {
656 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
657 __LINE__);
658 goto error;
659 }
660
661 ret = bt_ctf_clock_value_get_value(clock_value, &value);
9ae49d3d 662 BT_PUT(clock_value);
0f29db56
JD
663 if (ret) {
664 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
665 __LINE__);
666 goto error;
b2f1f465
JD
667 }
668
669 writer_clock_class = event_get_clock_class(err, writer_event);
670 if (!writer_clock_class) {
671 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
672 __LINE__);
673 goto error;
674 }
675
0f29db56 676 writer_clock_value = bt_ctf_clock_value_create(writer_clock_class, value);
9ae49d3d 677 BT_PUT(writer_clock_class);
0f29db56 678 if (!writer_clock_value) {
b2f1f465
JD
679 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
680 __LINE__);
9ae49d3d 681 goto error;
b2f1f465
JD
682 }
683
0f29db56 684 ret = bt_ctf_event_set_clock_value(writer_event, writer_clock_value);
9ae49d3d 685 BT_PUT(writer_clock_value);
b2f1f465
JD
686 if (ret) {
687 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
688 __LINE__);
689 goto error;
690 }
691
0f29db56
JD
692 writer_event_header = bt_ctf_field_copy(event_header);
693 if (!writer_event_header) {
694 fprintf(err, "[error] %s in %s:%d\n", __func__,
695 __FILE__, __LINE__);
0f29db56
JD
696 goto end;
697 }
698
b2f1f465 699 ret = bt_ctf_event_set_header(writer_event, writer_event_header);
9ae49d3d 700 BT_PUT(writer_event_header);
b2f1f465
JD
701 if (ret < 0) {
702 fprintf(err, "[error] %s in %s:%d\n", __func__,
703 __FILE__, __LINE__);
704 goto error;
705 }
b2f1f465
JD
706
707 ret = 0;
708
709 goto end;
710
711error:
b2f1f465 712 ret = -1;
91b73004
JD
713end:
714 return ret;
715}
716
9ac68eb1 717BT_HIDDEN
91b73004 718struct bt_ctf_event *ctf_copy_event(FILE *err, struct bt_ctf_event *event,
b2f1f465
JD
719 struct bt_ctf_event_class *writer_event_class,
720 bool override_ts64)
91b73004 721{
9ae49d3d
JD
722 struct bt_ctf_event *writer_event = NULL;
723 struct bt_ctf_field *field = NULL, *copy_field = NULL;
91b73004
JD
724 int ret;
725
726 writer_event = bt_ctf_event_create(writer_event_class);
727 if (!writer_event) {
728 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
729 __LINE__);
730 goto end;
731 }
732
733 field = bt_ctf_event_get_header(event);
734 if (!field) {
91b73004
JD
735 fprintf(err, "[error] %s in %s:%d\n", __func__,
736 __FILE__, __LINE__);
9ae49d3d 737 goto error;
91b73004
JD
738 }
739
b2f1f465
JD
740 /*
741 * If override_ts64, we override all integer fields mapped to a clock
742 * to a uint64_t field type, otherwise, we just copy it as is.
743 */
744 if (override_ts64) {
745 copy_field = bt_ctf_event_get_header(writer_event);
746 if (!copy_field) {
91b73004
JD
747 fprintf(err, "[error] %s in %s:%d\n", __func__,
748 __FILE__, __LINE__);
9ae49d3d 749 goto error;
b2f1f465
JD
750 }
751
752 ret = copy_override_field(err, event, writer_event, field,
753 copy_field);
b2f1f465 754 if (ret) {
b2f1f465
JD
755 fprintf(err, "[error] %s in %s:%d\n", __func__,
756 __FILE__, __LINE__);
9ae49d3d 757 goto error;
b2f1f465 758 }
9ae49d3d 759 BT_PUT(copy_field);
b2f1f465 760 } else {
0f29db56 761 ret = ctf_copy_event_header(err, event, writer_event_class,
b2f1f465
JD
762 writer_event, field);
763 if (ret) {
b2f1f465
JD
764 fprintf(err, "[error] %s in %s:%d\n", __func__,
765 __FILE__, __LINE__);
9ae49d3d 766 goto error;
91b73004 767 }
91b73004 768 }
9ae49d3d 769 BT_PUT(field);
91b73004
JD
770
771 /* Optional field, so it can fail silently. */
772 field = bt_ctf_event_get_stream_event_context(event);
773 copy_field = bt_ctf_field_copy(field);
91b73004
JD
774 if (copy_field) {
775 ret = bt_ctf_event_set_stream_event_context(writer_event,
776 copy_field);
91b73004
JD
777 if (ret < 0) {
778 fprintf(err, "[error] %s in %s:%d\n", __func__,
779 __FILE__, __LINE__);
780 goto error;
781 }
782 }
9ae49d3d
JD
783 BT_PUT(field);
784 BT_PUT(copy_field);
91b73004
JD
785
786 /* Optional field, so it can fail silently. */
787 field = bt_ctf_event_get_event_context(event);
788 copy_field = bt_ctf_field_copy(field);
91b73004
JD
789 if (copy_field) {
790 ret = bt_ctf_event_set_event_context(writer_event, copy_field);
91b73004
JD
791 if (ret < 0) {
792 fprintf(err, "[error] %s in %s:%d\n", __func__,
793 __FILE__, __LINE__);
794 goto error;
795 }
796 }
9ae49d3d
JD
797 BT_PUT(field);
798 BT_PUT(copy_field);
91b73004 799
9ac68eb1 800 field = bt_ctf_event_get_event_payload(event);
91b73004 801 if (!field) {
91b73004
JD
802 fprintf(err, "[error] %s in %s:%d\n", __func__,
803 __FILE__, __LINE__);
9ae49d3d 804 goto error;
91b73004
JD
805 }
806 copy_field = bt_ctf_field_copy(field);
91b73004 807 if (copy_field) {
9ac68eb1 808 ret = bt_ctf_event_set_event_payload(writer_event, copy_field);
91b73004
JD
809 if (ret < 0) {
810 fprintf(err, "[error] %s in %s:%d\n", __func__,
811 __FILE__, __LINE__);
812 goto error;
813 }
814 }
9ae49d3d
JD
815 BT_PUT(field);
816 BT_PUT(copy_field);
817
91b73004
JD
818 goto end;
819
820error:
821 BT_PUT(writer_event);
822end:
9ae49d3d
JD
823 bt_put(field);
824 bt_put(copy_field);
91b73004
JD
825 return writer_event;
826}
827
9ac68eb1 828BT_HIDDEN
91b73004
JD
829enum bt_component_status ctf_copy_trace(FILE *err, struct bt_ctf_trace *trace,
830 struct bt_ctf_trace *writer_trace)
831{
832 enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
833 int field_count, i, int_ret;
9ae49d3d 834 struct bt_ctf_field_type *header_type = NULL;
91b73004
JD
835
836 field_count = bt_ctf_trace_get_environment_field_count(trace);
837 for (i = 0; i < field_count; i++) {
838 int ret_int;
839 const char *name;
9ae49d3d 840 struct bt_value *value = NULL;
91b73004 841
9ac68eb1
PP
842 name = bt_ctf_trace_get_environment_field_name_by_index(
843 trace, i);
91b73004
JD
844 if (!name) {
845 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
846 __LINE__);
847 ret = BT_COMPONENT_STATUS_ERROR;
9ae49d3d 848 goto end;
91b73004 849 }
9ac68eb1
PP
850 value = bt_ctf_trace_get_environment_field_value_by_index(
851 trace, i);
91b73004
JD
852 if (!value) {
853 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
854 __LINE__);
855 ret = BT_COMPONENT_STATUS_ERROR;
9ae49d3d 856 goto end;
91b73004
JD
857 }
858
859 ret_int = bt_ctf_trace_set_environment_field(writer_trace,
860 name, value);
9ae49d3d 861 BT_PUT(value);
91b73004
JD
862 if (ret_int < 0) {
863 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
864 __LINE__);
865 fprintf(err, "[error] Unable to set environment field %s\n",
866 name);
867 ret = BT_COMPONENT_STATUS_ERROR;
9ae49d3d 868 goto end;
91b73004
JD
869 }
870 }
871
872 header_type = bt_ctf_trace_get_packet_header_type(writer_trace);
873 if (!header_type) {
874 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__);
875 ret = BT_COMPONENT_STATUS_ERROR;
9ae49d3d 876 goto end;
91b73004
JD
877 }
878
879 int_ret = bt_ctf_trace_set_packet_header_type(writer_trace, header_type);
9ae49d3d 880 BT_PUT(header_type);
91b73004
JD
881 if (int_ret < 0) {
882 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__);
883 ret = BT_COMPONENT_STATUS_ERROR;
9ae49d3d 884 goto end;
91b73004
JD
885 }
886
9ae49d3d 887end:
91b73004
JD
888 return ret;
889}
This page took 0.062745 seconds and 4 git commands to generate.