diff options
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/modules.c | 22 | ||||
-rw-r--r-- | runtime/modules.h | 3 | ||||
-rw-r--r-- | runtime/rsconf.c | 26 | ||||
-rw-r--r-- | runtime/rsconf.h | 2 | ||||
-rw-r--r-- | runtime/rule.c | 1 |
5 files changed, 45 insertions, 9 deletions
diff --git a/runtime/modules.c b/runtime/modules.c index e7ae72cc..6417cecd 100644 --- a/runtime/modules.c +++ b/runtime/modules.c @@ -1001,11 +1001,19 @@ Load(uchar *pModName, sbool bConfLoad, struct nvlst *lst) localRet = addModToCnfList(pModInfo); if(pModInfo->setModCnf != NULL && localRet == RS_RET_OK) { if(!strncmp((char*)pModName, "builtin:", sizeof("builtin:")-1)) { - /* for built-in moules, we need to call setModConf, - * because there is no way to set parameters at load - * time for obvious reasons... - */ - pModInfo->setModCnf(lst); + if(pModInfo->bSetModCnfCalled) { + errmsg.LogError(0, RS_RET_DUP_PARAM, + "parameters for built-in module %s already set - ignored\n", + pModName); + ABORT_FINALIZE(RS_RET_DUP_PARAM); + } else { + /* for built-in moules, we need to call setModConf, + * because there is no way to set parameters at load + * time for obvious reasons... + */ + pModInfo->setModCnf(lst); + pModInfo->bSetModCnfCalled = 1; + } } } } @@ -1119,8 +1127,10 @@ Load(uchar *pModName, sbool bConfLoad, struct nvlst *lst) if(bConfLoad) { addModToCnfList(pModInfo); - if(pModInfo->setModCnf != NULL) + if(pModInfo->setModCnf != NULL) { pModInfo->setModCnf(lst); + pModInfo->bSetModCnfCalled = 1; + } } finalize_it: diff --git a/runtime/modules.h b/runtime/modules.h index b0f7100f..6a143ae3 100644 --- a/runtime/modules.h +++ b/runtime/modules.h @@ -101,6 +101,7 @@ struct modInfo_s { uchar* pszName; /* printable module name, e.g. for dbgprintf */ uchar* cnfName; /* name to be used in config statements (e.g. 'name="omusrmsg"') */ unsigned uRefCnt; /* reference count for this module; 0 -> may be unloaded */ + sbool bSetModCnfCalled;/* is setModCnf already called? Needed for built-in modules */ /* functions supported by all types of modules */ rsRetVal (*modInit)(int, int*, rsRetVal(**)()); /* initialize the module */ /* be sure to support version handshake! */ @@ -181,7 +182,7 @@ ENDinterface(module) * - removed GetNxtType, added GetNxtCnfType - 2011-04-27 * v3 (see above) * v4 - * - added thrid parameter to Load() - 2012-06-20 + * - added third parameter to Load() - 2012-06-20 */ /* prototypes */ diff --git a/runtime/rsconf.c b/runtime/rsconf.c index fecd4f29..affa2dd5 100644 --- a/runtime/rsconf.c +++ b/runtime/rsconf.c @@ -64,6 +64,7 @@ #include "threads.h" #include "datetime.h" #include "parserif.h" +#include "modules.h" #include "dirty.h" /* static data */ @@ -151,11 +152,36 @@ rsRetVal rsconfConstructFinalize(rsconf_t __attribute__((unused)) *pThis) } +/* call freeCnf() module entry points AND free the module entries themselfes. + */ +static inline void +freeCnf(rsconf_t *pThis) +{ + cfgmodules_etry_t *etry, *del; + etry = pThis->modules.root; + while(etry != NULL) { + if(etry->pMod->beginCnfLoad != NULL) { + dbgprintf("calling freeCnf(%p) for module '%s'\n", + etry->modCnf, (char*) module.GetName(etry->pMod)); + etry->pMod->freeCnf(etry->modCnf); + } + del = etry; + etry = etry->next; + free(del); + } +} + + /* destructor for the rsconf object */ BEGINobjDestruct(rsconf) /* be sure to specify the object type also in END and CODESTART macros! */ CODESTARTobjDestruct(rsconf) +dbgprintf("AAA: rsconfObjDesctruct called\n"); + freeCnf(pThis); + tplDeleteAll(pThis); free(pThis->globals.mainQ.pszMainMsgQFName); + free(pThis->globals.pszConfDAGFile); llDestroy(&(pThis->rulesets.llRulesets)); +dbgprintf("AAA: rsconfObjDesctruct exit\n"); ENDobjDestruct(rsconf) diff --git a/runtime/rsconf.h b/runtime/rsconf.h index 8715cf1b..484fec8c 100644 --- a/runtime/rsconf.h +++ b/runtime/rsconf.h @@ -97,8 +97,8 @@ struct defaults_s { struct cfgmodules_etry_s { cfgmodules_etry_t *next; modInfo_t *pMod; - /* the following data is input module specific */ void *modCnf; /* pointer to the input module conf */ + /* the following data is input module specific */ sbool canActivate; /* OK to activate this config? */ sbool canRun; /* OK to run this config? */ }; diff --git a/runtime/rule.c b/runtime/rule.c index 254f2f10..6d14199b 100644 --- a/runtime/rule.c +++ b/runtime/rule.c @@ -338,7 +338,6 @@ CODESTARTobjDestruct(rule) } else if(pThis->f_filter_type == FILTER_EXPR) { cnfexprDestruct(pThis->f_filterData.expr); } -#warning: need to destroy expression based filter! llDestroy(&pThis->llActList); ENDobjDestruct(rule) |