text plugin test
[babeltrace.git] / plugins / component-factory.c
index 03e0148595065ee1a14e4e2ce17673e9ed275ed9..2bee2703a56bc351c11e81787963dc8726fb98ce 100644 (file)
@@ -28,6 +28,8 @@
 
 #include <babeltrace/plugin/component-factory.h>
 #include <babeltrace/plugin/component-factory-internal.h>
+#include <babeltrace/plugin/source-internal.h>
+#include <babeltrace/plugin/sink-internal.h>
 #include <babeltrace/babeltrace-internal.h>
 #include <babeltrace/compiler.h>
 #include <babeltrace/ref.h>
@@ -70,6 +72,7 @@ bt_component_factory_load_file(struct bt_component_factory *factory,
        size_t path_len;
        GModule *module;
        struct bt_plugin *plugin;
+       bool is_libtool_wrapper = false, is_shared_object = false;
 
        if (!factory || !path) {
                ret = BT_COMPONENT_FACTORY_STATUS_INVAL;
@@ -87,12 +90,13 @@ bt_component_factory_load_file(struct bt_component_factory *factory,
         * Check if the file ends with a known plugin file type suffix (i.e. .so
         * or .la on Linux).
         */
-       if (strncmp(NATIVE_PLUGIN_SUFFIX,
-                       path + path_len - NATIVE_PLUGIN_SUFFIX_LEN,
-                       NATIVE_PLUGIN_SUFFIX_LEN) &&
-                       strncmp(LIBTOOL_PLUGIN_SUFFIX,
+       is_libtool_wrapper = !strncmp(LIBTOOL_PLUGIN_SUFFIX,
                        path + path_len - LIBTOOL_PLUGIN_SUFFIX_LEN,
-                       LIBTOOL_PLUGIN_SUFFIX_LEN)) {
+                       LIBTOOL_PLUGIN_SUFFIX_LEN);
+       is_shared_object = !strncmp(NATIVE_PLUGIN_SUFFIX,
+                       path + path_len - NATIVE_PLUGIN_SUFFIX_LEN,
+                       NATIVE_PLUGIN_SUFFIX_LEN);
+       if (!is_shared_object && !is_libtool_wrapper) {
                /* Name indicates that this is not a plugin file. */
                ret = BT_COMPONENT_FACTORY_STATUS_INVAL;
                goto end;
@@ -170,11 +174,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 +219,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;
@@ -217,8 +244,8 @@ void bt_component_factory_destroy(struct bt_object *obj)
        if (factory->plugins) {
                g_ptr_array_free(factory->plugins, TRUE);
        }
-       if (factory->components) {
-               g_ptr_array_free(factory->components, TRUE);
+       if (factory->component_classes) {
+               g_ptr_array_free(factory->component_classes, TRUE);
        }
        g_free(factory);
 }
@@ -238,9 +265,9 @@ struct bt_component_factory *bt_component_factory_create(void)
        if (!factory->plugins) {
                goto error;
        }
-       factory->components = g_ptr_array_new_with_free_func(
+       factory->component_classes = g_ptr_array_new_with_free_func(
                (GDestroyNotify) bt_put);
-       if (!factory->components) {
+       if (!factory->component_classes) {
                goto error;
        }
 end:
@@ -250,6 +277,13 @@ error:
        return factory;
 }
 
+struct bt_object *bt_component_factory_get_components(
+               struct bt_component_factory *factory)
+{
+       assert(0);
+       return NULL;
+}
+
 enum bt_component_factory_status bt_component_factory_load(
                struct bt_component_factory *factory, const char *path)
 {
@@ -277,3 +311,29 @@ enum bt_component_factory_status bt_component_factory_load(
 end:
        return ret;
 }
+
+enum bt_component_factory_status
+bt_component_factory_register_source_component_class(
+               struct bt_component_factory *factory, const char *name,
+               bt_component_source_init_cb init)
+{
+       assert(0);
+       return BT_COMPONENT_FACTORY_STATUS_ERROR;
+}
+
+enum bt_component_factory_status
+bt_component_factory_register_sink_component_class(
+               struct bt_component_factory *factory, const char *name,
+               bt_component_sink_init_cb init)
+{
+       struct bt_component_class *class;
+       enum bt_component_factory_status ret = BT_COMPONENT_FACTORY_STATUS_OK;
+
+       if (!factory || !name || !init) {
+               ret = BT_COMPONENT_FACTORY_STATUS_INVAL;
+               goto end;
+       }
+
+end:
+       return ret;
+}
This page took 0.025067 seconds and 4 git commands to generate.