#include <babeltrace/ctf/events-internal.h>
#include <babeltrace/ctf/iterator.h>
#include <babeltrace/ctf-text/types.h>
-#include <babeltrace/debuginfo.h>
+#include <babeltrace/debug-info.h>
#include <babeltrace/iterator.h>
+#include <babeltrace/plugin/component-factory.h>
#include <popt.h>
#include <errno.h>
#include <stdlib.h>
#define NET4_URL_PREFIX "net4://"
#define NET6_URL_PREFIX "net6://"
+static struct bt_component_factory *component_factory;
static char *opt_input_format, *opt_output_format;
/*
static GPtrArray *opt_input_paths;
static char *opt_output_path;
static int opt_stream_intersection;
+static char *opt_plugin_path;
static struct bt_format *fmt_read;
+void bt_dummy_hook(void);
+void bt_lttng_live_hook(void);
+void bt_ctf_hook(void);
+void bt_ctf_text_hook(void);
+void bt_ctf_metadata_hook(void);
+
static
void strlower(char *str)
{
OPT_OUTPUT_FORMAT,
OPT_HELP,
OPT_LIST,
+ OPT_PLUGIN_PATH,
OPT_VERBOSE,
OPT_DEBUG,
OPT_NAMES,
};
/*
- * We are _not_ using POPT_ARG_STRING ability to store directly into
+ * We are _not_ using POPT_ARG_STRING's ability to store directly into
* variables, because we want to cast the return to non-const, which is
* not possible without using poptGetOptArg explicitly. This helps us
* controlling memory allocation correctly without making assumptions
{ "output-format", 'o', POPT_ARG_STRING, NULL, OPT_OUTPUT_FORMAT, NULL, NULL },
{ "help", 'h', POPT_ARG_NONE, NULL, OPT_HELP, NULL, NULL },
{ "list", 'l', POPT_ARG_NONE, NULL, OPT_LIST, NULL, NULL },
+ { "plugin-path", 0, POPT_ARG_STRING, NULL, OPT_PLUGIN_PATH, NULL, NULL },
{ "verbose", 'v', POPT_ARG_NONE, NULL, OPT_VERBOSE, NULL, NULL },
{ "debug", 'd', POPT_ARG_NONE, NULL, OPT_DEBUG, NULL, NULL },
{ "names", 'n', POPT_ARG_STRING, NULL, OPT_NAMES, NULL, NULL },
{ "clock-gmt", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_GMT, NULL, NULL },
{ "clock-force-correlate", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_FORCE_CORRELATE, NULL, NULL },
{ "stream-intersection", 0, POPT_ARG_NONE, NULL, OPT_STREAM_INTERSECTION, NULL, NULL },
-#ifdef ENABLE_DEBUGINFO
+#ifdef ENABLE_DEBUG_INFO
{ "debug-info-dir", 0, POPT_ARG_STRING, NULL, OPT_DEBUG_INFO_DIR, NULL, NULL },
{ "debug-info-full-path", 0, POPT_ARG_NONE, NULL, OPT_DEBUG_INFO_FULL_PATH, NULL, NULL },
{ "debug-info-target-prefix", 0, POPT_ARG_STRING, NULL, OPT_DEBUG_INFO_TARGET_PREFIX, NULL, NULL },
fprintf(fp, "\n");
fprintf(fp, " -h, --help This help message\n");
fprintf(fp, " -l, --list List available formats\n");
+ fprintf(fp, " --plugin-path Supplementary plug-in path\n");
fprintf(fp, " -v, --verbose Verbose mode\n");
fprintf(fp, " (or set BABELTRACE_VERBOSE environment variable)\n");
fprintf(fp, " -d, --debug Debug mode\n");
fprintf(fp, " --clock-force-correlate Assume that clocks are inherently correlated\n");
fprintf(fp, " across traces.\n");
fprintf(fp, " --stream-intersection Only print events when all streams are active.\n");
-#ifdef ENABLE_DEBUGINFO
+#ifdef ENABLE_DEBUG_INFO
fprintf(fp, " --debug-info-dir Directory in which to look for debugging information\n");
fprintf(fp, " files. (default: /usr/lib/debug/)\n");
fprintf(fp, " --debug-info-target-prefix Directory to use as a prefix for executable lookup\n");
list_formats(stdout);
ret = 1;
goto end;
+ case OPT_PLUGIN_PATH:
+ opt_plugin_path = (char *) poptGetOptArg(pc);
+ if (!opt_plugin_path) {
+ ret = -EINVAL;
+ goto end;
+ } ;
+ break;
case OPT_VERBOSE:
babeltrace_verbose = 1;
break;
if (ipath)
g_ptr_array_add(opt_input_paths, (gpointer) ipath);
} while (ipath);
- if (opt_input_paths->len == 0) {
- ret = -EINVAL;
- goto end;
- }
end:
if (pc) {
return ret;
}
+void call_plugins_hooks(void)
+{
+ bt_dummy_hook();
+ bt_lttng_live_hook();
+ bt_ctf_hook();
+ bt_ctf_text_hook();
+ bt_ctf_metadata_hook();
+}
+
int main(int argc, char **argv)
{
int ret, partial_error = 0, open_success = 0;
struct bt_context *ctx;
int i;
+ call_plugins_hooks();
+
opt_input_paths = g_ptr_array_new();
ret = parse_options(argc, argv);
printf_verbose("Verbose mode active.\n");
printf_debug("Debug mode active.\n");
+ if (!opt_plugin_path) {
+ fprintf(stderr, "No plugin path specified, aborting...\n");
+ ret = -1;
+ goto end;
+ }
+ printf_verbose("Looking-up plugins at %s",
+ opt_plugin_path ? opt_plugin_path : "Invalid");
+ component_factory = bt_component_factory_create();
+ if (!component_factory) {
+ fprintf(stderr, "Failed to create component factory.\n");
+ ret = -1;
+ goto end;
+ }
+
+ ret = bt_component_factory_load(component_factory, opt_plugin_path);
+ if (ret) {
+ fprintf(stderr, "Failed to load plugins.\n");
+ goto end;
+ }
+
+ if (opt_input_paths->len == 0) {
+ ret = -1;
+ goto end;
+ }
+
if (opt_input_format)
strlower(opt_input_format);
if (opt_output_format)