summaryrefslogtreecommitdiffstats
path: root/grammar
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2013-10-13 11:59:53 +0200
committerRainer Gerhards <rgerhards@adiscon.com>2013-10-13 11:59:53 +0200
commit42bfcef69a068f52579b2ac2cc7dcca77c89dfc4 (patch)
treed2400724222da7f0ae39d10d8e6809e530cb4616 /grammar
parent2ff36f90b04e3374bf2fbbc8485658096ee7c490 (diff)
parent32467b3bcd7cfd755117b24675a9985135179207 (diff)
downloadrsyslog-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.l2
-rw-r--r--grammar/rainerscript.c49
-rw-r--r--grammar/rainerscript.h6
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 {