4 * Babeltrace Trace Converter
6 * Copyright 2010-2011 EfficiOS Inc. and Linux Foundation
8 * Author: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
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:
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
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
29 #include <babeltrace/babeltrace.h>
30 #include <babeltrace/plugin/plugin.h>
31 #include <babeltrace/common-internal.h>
32 #include <babeltrace/component/component.h>
33 #include <babeltrace/component/component-source.h>
34 #include <babeltrace/component/component-sink.h>
35 #include <babeltrace/component/component-filter.h>
36 #include <babeltrace/component/component-class.h>
37 #include <babeltrace/component/notification/iterator.h>
38 #include <babeltrace/ref.h>
39 #include <babeltrace/values.h>
41 #include <babeltrace/ctf-ir/metadata.h> /* for clocks */
46 #include "babeltrace-cfg.h"
47 #include "babeltrace-cfg-connect.h"
48 #include "default-cfg.h"
50 GPtrArray
*loaded_plugins
;
53 void init_loaded_plugins_array(void)
55 loaded_plugins
= g_ptr_array_new_full(8, bt_put
);
59 void fini_loaded_plugins_array(void)
61 g_ptr_array_free(loaded_plugins
, TRUE
);
65 struct bt_plugin
*find_plugin(const char *name
)
68 struct bt_plugin
*plugin
= NULL
;
70 for (i
= 0; i
< loaded_plugins
->len
; i
++) {
71 plugin
= g_ptr_array_index(loaded_plugins
, i
);
73 if (strcmp(name
, bt_plugin_get_name(plugin
)) == 0) {
80 return bt_get(plugin
);
84 struct bt_component_class
*find_component_class(const char *plugin_name
,
85 const char *comp_class_name
,
86 enum bt_component_class_type comp_class_type
)
88 struct bt_component_class
*comp_class
= NULL
;
89 struct bt_plugin
*plugin
= find_plugin(plugin_name
);
95 comp_class
= bt_plugin_get_component_class_by_name_and_type(plugin
,
96 comp_class_name
, comp_class_type
);
103 void print_indent(size_t indent
)
107 for (i
= 0; i
< indent
; i
++) {
113 void print_value(struct bt_value
*, size_t);
116 void print_value_rec(struct bt_value
*, size_t);
119 bool print_map_value(const char *key
, struct bt_value
*object
, void *data
)
121 size_t *indent
= data
;
123 print_indent(*indent
);
126 if (bt_value_is_array(object
) &&
127 bt_value_array_is_empty(object
)) {
132 if (bt_value_is_map(object
) &&
133 bt_value_map_is_empty(object
)) {
138 if (bt_value_is_array(object
) ||
139 bt_value_is_map(object
)) {
143 print_value_rec(object
, *indent
+ 2);
148 void print_value_rec(struct bt_value
*value
, size_t indent
)
161 switch (bt_value_get_type(value
)) {
162 case BT_VALUE_TYPE_NULL
:
163 printf("%snull%s\n", bt_common_color_bold(),
164 bt_common_color_reset());
166 case BT_VALUE_TYPE_BOOL
:
167 bt_value_bool_get(value
, &bool_val
);
168 printf("%s%s%s%s\n", bt_common_color_bold(),
169 bt_common_color_fg_cyan(), bool_val
? "yes" : "no",
170 bt_common_color_reset());
172 case BT_VALUE_TYPE_INTEGER
:
173 bt_value_integer_get(value
, &int_val
);
174 printf("%s%s%" PRId64
"%s\n", bt_common_color_bold(),
175 bt_common_color_fg_red(), int_val
,
176 bt_common_color_reset());
178 case BT_VALUE_TYPE_FLOAT
:
179 bt_value_float_get(value
, &dbl_val
);
180 printf("%s%s%lf%s\n", bt_common_color_bold(),
181 bt_common_color_fg_red(), dbl_val
,
182 bt_common_color_reset());
184 case BT_VALUE_TYPE_STRING
:
185 bt_value_string_get(value
, &str_val
);
186 printf("%s%s%s%s\n", bt_common_color_bold(),
187 bt_common_color_fg_green(), str_val
,
188 bt_common_color_reset());
190 case BT_VALUE_TYPE_ARRAY
:
191 size
= bt_value_array_size(value
);
195 print_indent(indent
);
200 for (i
= 0; i
< size
; i
++) {
201 struct bt_value
*element
=
202 bt_value_array_get(value
, i
);
205 print_indent(indent
);
208 if (bt_value_is_array(element
) &&
209 bt_value_array_is_empty(element
)) {
214 if (bt_value_is_map(element
) &&
215 bt_value_map_is_empty(element
)) {
220 if (bt_value_is_array(element
) ||
221 bt_value_is_map(element
)) {
225 print_value_rec(element
, indent
+ 2);
229 case BT_VALUE_TYPE_MAP
:
230 if (bt_value_map_is_empty(value
)) {
231 print_indent(indent
);
236 bt_value_map_foreach(value
, print_map_value
, &indent
);
244 void print_value(struct bt_value
*value
, size_t indent
)
246 if (!bt_value_is_array(value
) && !bt_value_is_map(value
)) {
247 print_indent(indent
);
250 print_value_rec(value
, indent
);
254 void print_bt_config_component(struct bt_config_component
*bt_config_component
)
256 printf(" %s.%s:\n", bt_config_component
->plugin_name
->str
,
257 bt_config_component
->component_name
->str
);
259 if (bt_config_component
->instance_name
->len
> 0) {
260 printf(" Name: %s\n",
261 bt_config_component
->instance_name
->str
);
264 printf(" Parameters:\n");
265 print_value(bt_config_component
->params
, 8);
269 void print_bt_config_components(GPtrArray
*array
)
273 for (i
= 0; i
< array
->len
; i
++) {
274 struct bt_config_component
*cfg_component
=
275 bt_config_get_component(array
, i
);
276 print_bt_config_component(cfg_component
);
277 BT_PUT(cfg_component
);
282 void print_plugin_paths(struct bt_value
*plugin_paths
)
284 printf(" Plugin paths:\n");
285 print_value(plugin_paths
, 4);
289 void print_cfg_convert(struct bt_config
*cfg
)
293 printf(" Force correlate: %s\n",
294 cfg
->cmd_data
.convert
.force_correlate
? "yes" : "no");
295 print_plugin_paths(cfg
->cmd_data
.convert
.plugin_paths
);
296 printf(" Print CTF metadata: %s\n",
297 cfg
->cmd_data
.convert
.print_ctf_metadata
? "yes" : "no");
298 printf(" Source component instances:\n");
299 print_bt_config_components(cfg
->cmd_data
.convert
.sources
);
301 if (cfg
->cmd_data
.convert
.filters
->len
> 0) {
302 printf(" Filter component instances:\n");
303 print_bt_config_components(cfg
->cmd_data
.convert
.filters
);
306 printf(" Sink component instances:\n");
307 print_bt_config_components(cfg
->cmd_data
.convert
.sinks
);
308 printf(" Connections:\n");
310 for (i
= 0; i
< cfg
->cmd_data
.convert
.connections
->len
; i
++) {
311 struct bt_config_connection
*cfg_connection
=
312 g_ptr_array_index(cfg
->cmd_data
.convert
.connections
,
315 printf(" %s%s%s -> %s%s%s\n",
316 cfg_connection
->src_instance_name
->str
,
317 cfg_connection
->src_port_name
->len
> 0 ? "." : "",
318 cfg_connection
->src_port_name
->str
,
319 cfg_connection
->dst_instance_name
->str
,
320 cfg_connection
->dst_port_name
->len
> 0 ? "." : "",
321 cfg_connection
->dst_port_name
->str
);
326 void print_cfg_list_plugins(struct bt_config
*cfg
)
328 print_plugin_paths(cfg
->cmd_data
.list_plugins
.plugin_paths
);
332 void print_cfg_help(struct bt_config
*cfg
)
334 print_plugin_paths(cfg
->cmd_data
.help
.plugin_paths
);
338 void print_cfg_query(struct bt_config
*cfg
)
340 print_plugin_paths(cfg
->cmd_data
.query
.plugin_paths
);
341 printf(" Object: `%s`\n", cfg
->cmd_data
.query
.object
->str
);
342 printf(" Component class:\n");
343 print_bt_config_component(cfg
->cmd_data
.query
.cfg_component
);
347 void print_cfg(struct bt_config
*cfg
)
349 if (!babeltrace_verbose
) {
353 printf("Configuration:\n");
354 printf(" Debug mode: %s\n", cfg
->debug
? "yes" : "no");
355 printf(" Verbose mode: %s\n", cfg
->verbose
? "yes" : "no");
357 switch (cfg
->command
) {
358 case BT_CONFIG_COMMAND_CONVERT
:
359 print_cfg_convert(cfg
);
361 case BT_CONFIG_COMMAND_LIST_PLUGINS
:
362 print_cfg_list_plugins(cfg
);
364 case BT_CONFIG_COMMAND_HELP
:
367 case BT_CONFIG_COMMAND_QUERY
:
368 print_cfg_query(cfg
);
376 struct bt_component
*create_trimmer(struct bt_config_component
*source_cfg
)
378 struct bt_component
*trimmer
= NULL
;
379 struct bt_component_class
*trimmer_class
= NULL
;
380 struct bt_value
*trimmer_params
= NULL
;
381 struct bt_value
*value
;
383 trimmer_params
= bt_value_map_create();
384 if (!trimmer_params
) {
388 value
= bt_value_map_get(source_cfg
->params
, "begin");
390 enum bt_value_status ret
;
392 ret
= bt_value_map_insert(trimmer_params
, "begin",
399 value
= bt_value_map_get(source_cfg
->params
, "end");
401 enum bt_value_status ret
;
403 ret
= bt_value_map_insert(trimmer_params
, "end",
410 value
= bt_value_map_get(source_cfg
->params
, "clock-gmt");
412 enum bt_value_status ret
;
414 ret
= bt_value_map_insert(trimmer_params
, "clock-gmt",
422 trimmer_class
= find_component_class("utils", "trimmer",
423 BT_COMPONENT_CLASS_TYPE_FILTER
);
424 if (!trimmer_class
) {
425 fprintf(stderr
, "Could not find trimmer component class. Aborting...\n");
428 trimmer
= bt_component_create(trimmer_class
, "source_trimmer",
434 bt_put(trimmer_params
);
435 bt_put(trimmer_class
);
440 int connect_source_sink(struct bt_component
*source
,
441 struct bt_config_component
*source_cfg
,
442 struct bt_component
*sink
)
445 enum bt_component_status sink_status
;
446 struct bt_component
*trimmer
= NULL
;
447 struct bt_notification_iterator
*source_it
= NULL
;
448 struct bt_notification_iterator
*to_sink_it
= NULL
;
450 source_it
= bt_component_source_create_notification_iterator(source
);
452 fprintf(stderr
, "Failed to instantiate source iterator. Aborting...\n");
457 if (bt_value_map_has_key(source_cfg
->params
, "begin")
458 || bt_value_map_has_key(source_cfg
->params
, "end")) {
459 /* A trimmer must be inserted in the graph. */
460 enum bt_component_status trimmer_status
;
462 trimmer
= create_trimmer(source_cfg
);
464 fprintf(stderr
, "Failed to create trimmer component. Aborting...\n");
469 trimmer_status
= bt_component_filter_add_iterator(trimmer
,
472 if (trimmer_status
!= BT_COMPONENT_STATUS_OK
) {
473 fprintf(stderr
, "Failed to connect source to trimmer. Aborting...\n");
478 to_sink_it
= bt_component_filter_create_notification_iterator(trimmer
);
480 fprintf(stderr
, "Failed to instantiate trimmer iterator. Aborting...\n");
485 BT_MOVE(to_sink_it
, source_it
);
488 sink_status
= bt_component_sink_add_iterator(sink
, to_sink_it
);
489 if (sink_status
!= BT_COMPONENT_STATUS_OK
) {
490 fprintf(stderr
, "Failed to connect to sink component. Aborting...\n");
502 void add_to_loaded_plugins(struct bt_plugin
**plugins
)
505 struct bt_plugin
*plugin
= *plugins
;
506 /* Check if it's already loaded (from another path). */
507 struct bt_plugin
*loaded_plugin
=
508 find_plugin(bt_plugin_get_name(plugin
));
511 printf_verbose("Not loading plugin `%s`: already loaded from `%s`\n",
512 bt_plugin_get_path(plugin
),
513 bt_plugin_get_path(loaded_plugin
));
514 BT_PUT(loaded_plugin
);
517 /* Transfer ownership to global array. */
518 g_ptr_array_add(loaded_plugins
, plugin
);
525 int load_dynamic_plugins(struct bt_value
*plugin_paths
)
527 int nr_paths
, i
, ret
= 0;
529 nr_paths
= bt_value_array_size(plugin_paths
);
535 for (i
= 0; i
< nr_paths
; i
++) {
536 struct bt_value
*plugin_path_value
= NULL
;
537 const char *plugin_path
;
538 struct bt_plugin
**plugins
;
540 plugin_path_value
= bt_value_array_get(plugin_paths
, i
);
541 if (bt_value_string_get(plugin_path_value
,
543 BT_PUT(plugin_path_value
);
547 plugins
= bt_plugin_create_all_from_dir(plugin_path
, false);
549 printf_debug("Unable to dynamically load plugins from path %s.\n",
551 BT_PUT(plugin_path_value
);
555 add_to_loaded_plugins(plugins
);
558 BT_PUT(plugin_path_value
);
565 int load_static_plugins(void)
568 struct bt_plugin
**plugins
;
570 plugins
= bt_plugin_create_all_from_static();
572 printf_debug("Unable to load static plugins.\n");
577 add_to_loaded_plugins(plugins
);
584 const char *component_type_str(enum bt_component_class_type type
)
587 case BT_COMPONENT_CLASS_TYPE_SOURCE
:
589 case BT_COMPONENT_CLASS_TYPE_SINK
:
591 case BT_COMPONENT_CLASS_TYPE_FILTER
:
593 case BT_COMPONENT_CLASS_TYPE_UNKNOWN
:
599 static int load_all_plugins(struct bt_value
*plugin_paths
)
603 if (load_dynamic_plugins(plugin_paths
)) {
604 fprintf(stderr
, "Failed to load dynamic plugins.\n");
609 if (load_static_plugins()) {
610 fprintf(stderr
, "Failed to load static plugins.\n");
619 static void print_plugin_info(struct bt_plugin
*plugin
)
621 unsigned int major
, minor
, patch
;
623 enum bt_plugin_status version_status
;
624 const char *plugin_name
;
628 const char *plugin_description
;
630 plugin_name
= bt_plugin_get_name(plugin
);
631 path
= bt_plugin_get_path(plugin
);
632 author
= bt_plugin_get_author(plugin
);
633 license
= bt_plugin_get_license(plugin
);
634 plugin_description
= bt_plugin_get_description(plugin
);
635 version_status
= bt_plugin_get_version(plugin
, &major
, &minor
,
637 printf("%s%s%s%s:\n", bt_common_color_bold(),
638 bt_common_color_fg_blue(), plugin_name
,
639 bt_common_color_reset());
640 printf(" %sPath%s: %s\n", bt_common_color_bold(),
641 bt_common_color_reset(), path
? path
: "(None)");
643 if (version_status
== BT_PLUGIN_STATUS_OK
) {
644 printf(" %sVersion%s: %u.%u.%u",
645 bt_common_color_bold(), bt_common_color_reset(),
646 major
, minor
, patch
);
655 printf(" %sDescription%s: %s\n", bt_common_color_bold(),
656 bt_common_color_reset(),
657 plugin_description
? plugin_description
: "(None)");
658 printf(" %sAuthor%s: %s\n", bt_common_color_bold(),
659 bt_common_color_reset(), author
? author
: "(Unknown)");
660 printf(" %sLicense%s: %s\n", bt_common_color_bold(),
661 bt_common_color_reset(),
662 license
? license
: "(Unknown)");
665 static void print_plugin_comp_cls_opt(FILE *fh
, const char *plugin_name
,
666 const char *comp_cls_name
, enum bt_component_class_type type
)
668 fprintf(fh
, "%s%s--%s%s %s%s%s.%s%s%s",
669 bt_common_color_bold(),
670 bt_common_color_fg_cyan(),
671 component_type_str(type
),
672 bt_common_color_fg_default(),
673 bt_common_color_fg_blue(),
675 bt_common_color_fg_default(),
676 bt_common_color_fg_yellow(),
678 bt_common_color_reset());
681 static int cmd_query(struct bt_config
*cfg
)
684 struct bt_component_class
*comp_cls
= NULL
;
685 struct bt_value
*results
= NULL
;
687 ret
= load_all_plugins(cfg
->cmd_data
.list_plugins
.plugin_paths
);
692 comp_cls
= find_component_class(cfg
->cmd_data
.query
.cfg_component
->plugin_name
->str
,
693 cfg
->cmd_data
.query
.cfg_component
->component_name
->str
,
694 cfg
->cmd_data
.query
.cfg_component
->type
);
696 fprintf(stderr
, "%s%sCannot find component class %s",
697 bt_common_color_bold(),
698 bt_common_color_fg_red(),
699 bt_common_color_reset());
700 print_plugin_comp_cls_opt(stderr
,
701 cfg
->cmd_data
.query
.cfg_component
->plugin_name
->str
,
702 cfg
->cmd_data
.query
.cfg_component
->component_name
->str
,
703 cfg
->cmd_data
.query
.cfg_component
->type
);
704 fprintf(stderr
, "\n");
709 results
= bt_component_class_query(comp_cls
,
710 cfg
->cmd_data
.query
.object
->str
,
711 cfg
->cmd_data
.query
.cfg_component
->params
);
713 fprintf(stderr
, "%s%sFailed to query info to %s",
714 bt_common_color_bold(),
715 bt_common_color_fg_red(),
716 bt_common_color_reset());
717 print_plugin_comp_cls_opt(stderr
,
718 cfg
->cmd_data
.query
.cfg_component
->plugin_name
->str
,
719 cfg
->cmd_data
.query
.cfg_component
->component_name
->str
,
720 cfg
->cmd_data
.query
.cfg_component
->type
);
721 fprintf(stderr
, "%s%s with object `%s`%s\n",
722 bt_common_color_bold(),
723 bt_common_color_fg_red(),
724 cfg
->cmd_data
.query
.object
->str
,
725 bt_common_color_reset());
730 print_value(results
, 0);
738 static int cmd_help(struct bt_config
*cfg
)
741 struct bt_plugin
*plugin
= NULL
;
744 ret
= load_all_plugins(cfg
->cmd_data
.list_plugins
.plugin_paths
);
749 plugin
= find_plugin(cfg
->cmd_data
.help
.cfg_component
->plugin_name
->str
);
751 fprintf(stderr
, "%s%sCannot find plugin %s%s%s\n",
752 bt_common_color_bold(), bt_common_color_fg_red(),
753 bt_common_color_fg_blue(),
754 cfg
->cmd_data
.help
.cfg_component
->plugin_name
->str
,
755 bt_common_color_reset());
760 print_plugin_info(plugin
);
761 printf(" %sComponent classes%s: %d\n",
762 bt_common_color_bold(),
763 bt_common_color_reset(),
764 bt_plugin_get_component_class_count(plugin
));
767 if (cfg
->cmd_data
.help
.cfg_component
->type
!=
768 BT_COMPONENT_CLASS_TYPE_UNKNOWN
) {
769 struct bt_component_class
*needed_comp_cls
=
770 find_component_class(
771 cfg
->cmd_data
.help
.cfg_component
->plugin_name
->str
,
772 cfg
->cmd_data
.help
.cfg_component
->component_name
->str
,
773 cfg
->cmd_data
.help
.cfg_component
->type
);
775 if (!needed_comp_cls
) {
776 fprintf(stderr
, "\n%s%sCannot find component class %s",
777 bt_common_color_bold(),
778 bt_common_color_fg_red(),
779 bt_common_color_reset());
780 print_plugin_comp_cls_opt(stderr
,
781 cfg
->cmd_data
.help
.cfg_component
->plugin_name
->str
,
782 cfg
->cmd_data
.help
.cfg_component
->component_name
->str
,
783 cfg
->cmd_data
.help
.cfg_component
->type
);
784 fprintf(stderr
, "\n");
789 bt_put(needed_comp_cls
);
792 for (i
= 0; i
< bt_plugin_get_component_class_count(plugin
); i
++) {
793 struct bt_component_class
*comp_cls
=
794 bt_plugin_get_component_class(plugin
, i
);
795 const char *comp_class_name
=
796 bt_component_class_get_name(comp_cls
);
797 const char *comp_class_description
=
798 bt_component_class_get_description(comp_cls
);
799 const char *comp_class_help
=
800 bt_component_class_get_help(comp_cls
);
801 enum bt_component_class_type type
=
802 bt_component_class_get_type(comp_cls
);
806 if (cfg
->cmd_data
.help
.cfg_component
->type
!=
807 BT_COMPONENT_CLASS_TYPE_UNKNOWN
) {
808 if (strcmp(cfg
->cmd_data
.help
.cfg_component
->component_name
->str
,
809 comp_class_name
) != 0 &&
811 cfg
->cmd_data
.help
.cfg_component
->type
) {
818 print_plugin_comp_cls_opt(stdout
,
819 cfg
->cmd_data
.help
.cfg_component
->plugin_name
->str
,
823 printf(" %sDescription%s: %s\n", bt_common_color_bold(),
824 bt_common_color_reset(),
825 comp_class_description
? comp_class_description
: "(None)");
827 if (comp_class_help
) {
828 printf("\n%s\n", comp_class_help
);
839 static int cmd_list_plugins(struct bt_config
*cfg
)
842 int plugins_count
, component_classes_count
= 0, i
;
844 ret
= load_all_plugins(cfg
->cmd_data
.list_plugins
.plugin_paths
);
849 printf("From the following plugin paths:\n\n");
850 print_value(cfg
->cmd_data
.list_plugins
.plugin_paths
, 2);
852 plugins_count
= loaded_plugins
->len
;
853 if (plugins_count
== 0) {
854 fprintf(stderr
, "%s%sNo plugins found.%s\n",
855 bt_common_color_bold(), bt_common_color_fg_red(),
856 bt_common_color_reset());
857 fprintf(stderr
, "\n");
858 fprintf(stderr
, "Please make sure your plugin search path is set correctly. You can use\n");
859 fprintf(stderr
, "the --plugin-path command-line option or the BABELTRACE_PLUGIN_PATH\n");
860 fprintf(stderr
, "environment variable.\n");
865 for (i
= 0; i
< plugins_count
; i
++) {
866 struct bt_plugin
*plugin
= g_ptr_array_index(loaded_plugins
, i
);
868 component_classes_count
+= bt_plugin_get_component_class_count(plugin
);
871 printf("Found %s%d%s component classes in %s%d%s plugins.\n",
872 bt_common_color_bold(),
873 component_classes_count
,
874 bt_common_color_reset(),
875 bt_common_color_bold(),
877 bt_common_color_reset());
879 for (i
= 0; i
< plugins_count
; i
++) {
881 struct bt_plugin
*plugin
= g_ptr_array_index(loaded_plugins
, i
);
883 component_classes_count
=
884 bt_plugin_get_component_class_count(plugin
);
886 print_plugin_info(plugin
);
888 if (component_classes_count
== 0) {
889 printf(" %sComponent classes%s: (None)\n",
890 bt_common_color_bold(),
891 bt_common_color_reset());
893 printf(" %sComponent classes%s:\n",
894 bt_common_color_bold(),
895 bt_common_color_reset());
898 for (j
= 0; j
< component_classes_count
; j
++) {
899 struct bt_component_class
*comp_class
=
900 bt_plugin_get_component_class(plugin
, j
);
901 const char *comp_class_name
=
902 bt_component_class_get_name(comp_class
);
903 const char *comp_class_description
=
904 bt_component_class_get_description(comp_class
);
905 enum bt_component_class_type type
=
906 bt_component_class_get_type(comp_class
);
909 print_plugin_comp_cls_opt(stdout
,
910 bt_plugin_get_name(plugin
), comp_class_name
,
913 if (comp_class_description
) {
914 printf(": %s", comp_class_description
);
926 static int print_ctf_metadata(struct bt_config
*cfg
)
929 struct bt_component_class
*comp_cls
= NULL
;
930 struct bt_config_component
*source_cfg
= NULL
;
931 struct bt_value
*results
= NULL
;
932 struct bt_value
*path
= NULL
;
933 struct bt_value
*params
= NULL
;
934 struct bt_value
*metadata_text_value
= NULL
;
935 const char *metadata_text
= NULL
;
937 assert(cfg
->cmd_data
.convert
.sources
->len
== 1);
938 source_cfg
= bt_config_get_component(cfg
->cmd_data
.convert
.sources
, 0);
940 comp_cls
= find_component_class(source_cfg
->plugin_name
->str
,
941 source_cfg
->component_name
->str
,
944 fprintf(stderr
, "%s%sCannot find component class %s",
945 bt_common_color_bold(),
946 bt_common_color_fg_red(),
947 bt_common_color_reset());
948 print_plugin_comp_cls_opt(stderr
,
949 source_cfg
->plugin_name
->str
,
950 source_cfg
->component_name
->str
,
952 fprintf(stderr
, "\n");
957 path
= bt_value_map_get(source_cfg
->params
, "path");
963 params
= bt_value_map_create();
969 ret
= bt_value_map_insert(params
, "path", path
);
975 results
= bt_component_class_query(comp_cls
, "metadata-info",
979 fprintf(stderr
, "%s%sFailed to request metadata info%s\n",
980 bt_common_color_bold(),
981 bt_common_color_fg_red(),
982 bt_common_color_reset());
986 metadata_text_value
= bt_value_map_get(results
, "text");
987 if (!metadata_text_value
) {
992 ret
= bt_value_string_get(metadata_text_value
, &metadata_text
);
994 printf("%s\n", metadata_text
);
1000 bt_put(metadata_text_value
);
1006 static int cmd_convert(struct bt_config
*cfg
)
1009 struct bt_component_class
*source_class
= NULL
;
1010 struct bt_component_class
*sink_class
= NULL
;
1011 struct bt_component
*source
= NULL
, *sink
= NULL
;
1012 struct bt_value
*source_params
= NULL
, *sink_params
= NULL
;
1013 enum bt_component_status sink_status
;
1014 struct bt_config_component
*source_cfg
= NULL
, *sink_cfg
= NULL
;
1016 ret
= load_all_plugins(cfg
->cmd_data
.convert
.plugin_paths
);
1018 fprintf(stderr
, "Could not load plugins from configured plugin paths. Aborting...\n");
1022 if (cfg
->cmd_data
.convert
.print_ctf_metadata
) {
1023 ret
= print_ctf_metadata(cfg
);
1027 /* TODO handle more than 1 source and 1 sink. */
1028 if (cfg
->cmd_data
.convert
.sources
->len
!= 1 ||
1029 cfg
->cmd_data
.convert
.sinks
->len
!= 1) {
1030 fprintf(stderr
, "Only one source and one sink component class are supported. Aborting...\n");
1035 source_cfg
= bt_config_get_component(cfg
->cmd_data
.convert
.sources
, 0);
1036 source_params
= bt_get(source_cfg
->params
);
1037 source_class
= find_component_class(source_cfg
->plugin_name
->str
,
1038 source_cfg
->component_name
->str
,
1039 BT_COMPONENT_CLASS_TYPE_SOURCE
);
1040 if (!source_class
) {
1041 fprintf(stderr
, "Could not find %s.%s source component class. Aborting...\n",
1042 source_cfg
->plugin_name
->str
,
1043 source_cfg
->component_name
->str
);
1048 sink_cfg
= bt_config_get_component(cfg
->cmd_data
.convert
.sinks
, 0);
1049 sink_params
= bt_get(sink_cfg
->params
);
1050 sink_class
= find_component_class(sink_cfg
->plugin_name
->str
,
1051 sink_cfg
->component_name
->str
,
1052 BT_COMPONENT_CLASS_TYPE_SINK
);
1054 fprintf(stderr
, "Could not find %s.%s output component class. Aborting...\n",
1055 sink_cfg
->plugin_name
->str
,
1056 sink_cfg
->component_name
->str
);
1061 source
= bt_component_create(source_class
, "source", source_params
);
1063 fprintf(stderr
, "Failed to instantiate selected source component. Aborting...\n");
1068 sink
= bt_component_create(sink_class
, "sink", sink_params
);
1070 fprintf(stderr
, "Failed to instantiate selected output component. Aborting...\n");
1075 ret
= connect_source_sink(source
, source_cfg
, sink
);
1082 sink_status
= bt_component_sink_consume(sink
);
1083 switch (sink_status
) {
1084 case BT_COMPONENT_STATUS_AGAIN
:
1085 /* Wait for an arbitraty 500 ms. */
1088 case BT_COMPONENT_STATUS_OK
:
1090 case BT_COMPONENT_STATUS_END
:
1093 fprintf(stderr
, "Sink component returned an error, aborting...\n");
1101 BT_PUT(source_class
);
1104 BT_PUT(source_params
);
1105 BT_PUT(sink_params
);
1111 static void warn_command_name_and_directory_clash(struct bt_config
*cfg
)
1113 if (!cfg
->command_name
) {
1117 if (g_file_test(cfg
->command_name
,
1118 G_FILE_TEST_EXISTS
| G_FILE_TEST_IS_DIR
)) {
1119 fprintf(stderr
, "\nNOTE: The `%s` command was executed. If you meant to convert a\n",
1121 fprintf(stderr
, "trace located in the local `%s` directory, please use:\n",
1123 fprintf(stderr
, "\n");
1124 fprintf(stderr
, " babeltrace convert %s [OPTIONS]\n",
1129 int main(int argc
, const char **argv
)
1133 struct bt_config
*cfg
;
1135 init_loaded_plugins_array();
1136 cfg
= bt_config_from_args_with_defaults(argc
, argv
, &retcode
);
1139 /* Quit without errors; typically usage/version */
1149 fprintf(stderr
, "Failed to create Babeltrace configuration\n");
1153 babeltrace_debug
= cfg
->debug
;
1154 babeltrace_verbose
= cfg
->verbose
;
1157 switch (cfg
->command
) {
1158 case BT_CONFIG_COMMAND_CONVERT
:
1159 ret
= cmd_convert(cfg
);
1161 case BT_CONFIG_COMMAND_LIST_PLUGINS
:
1162 ret
= cmd_list_plugins(cfg
);
1164 case BT_CONFIG_COMMAND_HELP
:
1165 ret
= cmd_help(cfg
);
1167 case BT_CONFIG_COMMAND_QUERY
:
1168 ret
= cmd_query(cfg
);
1174 warn_command_name_and_directory_clash(cfg
);
1175 retcode
= ret
? 1 : 0;
1179 fini_loaded_plugins_array();