From 55247a3f12a9eee7ba3fd7ca6d8fcea7a82c20f3 Mon Sep 17 00:00:00 2001 From: Zuhaitz Méndez Fernández de Aránguiz Date: Sun, 11 Jan 2026 15:11:00 +0000 Subject: Added src/ folder. Now I will add the rest. --- src/plugins/plugin_manager.c | 105 +++++++++++++++++++++++++++++++++++++++++++ src/plugins/plugin_manager.h | 23 ++++++++++ 2 files changed, 128 insertions(+) create mode 100644 src/plugins/plugin_manager.c create mode 100644 src/plugins/plugin_manager.h (limited to 'src/plugins') diff --git a/src/plugins/plugin_manager.c b/src/plugins/plugin_manager.c new file mode 100644 index 0000000..a135e06 --- /dev/null +++ b/src/plugins/plugin_manager.c @@ -0,0 +1,105 @@ + +#include "plugin_manager.h" +#include +#include +#include +#include + +// Linked list node for plugins. +typedef struct PluginNode +{ + ZPlugin *plugin; + void *handle; // dlopen handle (NULL for built-ins). + struct PluginNode *next; +} PluginNode; + +static PluginNode *head = NULL; + +void zptr_plugin_mgr_init(void) +{ + head = NULL; +} + +void zptr_register_plugin(ZPlugin *plugin) +{ + if (!plugin) + { + return; + } + + if (zptr_find_plugin(plugin->name)) + { + return; + } + + PluginNode *node = malloc(sizeof(PluginNode)); + node->plugin = plugin; + node->handle = NULL; + node->next = head; + head = node; +} + +int zptr_load_plugin(const char *path) +{ + void *handle = dlopen(path, RTLD_LAZY); + if (!handle) + { + fprintf(stderr, "Failed to load plugin '%s': %s\n", path, dlerror()); + return 0; + } + + ZPluginInitFn init_fn = (ZPluginInitFn)dlsym(handle, "z_plugin_init"); + if (!init_fn) + { + fprintf(stderr, "Plugin '%s' missing 'z_plugin_init' symbol\n", path); + dlclose(handle); + return 0; + } + + ZPlugin *plugin = init_fn(); + if (!plugin) + { + fprintf(stderr, "Plugin '%s' init returned NULL\n", path); + dlclose(handle); + return 0; + } + + // Register + PluginNode *node = malloc(sizeof(PluginNode)); + node->plugin = plugin; + node->handle = handle; + node->next = head; + head = node; + + return 1; +} + +ZPlugin *zptr_find_plugin(const char *name) +{ + PluginNode *curr = head; + while (curr) + { + if (strcmp(curr->plugin->name, name) == 0) + { + return curr->plugin; + } + curr = curr->next; + } + return NULL; +} + +void zptr_plugin_mgr_cleanup(void) +{ + PluginNode *curr = head; + while (curr) + { + PluginNode *next = curr->next; + if (curr->handle) + { + dlclose(curr->handle); + } + free(curr); + curr = next; + } + head = NULL; +} diff --git a/src/plugins/plugin_manager.h b/src/plugins/plugin_manager.h new file mode 100644 index 0000000..a1e8ca6 --- /dev/null +++ b/src/plugins/plugin_manager.h @@ -0,0 +1,23 @@ +#ifndef PLUGIN_MANAGER_H +#define PLUGIN_MANAGER_H + +#include "../../plugins/zprep_plugin.h" + +// Initialize the plugin system. +void zptr_plugin_mgr_init(void); + +// Register a plugin directly (for built-ins). +void zptr_register_plugin(ZPlugin *plugin); + +// Load a plugin from a shared object file (.so). +// Returns 1 on success, 0 on failure. +// Yeah, for now, I'm sorry Windows guys. +int zptr_load_plugin(const char *path); + +// Find a registered plugin by name. +ZPlugin *zptr_find_plugin(const char *name); + +// Cleanup. +void zptr_plugin_mgr_cleanup(void); + +#endif -- cgit v1.2.3