summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/CMakeLists.txt3
-rw-r--r--src/common/Makefile.in2
-rw-r--r--src/common/core.c5
-rw-r--r--src/common/plugin.h86
-rw-r--r--src/common/plugins.c415
-rw-r--r--src/common/plugins.h69
6 files changed, 1 insertions, 579 deletions
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index effd0b2ab..6be5f170a 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -31,7 +31,6 @@ set( COMMON_ALL_HEADERS
"${CMAKE_CURRENT_BINARY_DIR}/svnversion.h"
"${COMMON_SOURCE_DIR}/cbasetypes.h"
"${COMMON_SOURCE_DIR}/mmo.h"
- "${COMMON_SOURCE_DIR}/plugin.h"
)
set( COMMON_MINI_HEADERS
@@ -71,7 +70,6 @@ set( COMMON_BASE_HEADERS
"${COMMON_SOURCE_DIR}/mapindex.h"
"${COMMON_SOURCE_DIR}/md5calc.h"
"${COMMON_SOURCE_DIR}/nullpo.h"
- "${COMMON_SOURCE_DIR}/plugins.h"
"${COMMON_SOURCE_DIR}/random.h"
"${COMMON_SOURCE_DIR}/showmsg.h"
"${COMMON_SOURCE_DIR}/socket.h"
@@ -92,7 +90,6 @@ set( COMMON_BASE_SOURCES
"${COMMON_SOURCE_DIR}/mapindex.c"
"${COMMON_SOURCE_DIR}/md5calc.c"
"${COMMON_SOURCE_DIR}/nullpo.c"
- "${COMMON_SOURCE_DIR}/plugins.c"
"${COMMON_SOURCE_DIR}/random.c"
"${COMMON_SOURCE_DIR}/showmsg.c"
"${COMMON_SOURCE_DIR}/socket.c"
diff --git a/src/common/Makefile.in b/src/common/Makefile.in
index 5e3b00a88..c778ff17b 100644
--- a/src/common/Makefile.in
+++ b/src/common/Makefile.in
@@ -1,5 +1,5 @@
-COMMON_OBJ = obj_all/core.o obj_all/socket.o obj_all/timer.o obj_all/db.o obj_all/plugins.o obj_all/lock.o \
+COMMON_OBJ = obj_all/core.o obj_all/socket.o obj_all/timer.o obj_all/db.o obj_all/lock.o \
obj_all/nullpo.o obj_all/malloc.o obj_all/showmsg.o obj_all/strlib.o obj_all/utils.o \
obj_all/grfio.o obj_all/mapindex.o obj_all/ers.o obj_all/md5calc.o \
obj_all/minicore.o obj_all/minisocket.o obj_all/minimalloc.o obj_all/random.o obj_all/des.o \
diff --git a/src/common/core.c b/src/common/core.c
index 37e5fc562..bde1d9c0b 100644
--- a/src/common/core.c
+++ b/src/common/core.c
@@ -9,7 +9,6 @@
#include "../common/db.h"
#include "../common/socket.h"
#include "../common/timer.h"
-#include "../common/plugins.h"
#endif
#include <stdio.h>
@@ -288,10 +287,8 @@ int main (int argc, char **argv)
timer_init();
socket_init();
- plugins_init();
do_init(argc,argv);
- plugin_event_trigger(EVENT_ATHENA_INIT);
{// Main runtime cycle
int next;
@@ -301,11 +298,9 @@ int main (int argc, char **argv)
}
}
- plugin_event_trigger(EVENT_ATHENA_FINAL);
do_final();
timer_final();
- plugins_final();
socket_final();
db_final();
#endif
diff --git a/src/common/plugin.h b/src/common/plugin.h
deleted file mode 100644
index ec6399c57..000000000
--- a/src/common/plugin.h
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _PLUGIN_H_
-#define _PLUGIN_H_
-
-#include "../common/cbasetypes.h"
-
-////// Plugin functions ///////////////
-
-// Plugin version <major version>.<minor version>
-// * <major version> is increased and <minor version> reset when at least one
-// export of the previous version becomes incompatible
-// * <minor version> is increased if the previous version remains compatible
-//
-// Compatible plugins have:
-// - equal major version
-// - lower or equal minor version
-#define PLUGIN_VERSION "1.03"
-
-typedef struct _Plugin_Info {
- char* name;
- char type;
- char* version;
- char* req_version;
- char* description;
-} Plugin_Info;
-
-typedef struct _Plugin_Event_Table {
- char* func_name;
- char* event_name;
-} Plugin_Event_Table;
-
-// Format of the test function
-typedef int Plugin_Test_Func(void);
-#define EVENT_PLUGIN_INIT "Plugin_Init" // Initialize the plugin
-#define EVENT_PLUGIN_FINAL "Plugin_Final" // Finalize the plugin
-#define EVENT_ATHENA_INIT "Athena_Init" // Server started
-#define EVENT_ATHENA_FINAL "Athena_Final" // Server ended
-
-// Format of event functions
-typedef void Plugin_Event_Func(void);
-#define EVENT_PLUGIN_TEST "Plugin_Test" // Test the plugin for compatibility
-
-////// Plugin Export functions /////////////
-
-#define PLUGIN_ALL 0
-#define PLUGIN_LOGIN 1
-#define PLUGIN_CHAR 2
-#define PLUGIN_MAP 8
-#define PLUGIN_CORE 16
-
-#define IMPORT_SYMBOL(s,n) SET_FUNCPOINTER((s), plugin_call_table[n])
-
-#define SYMBOL_SERVER_TYPE 0
-#define SYMBOL_SERVER_NAME 1
-#define SYMBOL_ARG_C 2
-#define SYMBOL_ARG_V 3
-#define SYMBOL_RUNFLAG 4
-#define SYMBOL_GETTICK 5
-#define SYMBOL_GET_SVN_REVISION 6
-#define SYMBOL_ADD_TIMER 7
-#define SYMBOL_ADD_TIMER_INTERVAL 8
-#define SYMBOL_ADD_TIMER_FUNC_LIST 9
-#define SYMBOL_DELETE_TIMER 10
-#define SYMBOL_GET_UPTIME 11
-#define SYMBOL_ADDR 12
-#define SYMBOL_FD_MAX 13
-#define SYMBOL_SESSION 14
-#define SYMBOL_DELETE_SESSION 15
-#define SYMBOL_WFIFOSET 16
-#define SYMBOL_RFIFOSKIP 17
-#define SYMBOL_FUNC_PARSE_TABLE 18
-// 1.03
-#define SYMBOL_PARSE_CONSOLE 19
-
-////// Global Plugin variables /////////////
-
-#define PLUGIN_INFO struct _Plugin_Info plugin_info
-#define PLUGIN_EVENTS_TABLE struct _Plugin_Event_Table plugin_event_table[]
-
-#ifndef _PLUGINS_H_
-void** plugin_call_table;
-#endif
-
-#endif /* _PLUGIN_H_ */
diff --git a/src/common/plugins.c b/src/common/plugins.c
deleted file mode 100644
index 5e021f35e..000000000
--- a/src/common/plugins.c
+++ /dev/null
@@ -1,415 +0,0 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include "../common/mmo.h"
-#include "../common/core.h"
-#include "../common/timer.h"
-#include "../common/utils.h" // findfile()
-#include "../common/socket.h"
-#include "../common/malloc.h"
-#include "../common/showmsg.h"
-#include "plugins.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#ifndef WIN32
-#include <unistd.h>
-#endif
-
-//////////////////////////////////////////////
-
-typedef struct _Plugin_Event {
- struct _Plugin_Event* next;
- Plugin_Event_Func* func;
-} Plugin_Event;
-
-typedef struct _Plugin_Event_List {
- struct _Plugin_Event_List* next;
- char* name;
- struct _Plugin_Event* events;
-} Plugin_Event_List;
-
-static int auto_search = 0;
-static int load_priority = 0;
-Plugin_Event_List* event_head = NULL;
-Plugin* plugin_head = NULL;
-
-static Plugin_Info default_info = { "Unknown", PLUGIN_ALL, "0", PLUGIN_VERSION, "Unknown" };
-
-void** plugin_call_table;
-static size_t call_table_size = 0;
-static size_t max_call_table = 0;
-
-////// Plugin Events Functions //////////////////
-
-int register_plugin_func(char* name)
-{
- Plugin_Event_List* evl;
- if( name ){
- //ShowDebug("register_plugin_func(%s)\n", name);
- CREATE(evl, Plugin_Event_List, 1);
- evl->next = event_head;
- evl->name = aStrdup(name);
- evl->events = NULL;
- event_head = evl;
- }
- return 0;
-}
-
-static Plugin_Event_List* search_plugin_func(char* name)
-{
- Plugin_Event_List* evl = event_head;
- while( evl ){
- if( strcmpi(evl->name,name) == 0 )
- return evl;
- evl = evl->next;
- }
- return NULL;
-}
-
-int register_plugin_event(Plugin_Event_Func* func, char* name)
-{
- Plugin_Event_List* evl = search_plugin_func(name);
- //ShowDebug("register_plugin_event(0x%x, %s)\n", func, name);
- if( !evl )
- {// event does not exist, register
- register_plugin_func(name);
- // get the new event list
- evl = search_plugin_func(name);
- }
- if( evl ){
- Plugin_Event* ev;
-
- CREATE(ev, Plugin_Event, 1);
- ev->func = func;
- ev->next = NULL;
-
- // insert event at the end of the linked list
- if( evl->events == NULL )
- evl->events = ev;
- else {
- Plugin_Event* last_ev = evl->events;
- while( last_ev ){
- if( last_ev->next == NULL ){
- last_ev->next = ev;
- break;
- }
- last_ev = last_ev->next;
- }
- }
- }
- return 0;
-}
-
-int plugin_event_trigger(char* name)
-{
- int c = 0;
- Plugin_Event_List* evl = search_plugin_func(name);
- //ShowDebug("plugin_event_trigger(%s)\n", name);
- if( evl ){
- Plugin_Event* ev = evl->events;
- while( ev ){
- ev->func();
- //ShowDebug("plugin_event_trigger: Executing function 0x%x.\n", ev->func);
- ev = ev->next;
- ++c;
- }
- }
- return c;
-}
-
-////// Plugins Call Table Functions /////////
-
-int export_symbol(void* var, size_t offset)
-{
- //ShowDebug("export_symbol(0x%x,%d)\n", var,offset);
-
- // add to the end of the list
- if( offset < 0 )
- offset = call_table_size;
-
- if( offset >= max_call_table )
- {// realloc if not large enough
- max_call_table = 1 + offset;
- RECREATE(plugin_call_table, void*, max_call_table);
-
- // clear the new alloced block
- memset(plugin_call_table + call_table_size, 0, (max_call_table-call_table_size)*sizeof(void*));
- }
-
- // the new table size is delimited by the new element at the end
- if( offset >= call_table_size )
- call_table_size = offset+1;
-
- // put the pointer at the selected place
- plugin_call_table[offset] = var;
- return 0;
-}
-
-////// Plugins Core /////////////////////////
-
-static int plugin_iscompatible(char* version)
-{
- int req_major = 0;
- int req_minor = 0;
- int major = 0;
- int minor = 0;
-
- if( version == NULL )
- return 0;
- sscanf(version, "%d.%d", &req_major, &req_minor);
- sscanf(PLUGIN_VERSION, "%d.%d", &major, &minor);
- return ( req_major == major && req_minor <= minor );
-}
-
-Plugin* plugin_open(const char* filename)
-{
- Plugin* plugin;
- Plugin_Info* info;
- Plugin_Event_Table* events;
- void** procs;
- int init_flag = 1;
-
- //ShowDebug("plugin_open(%s)\n", filename);
-
- // Check if the plugin has been loaded before
- plugin = plugin_head;
- while (plugin) {
- // returns handle to the already loaded plugin
- if( plugin->state && strcmpi(plugin->filename, filename) == 0 ){
- ShowWarning("plugin_open: not loaded (duplicate) : '"CL_WHITE"%s"CL_RESET"'\n", filename);
- return plugin;
- }
- plugin = plugin->next;
- }
-
- CREATE(plugin, Plugin, 1);
- plugin->state = -1; // not loaded
-
- plugin->dll = DLL_OPEN(filename);
- if( !plugin->dll ){
- ShowWarning("plugin_open: not loaded (invalid file) : '"CL_WHITE"%s"CL_RESET"'\n", filename);
- plugin_unload(plugin);
- return NULL;
- }
-
- // Retrieve plugin information
- plugin->state = 0; // initialising
- info = (Plugin_Info*)DLL_SYM(plugin->dll, "plugin_info");
- // For high priority plugins (those that are explicitly loaded from the conf file)
- // we'll ignore them even (could be a 3rd party dll file)
- if( !info )
- {// foreign plugin
- //ShowDebug("plugin_open: plugin_info not found\n");
- if( load_priority == 0 )
- {// not requested
- //ShowDebug("plugin_open: not loaded (not requested) : '"CL_WHITE"%s"CL_RESET"'\n", filename);
- plugin_unload(plugin);
- return NULL;
- }
- } else if( !plugin_iscompatible(info->req_version) )
- {// incompatible version
- ShowWarning("plugin_open: not loaded (incompatible version '%s' -> '%s') : '"CL_WHITE"%s"CL_RESET"'\n", info->req_version, PLUGIN_VERSION, filename);
- plugin_unload(plugin);
- return NULL;
- } else if( (info->type != PLUGIN_ALL && info->type != PLUGIN_CORE && info->type != SERVER_TYPE) ||
- (info->type == PLUGIN_CORE && SERVER_TYPE != PLUGIN_LOGIN && SERVER_TYPE != PLUGIN_CHAR && SERVER_TYPE != PLUGIN_MAP) )
- {// not for this server
- //ShowDebug("plugin_open: not loaded (incompatible) : '"CL_WHITE"%s"CL_RESET"'\n", filename);
- plugin_unload(plugin);
- return NULL;
- }
-
- plugin->info = ( info != NULL ? info : &default_info );
- plugin->filename = aStrdup(filename);
-
- // Initialise plugin call table (For exporting procedures)
- procs = (void**)DLL_SYM(plugin->dll, "plugin_call_table");
- if( procs )
- *procs = plugin_call_table;
- //else ShowDebug("plugin_open: plugin_call_table not found\n");
-
- // Register plugin events
- events = (Plugin_Event_Table*)DLL_SYM(plugin->dll, "plugin_event_table");
- if( events ){
- int i = 0;
- //ShowDebug("plugin_open: parsing plugin_event_table\n");
- while( events[i].func_name ){
- if( strcmpi(events[i].event_name, EVENT_PLUGIN_TEST) == 0 ){
- Plugin_Test_Func* test_func;
- test_func = (Plugin_Test_Func*)DLL_SYM(plugin->dll, events[i].func_name);
- //ShowDebug("plugin_open: invoking "EVENT_PLUGIN_TEST" with %s()\n", events[i].func_name);
- if( test_func && test_func() == 0 ){
- // plugin has failed test, disabling
- //ShowDebug("plugin_open: disabled (failed test) : %s\n", filename);
- init_flag = 0;
- }
- } else {
- Plugin_Event_Func* func;
- func = (Plugin_Event_Func*)DLL_SYM(plugin->dll, events[i].func_name);
- if (func)
- register_plugin_event(func, events[i].event_name);
- else
- ShowError("Failed to locate function '%s' in '%s'.\n", events[i].func_name, filename);
- }
- i++;
- }
- }
- //else ShowDebug("plugin_open: plugin_event_table not found\n");
-
- plugin->next = plugin_head;
- plugin_head = plugin;
-
- plugin->state = init_flag; // fully loaded
- ShowStatus("Done loading plugin '"CL_WHITE"%s"CL_RESET"'\n", (info) ? plugin->info->name : filename);
-
- return plugin;
-}
-
-void plugin_load(const char* filename)
-{
- plugin_open(filename);
-}
-
-void plugin_unload(Plugin* plugin)
-{
- if( plugin == NULL )
- return;
- if( plugin->filename )
- aFree(plugin->filename);
- if( plugin->dll )
- DLL_CLOSE(plugin->dll);
- aFree(plugin);
-}
-
-#ifdef WIN32
-char *DLL_ERROR(void)
-{
- static char dllbuf[80];
- DWORD dw = GetLastError();
- FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw, 0, dllbuf, 80, NULL);
- return dllbuf;
-}
-#endif
-
-////// Initialize/Finalize ////////////////////
-
-static int plugins_config_read(const char *cfgName)
-{
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- fp = fopen(cfgName, "r");
- if( fp == NULL ){
- ShowError("File not found: %s\n", cfgName);
- return 1;
- }
- while( fgets(line, sizeof(line), fp) )
- {
- if( line[0] == '/' && line[1] == '/' )
- continue;
- if( sscanf(line,"%[^:]: %[^\r\n]",w1,w2) != 2 )
- continue;
-
- if( strcmpi(w1,"auto_search") == 0 ){
- if( strcmpi(w2,"yes") == 0 )
- auto_search = 1;
- else if( strcmpi(w2,"no") == 0 )
- auto_search = 0;
- else
- auto_search = atoi(w2);
- } else if( strcmpi(w1,"plugin") == 0 ){
- char filename[128];
- sprintf(filename, "plugins/%s%s", w2, DLL_EXT);
- plugin_load(filename);
- } else if( strcmpi(w1,"import") == 0 )
- plugins_config_read(w2);
- else
- ShowWarning("Unknown setting '%s' in file %s\n", w1, cfgName);
- }
- fclose(fp);
- return 0;
-}
-
-void plugins_init(void)
-{
- // Sugested functionality:
- // add atcommands/script commands (Borf)
- char* PLUGIN_CONF_FILENAME = "conf/plugin_athena.conf";
- //ShowDebug("plugins_init()\n");
- register_plugin_func(EVENT_PLUGIN_INIT);
- register_plugin_func(EVENT_PLUGIN_FINAL);
- register_plugin_func(EVENT_ATHENA_INIT);
- register_plugin_func(EVENT_ATHENA_FINAL);
-
- // networking
- EXPORT_SYMBOL(RFIFOSKIP, SYMBOL_RFIFOSKIP);
- EXPORT_SYMBOL(WFIFOSET, SYMBOL_WFIFOSET);
- EXPORT_SYMBOL(do_close, SYMBOL_DELETE_SESSION);
- EXPORT_SYMBOL(session, SYMBOL_SESSION);
- EXPORT_SYMBOL(&fd_max, SYMBOL_FD_MAX);
- EXPORT_SYMBOL(addr_, SYMBOL_ADDR);
- // timers
- EXPORT_SYMBOL(get_uptime, SYMBOL_GET_UPTIME);
- EXPORT_SYMBOL(delete_timer, SYMBOL_DELETE_TIMER);
- EXPORT_SYMBOL(add_timer_func_list, SYMBOL_ADD_TIMER_FUNC_LIST);
- EXPORT_SYMBOL(add_timer_interval, SYMBOL_ADD_TIMER_INTERVAL);
- EXPORT_SYMBOL(add_timer, SYMBOL_ADD_TIMER);
- EXPORT_SYMBOL((void*)get_svn_revision, SYMBOL_GET_SVN_REVISION);
- EXPORT_SYMBOL(gettick, SYMBOL_GETTICK);
- // core
- EXPORT_SYMBOL(parse_console, SYMBOL_PARSE_CONSOLE);
- EXPORT_SYMBOL(&runflag, SYMBOL_RUNFLAG);
- EXPORT_SYMBOL(arg_v, SYMBOL_ARG_V);
- EXPORT_SYMBOL(&arg_c, SYMBOL_ARG_C);
- EXPORT_SYMBOL(SERVER_NAME, SYMBOL_SERVER_NAME);
- EXPORT_SYMBOL(&SERVER_TYPE, SYMBOL_SERVER_TYPE);
-
- load_priority = 1;
- plugins_config_read(PLUGIN_CONF_FILENAME);
- load_priority = 0;
-
- if( auto_search )
- findfile("plugins", DLL_EXT, plugin_load);
-
- plugin_event_trigger(EVENT_PLUGIN_INIT);
-
- return;
-}
-
-void plugins_final(void)
-{
- Plugin* plugin = plugin_head;
- Plugin* next_plugin;
- Plugin_Event_List* evl = event_head;
- Plugin_Event_List* next_evl;
- Plugin_Event* ev;
- Plugin_Event* next_ev;
-
- //ShowDebug("plugins_final()\n");
- plugin_event_trigger(EVENT_PLUGIN_FINAL);
-
- while( plugin ){
- next_plugin = plugin->next;
- plugin_unload(plugin);
- plugin = next_plugin;
- }
-
- while( evl ){
- ev = evl->events;
- while( ev ){
- next_ev = ev->next;
- aFree(ev);
- ev = next_ev;
- }
- next_evl = evl->next;
- aFree(evl->name);
- aFree(evl);
- evl = next_evl;
- }
-
- aFree(plugin_call_table);
-
- return;
-}
diff --git a/src/common/plugins.h b/src/common/plugins.h
deleted file mode 100644
index 8c9c70d9f..000000000
--- a/src/common/plugins.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _PLUGINS_H_
-#define _PLUGINS_H_
-
-#include "../common/cbasetypes.h"
-#include "../common/plugin.h"
-
-////// Dynamic Link Library functions ///////////////
-
-#ifdef WIN32
-
- #define WIN32_LEAN_AND_MEAN
- #include <windows.h>
- #define DLL_OPEN(x) LoadLibraryA(x)
- #define DLL_SYM(x,y) GetProcAddress(x,y)
- #define DLL_CLOSE(x) FreeLibrary(x)
- char *DLL_ERROR(void);
-
- #define DLL_EXT ".dll"
- #define DLL HINSTANCE
-
-#else
-
- #include <dlfcn.h>
- #define DLL_OPEN(x) dlopen(x,RTLD_NOW)
- #define DLL_SYM(x,y) dlsym(x,y)
- #define DLL_CLOSE(x) dlclose(x)
- #define DLL_ERROR dlerror
-
- #ifdef CYGWIN
- #define DLL_EXT ".dll"
- #else
- #define DLL_EXT ".so"
- #endif
- #define DLL void *
-
- #include <string.h> // size_t
-
-#endif
-
-////// Plugin Definitions ///////////////////
-
-typedef struct _Plugin {
- DLL dll;
- char state;
- char* filename;
- struct _Plugin_Info* info;
- struct _Plugin* next;
-} Plugin;
-
-/////////////////////////////////////////////
-
-int register_plugin_func(char* name);
-int register_plugin_event(Plugin_Event_Func* func, char* name);
-int plugin_event_trigger(char* name);
-
-int export_symbol(void* var, size_t offset);
-#define EXPORT_SYMBOL(s,o) export_symbol((void*)(s),(o));
-#define EXPORT_SYMBOL2(s) EXPORT_SYMBOL((s), -1);
-
-Plugin* plugin_open(const char* filename);
-void plugin_load(const char* filename);
-void plugin_unload(Plugin* plugin);
-void plugins_init(void);
-void plugins_final(void);
-
-#endif /* _PLUGINS_H_ */