From ed2b3a38ec05c566c645dc2aabfd513edff8d63b Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Sun, 25 Dec 2016 22:55:21 +0100 Subject: Plugins --- main.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 66 insertions(+), 10 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index 60b9584..52d10bd 100644 --- a/main.c +++ b/main.c @@ -7,9 +7,11 @@ #include #include #include +#include #include #include "http.h" #include "memory.h" +#include "plugin.h" #include "util.h" @@ -37,27 +39,81 @@ static void signal_handler(int sig){ } +typedef struct Plugin{ + char *name; + Handler handler; + struct Plugin *next; +} Plugin; + +Plugin *pluginlist=NULL,*pluginlist_last=NULL; + +static void plugin_register_callback(const char *name,Handler handler){ + if(pluginlist==NULL){ + pluginlist=pluginlist_last=malloc(1,Plugin); + pluginlist->name=copy_str(name); + pluginlist->handler=handler; + pluginlist->next=NULL; + } else { + Plugin *newplugin=malloc(1,Plugin); + newplugin->name=copy_str(name); + newplugin->handler=handler; + newplugin->next=NULL; + pluginlist_last->next=newplugin; + pluginlist_last=newplugin; + } + printf("Registered plugin '%s' (handler %p)\n",name,handler); +} + +typedef void (*register_function)(register_callback_t callback); + +static void load_plugin(const char *name){ + void *lib=dlopen(name,RTLD_NOW|RTLD_LOCAL); + if(lib==NULL){ + fprintf(stderr,"dlopen(%s): %s\n",name,dlerror()); + exit(1); + } + register_function regfunc=(register_function)dlsym(lib,"plugin_register_yourself"); + if(regfunc==NULL){ + fprintf(stderr,"Cannot find plugin_register_yourself symbol in library '%s'\n",name); + exit(1); + } + regfunc(&plugin_register_callback); +} + + static void connection_handler(int sock){ Headers *headers=http_get_headers(sock); if(headers==NULL){ return; } - sendall(sock,"HTTP/1.1 200 OK\r\n" - "Content-Type: text/plain; charset=UTF-8\r\n" - "Server: cserver\r\n" - "\r\n",-1); + for(Plugin *pl=pluginlist;pl!=NULL;pl=pl->next){ + switch(pl->handler(sock,headers)){ + case HR_HANDLED: + printf("Request handled by %s\n",pl->name); + break; + + case HR_NEXT: + continue; - sendallf(sock,"Method: %s\n",headers->method); - sendallf(sock,"URL: %s\n",headers->url); - sendallf(sock,"Version: %s\n",headers->version); - for(int i=0;inheaders;i++){ - sendallf(sock,"Header '%s': '%s'\n",headers->headers[i][0],headers->headers[i][1]); + case HR_ERROR: + printf("Request handler '%s' threw error\n",pl->name); + break; + } + break; } } -int main(void){ +int main(int argc,char **argv){ + if(argc==1){ + printf("Loading no plugin files\n"); + } else { + for(int i=1;i