diff options
author | cbdev <cb@cbcdn.com> | 2019-05-26 16:02:29 +0200 |
---|---|---|
committer | cbdev <cb@cbcdn.com> | 2019-05-26 16:02:29 +0200 |
commit | a8233d97936eeed545ea763c0ace1eb4f87219f9 (patch) | |
tree | a15bdfbc91226bbb94052817e9fa15decc1abbc6 /plugin.c | |
parent | 4c6833d470eda4be02b4dfb32cdeba9d93c67f43 (diff) | |
download | websocksy-a8233d97936eeed545ea763c0ace1eb4f87219f9.tar.gz websocksy-a8233d97936eeed545ea763c0ace1eb4f87219f9.tar.bz2 websocksy-a8233d97936eeed545ea763c0ace1eb4f87219f9.zip |
Basic plugin loading
Diffstat (limited to 'plugin.c')
-rw-r--r-- | plugin.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/plugin.c b/plugin.c new file mode 100644 index 0000000..8b61ec3 --- /dev/null +++ b/plugin.c @@ -0,0 +1,77 @@ +#include <string.h> +#include <stdio.h> + +#include "websocksy.h" +#include "plugin.h" + +static size_t framing_functions = 0; +static ws_framing* framing_function = NULL; +static char** framing_function_name = NULL; + +int plugin_framing_load(char* path){ + //TODO load plugins + return 1; +} + +int plugin_backend_load(char* backend_requested, ws_backend* backend){ + //TODO load backend + return 1; +} + +int plugin_register_framing(char* name, ws_framing func){ + size_t u; + + for(u = 0; u < framing_functions; u++){ + if(!strcmp(framing_function_name[u], name)){ + fprintf(stderr, "Replacing framing %s\n", name); + break; + } + } + + if(u == framing_functions){ + framing_function = realloc(framing_function, (framing_functions + 1) * sizeof(ws_framing)); + framing_function_name = realloc(framing_function_name, (framing_functions + 1) * sizeof(char*)); + if(!framing_function || !framing_function_name){ + fprintf(stderr, "Failed to allocate memory for framing function\n"); + return 1; + } + + framing_function_name[u] = strdup(name); + framing_functions++; + } + + framing_function[u] = func; + return 0; +} + +ws_framing plugin_framing(char* name){ + size_t u; + + if(!name){ + return plugin_framing("auto"); + } + + for(u = 0; u < framing_functions; u++){ + if(!strcmp(framing_function_name[u], name)){ + return framing_function[u]; + } + } + + //if unknown framing, return the default + return plugin_framing("auto"); +} + +void plugin_cleanup(){ + size_t u; + //TODO dlclose all plugins + + for(u = 0; u < framing_functions; u++){ + free(framing_function_name[u]); + } + free(framing_function); + framing_function = NULL; + free(framing_function_name); + framing_function_name = 0; + framing_function = NULL; + framing_functions = 0; +} |