]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
plugin: Refactor and create registration function
authorJeff Lucovsky <jeff@lucovsky.org>
Sat, 15 May 2021 13:49:23 +0000 (09:49 -0400)
committerVictor Julien <victor@inliniac.net>
Mon, 20 Sep 2021 15:31:15 +0000 (17:31 +0200)
This commit refactors the plugin registration code and creates an API
for plugin registration

src/suricata-plugin.h
src/util-plugin.c
src/util-plugin.h

index 1a68d2e2559ce9c5eca4e652a70cd70d279503f5..860af8d2218ed7895dd33e7631782e392cfaa418 100644 (file)
@@ -63,6 +63,7 @@ typedef struct SCPluginFileType_ {
 } SCPluginFileType;
 
 bool SCPluginRegisterFileType(SCPluginFileType *);
+bool SCRegisterEveFileType(SCPluginFileType *);
 
 typedef struct SCCapturePlugin_ {
     char *name;
index 912cb2f006851bb35a0b751d94b000ada6c10c54..0ed9ce225cd6aad3212da64e12b6d0c065edac6f 100644 (file)
@@ -44,6 +44,27 @@ static TAILQ_HEAD(, SCPluginFileType_) output_types =
 
 static TAILQ_HEAD(, SCCapturePlugin_) capture_plugins = TAILQ_HEAD_INITIALIZER(capture_plugins);
 
+bool RegisterPlugin(SCPlugin *plugin, void *lib)
+{
+    BUG_ON(plugin->name == NULL);
+    BUG_ON(plugin->author == NULL);
+    BUG_ON(plugin->license == NULL);
+    BUG_ON(plugin->Init == NULL);
+
+    PluginListNode *node = SCCalloc(1, sizeof(*node));
+    if (node == NULL) {
+        SCLogError(SC_ERR_MEM_ALLOC, "Failed to allocate memory for plugin");
+        return false;
+    }
+    node->plugin = plugin;
+    node->lib = lib;
+    TAILQ_INSERT_TAIL(&plugins, node, entries);
+    SCLogNotice("Initializing plugin %s; author=%s; license=%s", plugin->name, plugin->author,
+            plugin->license);
+    (*plugin->Init)();
+    return true;
+}
+
 static void InitPlugin(char *path)
 {
     void *lib = dlopen(path, RTLD_NOW);
@@ -58,30 +79,12 @@ static void InitPlugin(char *path)
             dlclose(lib);
             return;
         }
-        SCPlugin *plugin = (*plugin_register)();
-        if (plugin == NULL) {
-            SCLogError(SC_ERR_PLUGIN, "Plugin registration failed: %s", path);
-            dlclose(lib);
-            return;
-        }
 
-        BUG_ON(plugin->name == NULL);
-        BUG_ON(plugin->author == NULL);
-        BUG_ON(plugin->license == NULL);
-        BUG_ON(plugin->Init == NULL);
-
-        PluginListNode *node = SCCalloc(1, sizeof(*node));
-        if (node == NULL) {
-            SCLogError(SC_ERR_MEM_ALLOC, "Failed to allocated memory for plugin");
+        if (!RegisterPlugin(plugin_register(), lib)) {
+            SCLogError(SC_ERR_PLUGIN, "Plugin registration failed: %s", path);
             dlclose(lib);
             return;
         }
-        node->plugin = plugin;
-        node->lib = lib;
-        TAILQ_INSERT_TAIL(&plugins, node, entries);
-        SCLogNotice("Initializing plugin %s; author=%s; license=%s", plugin->name, plugin->author,
-                plugin->license);
-        (*plugin->Init)();
     }
 }
 
@@ -139,6 +142,23 @@ void SCPluginsLoad(const char *capture_plugin_name, const char *capture_plugin_a
     }
 }
 
+bool SCRegisterEveFileType(SCPluginFileType *plugin)
+{
+    SCPluginFileType *existing = NULL;
+    TAILQ_FOREACH (existing, &output_types, entries) {
+        if (strcmp(existing->name, plugin->name) == 0) {
+            SCLogNotice("EVE file type plugin name conflicts with previously "
+                        "registered plugin: %s",
+                    plugin->name);
+            return false;
+        }
+    }
+
+    SCLogDebug("Registering EVE file type plugin %s", plugin->name);
+    TAILQ_INSERT_TAIL(&output_types, plugin, entries);
+    return true;
+}
+
 /**
  * \brief Register an Eve/JSON file type plugin.
  *
index 61c870be9c499faf891c80c2a4e545c0391b200a..7415eb68e4f4586aa93e9453a660fe228d2a161d 100644 (file)
@@ -25,4 +25,6 @@ void SCPluginsLoad(const char *capture_plugin_name, const char *capture_plugin_a
 SCPluginFileType *SCPluginFindFileType(const char *name);
 SCCapturePlugin *SCPluginFindCaptureByName(const char *name);
 
+bool RegisterPlugin(SCPlugin *, void *);
+
 #endif /* __UTIL_PLUGIN_H__ */