diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2013-10-13 11:59:53 +0200 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2013-10-13 11:59:53 +0200 |
commit | 42bfcef69a068f52579b2ac2cc7dcca77c89dfc4 (patch) | |
tree | d2400724222da7f0ae39d10d8e6809e530cb4616 /grammar | |
parent | 2ff36f90b04e3374bf2fbbc8485658096ee7c490 (diff) | |
parent | 32467b3bcd7cfd755117b24675a9985135179207 (diff) | |
download | rsyslog-42bfcef69a068f52579b2ac2cc7dcca77c89dfc4.tar.gz rsyslog-42bfcef69a068f52579b2ac2cc7dcca77c89dfc4.tar.bz2 rsyslog-42bfcef69a068f52579b2ac2cc7dcca77c89dfc4.zip |
Merge branch 'master-lookup'
Conflicts:
grammar/rainerscript.h
runtime/rsyslog.h
Diffstat (limited to 'grammar')
-rw-r--r-- | grammar/lexer.l | 2 | ||||
-rw-r--r-- | grammar/rainerscript.c | 49 | ||||
-rw-r--r-- | grammar/rainerscript.h | 6 |
3 files changed, 56 insertions, 1 deletions
diff --git a/grammar/lexer.l b/grammar/lexer.l index 438ccdd8..d254d47e 100644 --- a/grammar/lexer.l +++ b/grammar/lexer.l @@ -192,6 +192,8 @@ int fileno(FILE *stream); BEGIN INOBJ; return BEGINOBJ; } "module"[ \n\t]*"(" { yylval.objType = CNFOBJ_MODULE; BEGIN INOBJ; return BEGINOBJ; } +"lookup_table"[ \n\t]*"(" { yylval.objType = CNFOBJ_LOOKUP_TABLE; + BEGIN INOBJ; return BEGINOBJ; } "action"[ \n\t]*"(" { BEGIN INOBJ; return BEGIN_ACTION; } ^[ \t]*:\$?[a-z\-]+[ ]*,[ ]*!?[a-z]+[ ]*,[ ]*\"(\\\"|[^\"])*\" { yylval.s = strdup(rmLeadingSpace(yytext)); diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c index f4833679..328ec7fc 100644 --- a/grammar/rainerscript.c +++ b/grammar/rainerscript.c @@ -1334,6 +1334,7 @@ doFuncCall(struct cnffunc *func, struct var *ret, void* usrptr) int bMustFree; es_str_t *estr; char *str; + char *s; uchar *resStr; int retval; struct var r[CNFFUNC_MAX_ARGS]; @@ -1471,6 +1472,19 @@ doFuncCall(struct cnffunc *func, struct var *ret, void* usrptr) ret->d.n = 1; ret->datatype = 'N'; break; + case CNFFUNC_LOOKUP: +dbgprintf("DDDD: executing lookup\n"); + ret->datatype = 'S'; + if(func->funcdata == NULL) { + ret->d.estr = es_newStrFromCStr("TABLE-NOT-FOUND", sizeof("TABLE-NOT-FOUND")-1); + break; + } + cnfexprEval(func->expr[1], &r[1], usrptr); + str = (char*) var2CString(&r[1], &bMustFree); + ret->d.estr = lookupKey_estr(func->funcdata, (uchar*)str); + if(bMustFree) free(str); + if(r[1].datatype == 'S') es_deleteStr(r[1].d.estr); + break; default: if(Debug) { fname = es_str2cstr(func->fname, NULL); @@ -3234,6 +3248,13 @@ funcName2ID(es_str_t *fname, unsigned short nParams) return CNFFUNC_INVALID; } return CNFFUNC_PRIFILT; + } else if(!es_strbufcmp(fname, (unsigned char*)"lookup", sizeof("lookup") - 1)) { + if(nParams != 2) { + parser_errmsg("number of parameters for lookup() must be two " + "but is %d.", nParams); + return CNFFUNC_INVALID; + } + return CNFFUNC_LOOKUP; } else { return CNFFUNC_INVALID; } @@ -3298,6 +3319,31 @@ finalize_it: } +static inline rsRetVal +initFunc_lookup(struct cnffunc *func) +{ + struct funcData_prifilt *pData; + uchar *cstr = NULL; + DEFiRet; + + func->funcdata = NULL; + if(func->expr[0]->nodetype != 'S') { + parser_errmsg("table name (param 1) of lookup() must be a constant string"); + FINALIZE; + } + + cstr = (uchar*)es_str2cstr(((struct cnfstringval*) func->expr[0])->estr, NULL); + if((func->funcdata = lookupFindTable(cstr)) == NULL) { + parser_errmsg("lookup table '%s' not found", cstr); + FINALIZE; + } + +finalize_it: + free(cstr); + RETiRet; +} + + struct cnffunc * cnffuncNew(es_str_t *fname, struct cnffparamlst* paramlst) { @@ -3335,6 +3381,9 @@ cnffuncNew(es_str_t *fname, struct cnffparamlst* paramlst) case CNFFUNC_PRIFILT: initFunc_prifilt(func); break; + case CNFFUNC_LOOKUP: + initFunc_lookup(func); + break; default:break; } } diff --git a/grammar/rainerscript.h b/grammar/rainerscript.h index 3e59fc60..4a508f93 100644 --- a/grammar/rainerscript.h +++ b/grammar/rainerscript.h @@ -25,6 +25,7 @@ enum cnfobjType { CNFOBJ_PROPERTY, CNFOBJ_CONSTANT, CNFOBJ_MAINQ, + CNFOBJ_LOOKUP_TABLE, CNFOBJ_INVALID = 0 }; @@ -58,6 +59,8 @@ cnfobjType2str(enum cnfobjType ot) break; case CNFOBJ_MAINQ: return "main_queue"; + case CNFOBJ_LOOKUP_TABLE: + return "lookup_table"; break; default:return "error: invalid cnfobjType"; } @@ -232,7 +235,8 @@ enum cnffuncid { CNFFUNC_RE_MATCH, CNFFUNC_RE_EXTRACT, CNFFUNC_FIELD, - CNFFUNC_PRIFILT + CNFFUNC_PRIFILT, + CNFFUNC_LOOKUP }; struct cnffunc { |