added modules to neonserv.example.conf and added protected as a module setting
[NeonServV5.git] / src / modules.c
index b848f6d3d13af756379039c3667edce98776d8f8..d29e7a8018515653d5e7ed38b19919be46ee6017 100644 (file)
@@ -256,17 +256,25 @@ static void unregister_module_hooks(int module_id);
 void loadModules() {
     char **modulelist = get_all_fieldnames("modules");
     int i = 0;
+    char tmp[MAXLEN];
+    struct ModuleInfo *modinfo;
     while(modulelist[i]) {
-        loadModule(modulelist[i]);
+        sprintf(tmp, "modules.%s.enabled", modulelist[i]);
+        if(get_int_field(tmp)) {
+            modinfo = loadModule(modulelist[i]);
+            sprintf(tmp, "modules.%s.protected", modulelist[i]);
+            if(!get_int_field(tmp))
+                modinfo->state |= MODINFO_STATE_PROTECTED;
+        }
         i++;
     }
     start_modules();
 }
 
-int loadModule(char *name) {
+struct ModuleInfo *loadModule(char *name) {
     struct ModuleInfo *modinfo;
     for(modinfo = modules; modinfo; modinfo = modinfo->next) {
-        if(!stricmp(modinfo->name, name)) return 0;
+        if(!stricmp(modinfo->name, name)) return NULL;
     }
     char fname[256];
     #ifndef WIN32
@@ -277,7 +285,7 @@ int loadModule(char *name) {
         module = dlopen(fname, RTLD_LAZY);
         if(!module) {
             putlog(LOGLEVEL_ERROR, "Error loading module '%s': %s not found.\n", name, fname);
-            return 0;
+            return NULL;
         }
     }
     void* initfunc = dlsym(module, "init_module");
@@ -290,7 +298,7 @@ int loadModule(char *name) {
     HMODULE module = LoadLibrary(fname);
     if(!module) {
         putlog(LOGLEVEL_ERROR, "Error loading module '%s': %s not found.\n", name, fname);
-        return 0;
+        return NULL;
     }
     FARPROC initfunc = GetProcAddress(module, "init_module");
     FARPROC startfunc = GetProcAddress(module, "start_module");
@@ -300,24 +308,24 @@ int loadModule(char *name) {
     #endif
     if(!startfunc || !loopfunc || !stopfunc || !modversion) {
         putlog(LOGLEVEL_ERROR, "Error loading module '%s': required symbols not found.\n", name);
-        return 0;
+        return NULL;
     }
     int version = ((int (*)(void)) modversion)();
     if(version != MODULE_VERSION) {
         putlog(LOGLEVEL_ERROR, "Error loading module '%s': version mismatch ('%d' main code, '%d' module)\n", name, MODULE_VERSION, version);
-        return 0;
+        return NULL;
     }
     //start module
     int errid;
     int module_id = module_id_counter++;
     if((errid = ((int (*)(void **, int)) initfunc)(global_functions, module_id))) {
         putlog(LOGLEVEL_ERROR, "Error loading module '%s': module reported error (errid: %d)\n", name, errid);
-        return 0;
+        return NULL;
     }
     modinfo = malloc(sizeof(*modinfo));
     if(!modinfo) {
         unregister_module_hooks(module_id);
-        return 0;
+        return NULL;
     }
     modinfo->name = strdup(name);
     modinfo->module_id = module_id;
@@ -327,7 +335,7 @@ int loadModule(char *name) {
     modinfo->stopfunc = stopfunc;
     modinfo->next = modules;
     modules = modinfo;
-    return 1;
+    return modinfo;
 }
 
 #ifndef WIN32
@@ -357,6 +365,9 @@ int ext_unload_module(char *name) {
     struct ModuleInfo *old_modinfo, *old_prev = NULL;
     for(old_modinfo = modules; old_modinfo; old_modinfo = old_modinfo->next) {
         if(!stricmp(old_modinfo->name, name)) {
+            if(old_modinfo->state & MODINFO_STATE_PROTECTED) {
+                return 0;
+            }
             if(old_prev)
                 old_prev->next = old_modinfo->next;
             else