Discover plugins in converter.c
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Sat, 15 Aug 2015 13:49:06 +0000 (09:49 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Sat, 27 May 2017 16:57:26 +0000 (12:57 -0400)
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
converter/Makefile.am
converter/babeltrace.c
include/babeltrace/plugin/plugin-internal.h
plugins/Makefile.am
plugins/component-factory.c
plugins/ctf/text/Makefile.am
plugins/iterator.c

index 1a6c0daff58c6f5794ce85973c9a835ffe4433ed..789ff58ce283a5706b18b7ed23c08f87a6df3fdc 100644 (file)
@@ -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 \
index 14d165ad915849ec7f407a0acc7a1fd9ce5a1f06..43121dc43f0a6c42a63131bbbf6c14466ad233d2 100644 (file)
@@ -39,6 +39,7 @@
 #include <babeltrace/debug-info.h>
 
 #include <babeltrace/iterator.h>
+#include <babeltrace/plugin/component-factory.h>
 #include <popt.h>
 #include <errno.h>
 #include <stdlib.h>
@@ -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)
index 3b60ea2f83e275edd1846a180db8c0134ecb093e..fbb91de6dbabd44d7ded5816d801510c2e531fed 100644 (file)
@@ -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 */
index a3fe4270d1393f8f517989add673ef7fc7b2f015..29226a301ca4f1181674895571100c985cc45547 100644 (file)
@@ -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)
 
index 03e0148595065ee1a14e4e2ce17673e9ed275ed9..28b1e10618a4bfd90372d7a1dde44210ec558f50 100644 (file)
@@ -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;
index dc4bbd060e0614ec75aa0f2eb081f9774c0e456e..9af02eb94039bcba241d2612f7e4f8de38872304 100644 (file)
@@ -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)
 
index 4cfd1e49e3fc4871c7bdbf20ff174f6a1ecb2fca..b2f79f2011ab42929015bef3a7334d2e79970b93 100644 (file)
@@ -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;
This page took 0.028624 seconds and 4 git commands to generate.