diff options
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | runtime/parser.c | 8 | ||||
-rw-r--r-- | runtime/parser.h | 1 | ||||
-rw-r--r-- | runtime/ruleset.c | 32 |
4 files changed, 35 insertions, 8 deletions
@@ -1,6 +1,8 @@ --------------------------------------------------------------------------- Version 7.1.8 [devel] 2012-10-?? - improved module doc +- added "parser" parameter to ruleset(), so that parser chain can be + configured - implemented "continue" RainerScript statement - bugfix: ruleset(){} directive errornously changed default ruleset much like the $ruleset legacy conf statement. This potentially lead diff --git a/runtime/parser.c b/runtime/parser.c index 645ea0f4..b40edf4c 100644 --- a/runtime/parser.c +++ b/runtime/parser.c @@ -143,6 +143,14 @@ finalize_it: RETiRet; } +void +printParserList(parserList_t *pList) +{ + while(pList != NULL) { + dbgprintf("parser: %s\n", pList->pParser->pName); + pList = pList->pNext; + } +} /* find a parser based on the provided name */ static rsRetVal diff --git a/runtime/parser.h b/runtime/parser.h index f214ba0c..87a6269e 100644 --- a/runtime/parser.h +++ b/runtime/parser.h @@ -62,6 +62,7 @@ BEGINinterface(parser) /* name must also be changed in ENDinterface macro! */ ENDinterface(parser) #define parserCURR_IF_VERSION 1 /* increment whenever you change the interface above! */ +void printParserList(parserList_t *pList); /* prototypes */ PROTOTYPEObj(parser); diff --git a/runtime/ruleset.c b/runtime/ruleset.c index 8a93b022..bdeb61b7 100644 --- a/runtime/ruleset.c +++ b/runtime/ruleset.c @@ -57,7 +57,8 @@ DEFobjCurrIf(parser) /* tables for interfacing with the v6 config system (as far as we need to) */ static struct cnfparamdescr rspdescr[] = { - { "name", eCmdHdlrString, CNFPARAM_REQUIRED } + { "name", eCmdHdlrString, CNFPARAM_REQUIRED }, + { "parser", eCmdHdlrArray, 0 } }; static struct cnfparamblk rspblk = { CNFPARAMBLK_VERSION, @@ -758,6 +759,8 @@ BEGINobjDebugPrint(ruleset) /* be sure to specify the object type also in END an CODESTARTobjDebugPrint(ruleset) dbgoprint((obj_t*) pThis, "rsyslog ruleset %s:\n", pThis->pszName); cnfstmtPrint(pThis->root, 0); + dbgoprint((obj_t*) pThis, "ruleset %s assigned parser list:\n", pThis->pszName); + printParserList(pThis->pParserLst); ENDobjDebugPrint(ruleset) @@ -865,13 +868,11 @@ rulesetCreateQueue(void __attribute__((unused)) *pVal, int *pNewVal) * rgerhards, 2009-11-04 */ static rsRetVal -doRulesetAddParser(rsconf_t *conf, uchar *pName) +doRulesetAddParser(ruleset_t *pRuleset, uchar *pName) { parser_t *pParser; DEFiRet; - assert(conf->rulesets.pCurr != NULL); - CHKiRet(objUse(parser, CORE_COMPONENT)); iRet = parser.FindParser(&pParser, pName); if(iRet == RS_RET_PARSER_NOT_FOUND) { @@ -883,9 +884,9 @@ doRulesetAddParser(rsconf_t *conf, uchar *pName) FINALIZE; } - CHKiRet(parser.AddParserToList(&conf->rulesets.pCurr->pParserLst, pParser)); + CHKiRet(parser.AddParserToList(&pRuleset->pParserLst, pParser)); - DBGPRINTF("added parser '%s' to ruleset '%s'\n", pName, conf->rulesets.pCurr->pszName); + DBGPRINTF("added parser '%s' to ruleset '%s'\n", pName, pRuleset->pszName); finalize_it: d_free(pName); /* no longer needed */ @@ -896,7 +897,7 @@ finalize_it: static rsRetVal rulesetAddParser(void __attribute__((unused)) *pVal, uchar *pName) { - return doRulesetAddParser(ourConf, pName); + return doRulesetAddParser(ourConf->rulesets.pCurr, pName); } @@ -907,8 +908,11 @@ rulesetProcessCnf(struct cnfobj *o) struct cnfparamvals *pvals; rsRetVal localRet; uchar *rsName = NULL; - int nameIdx; + uchar *parserName; + int nameIdx, parserIdx; ruleset_t *pRuleset; + struct cnfarray *ar; + int i; DEFiRet; pvals = nvlstGetParams(o->nvlst, &rspblk, NULL); @@ -934,6 +938,18 @@ rulesetProcessCnf(struct cnfobj *o) CHKiRet(rulesetConstructFinalize(loadConf, pRuleset)); addScript(pRuleset, o->script); + /* we have only two params, so we do NOT do the usual param loop */ + parserIdx = cnfparamGetIdx(&rspblk, "parser"); + if(parserIdx == -1 || !pvals[parserIdx].bUsed) + FINALIZE; + + ar = pvals[parserIdx].val.d.ar; + for(i = 0 ; i < ar->nmemb ; ++i) { + parserName = (uchar*)es_str2cstr(ar->arr[i], NULL); + doRulesetAddParser(pRuleset, parserName); + free(parserName); + } + finalize_it: free(rsName); cnfparamvalsDestruct(pvals, &rspblk); |