From 33bceaf8b418f6f3e63371e4ba36ed552e8fe2df Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Sat, 15 Aug 2015 09:49:06 -0400 Subject: [PATCH] Discover plugins in converter.c MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérémie Galarneau --- converter/Makefile.am | 2 +- converter/babeltrace.c | 44 ++++++++++++++++++--- include/babeltrace/plugin/plugin-internal.h | 4 +- plugins/Makefile.am | 2 +- plugins/component-factory.c | 25 +++++++++++- plugins/ctf/text/Makefile.am | 2 +- plugins/iterator.c | 3 +- 7 files changed, 70 insertions(+), 12 deletions(-) diff --git a/converter/Makefile.am b/converter/Makefile.am index 1a6c0daf..789ff58c 100644 --- a/converter/Makefile.am +++ b/converter/Makefile.am @@ -9,7 +9,7 @@ babeltrace_SOURCES = \ # -Wl,--no-as-needed is needed for recent gold linker who seems to think # it knows better and considers libraries with constructors having # side-effects as dead code. -babeltrace_LDFLAGS = $(LD_NO_AS_NEEDED) +babeltrace_LDFLAGS = -Wl, $(LD_NO_AS_NEEDED), -export-dynamic babeltrace_LDADD = \ $(top_builddir)/lib/libbabeltrace.la \ $(top_builddir)/formats/ctf/libbabeltrace-ctf.la \ diff --git a/converter/babeltrace.c b/converter/babeltrace.c index 14d165ad..43121dc4 100644 --- a/converter/babeltrace.c +++ b/converter/babeltrace.c @@ -39,6 +39,7 @@ #include #include +#include #include #include #include @@ -61,6 +62,7 @@ #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; /* @@ -73,6 +75,7 @@ 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; @@ -98,6 +101,7 @@ enum { OPT_OUTPUT_FORMAT, OPT_HELP, OPT_LIST, + OPT_PLUGIN_PATH, OPT_VERBOSE, OPT_DEBUG, OPT_NAMES, @@ -117,7 +121,7 @@ enum { }; /* - * 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 @@ -131,6 +135,7 @@ static struct poptOption long_options[] = { { "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 }, @@ -172,6 +177,7 @@ static void usage(FILE *fp) 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"); @@ -339,6 +345,13 @@ static int parse_options(int argc, char **argv) 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; @@ -451,10 +464,6 @@ static int parse_options(int argc, char **argv) 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) { @@ -743,6 +752,31 @@ int main(int argc, char **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) diff --git a/include/babeltrace/plugin/plugin-internal.h b/include/babeltrace/plugin/plugin-internal.h index 3b60ea2f..fbb91de6 100644 --- a/include/babeltrace/plugin/plugin-internal.h +++ b/include/babeltrace/plugin/plugin-internal.h @@ -1,5 +1,5 @@ #ifndef BABELTRACE_PLUGIN_INTERNAL_H -#define BABELTRACE_PLUGIN__INTERNAL_H +#define BABELTRACE_PLUGIN_INTERNAL_H /* * BabelTrace - Plug-in Internal @@ -61,4 +61,4 @@ BT_HIDDEN enum bt_component_status bt_plugin_register_component_classes( struct bt_plugin *plugin, struct bt_component_factory *factory); -#endif /* BABELTRACE_PLUGIN_COMPONENT_CLASS_INTERNAL_H */ +#endif /* BABELTRACE_PLUGIN_INTERNAL_H */ diff --git a/plugins/Makefile.am b/plugins/Makefile.am index a3fe4270..29226a30 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -14,7 +14,7 @@ libbabeltrace_plugin_la_SOURCES = \ sink.c \ iterator.c -# Request that the linker keeps all static librarie objects. +# Request that the linker keeps all static library objects. libbabeltrace_plugin_la_LDFLAGS = \ -Wl,--no-as-needed -version-info $(BABELTRACE_LIBRARY_VERSION) diff --git a/plugins/component-factory.c b/plugins/component-factory.c index 03e01485..28b1e106 100644 --- a/plugins/component-factory.c +++ b/plugins/component-factory.c @@ -170,11 +170,25 @@ bt_component_factory_load_dir_recursive(struct bt_component_factory *factory, file_path[path_len++] = '/'; } + directory = opendir(file_path); + if (!directory) { + perror("Failed to open plug-in directory"); + ret = BT_COMPONENT_FACTORY_STATUS_ERROR; + goto end; + } + /* Recursively walk directory */ while (!readdir_r(directory, entry, &result) && result) { struct stat st; int stat_ret; - size_t file_name_len = strlen(result->d_name); + size_t file_name_len; + + if (result->d_name[0] == '.') { + /* Skip hidden files, . and .. */ + continue; + } + + file_name_len = strlen(result->d_name); if (path_len + file_name_len >= PATH_MAX) { continue; @@ -201,6 +215,15 @@ bt_component_factory_load_dir_recursive(struct bt_component_factory *factory, } } end: + if (directory) { + if (closedir(directory)) { + /* + * We don't want to override the error since there is + * nothing could do. + */ + perror("Failed to close plug-in directory"); + } + } free(entry); free(file_path); return ret; diff --git a/plugins/ctf/text/Makefile.am b/plugins/ctf/text/Makefile.am index dc4bbd06..9af02eb9 100644 --- a/plugins/ctf/text/Makefile.am +++ b/plugins/ctf/text/Makefile.am @@ -8,7 +8,7 @@ lib_LTLIBRARIES = libbabeltrace-plugin-ctf-text.la libbabeltrace_plugin_ctf_text_la_SOURCES = \ text.c -# Request that the linker keeps all static librarie objects. +# Request that the linker keeps all static library objects. libbabeltrace_plugin_ctf_text_la_LDFLAGS = \ -Wl,--no-as-needed -version-info $(BABELTRACE_LIBRARY_VERSION) diff --git a/plugins/iterator.c b/plugins/iterator.c index 4cfd1e49..b2f79f20 100644 --- a/plugins/iterator.c +++ b/plugins/iterator.c @@ -86,7 +86,8 @@ enum bt_notification_iterator_status bt_notification_iterator_set_get_cb( struct bt_notification_iterator *iterator, bt_notification_iterator_get_cb get) { - enum bt_notification_iterator_status ret; + enum bt_notification_iterator_status ret = + BT_NOTIFICATION_ITERATOR_STATUS_OK; if (!iterator || !get) { ret = BT_NOTIFICATION_ITERATOR_STATUS_INVAL; -- 2.34.1