summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2012-09-04 12:00:01 +0200
committerRainer Gerhards <rgerhards@adiscon.com>2012-09-04 12:00:01 +0200
commit68b9fe72b89ff47efdbed8fea4185bac84279a51 (patch)
treec3335f0e23037b240d4dabbf3b424f54e2253aef
parentaa8c79794e00c42ef3b89753f38cef511abb90b3 (diff)
downloadrsyslog-68b9fe72b89ff47efdbed8fea4185bac84279a51.tar.gz
rsyslog-68b9fe72b89ff47efdbed8fea4185bac84279a51.tar.bz2
rsyslog-68b9fe72b89ff47efdbed8fea4185bac84279a51.zip
new ruleengine: script block correctly built
-rw-r--r--grammar/grammar.y22
-rw-r--r--grammar/lexer.l2
-rw-r--r--grammar/rainerscript.c102
-rw-r--r--grammar/rainerscript.h4
4 files changed, 83 insertions, 47 deletions
diff --git a/grammar/grammar.y b/grammar/grammar.y
index 6a5256d5..6e1fd913 100644
--- a/grammar/grammar.y
+++ b/grammar/grammar.y
@@ -145,8 +145,8 @@ nvlst: { $$ = NULL; }
| nvlst nv { $2->next = $1; $$ = $2; }
nv: NAME '=' VALUE { $$ = nvlstNew($1, $3); }
script: stmt { $$ = $1; dbgprintf("RRRR: root stmt\n"); }
- | script stmt { $2->next = $1; $$ = $2; dbgprintf("RRRR: stmt in list\n"); }
-stmt: actlst { $$ = $1; dbgprintf("RRRR: have stmt:actlst\n"); }
+ | script stmt { $$ = scriptAddStmt($1, $2); dbgprintf("RRRR: stmt in list:\n");cnfstmtPrint($2, 0);dbgprintf("\n"); }
+stmt: actlst { $$ = $1; dbgprintf("RRRR: have stmt:actlst %p\n", $1); }
| STOP { $$ = cnfstmtNew(S_STOP);
dbgprintf("RRRR: have STOP\n"); }
| IF expr THEN block { $$ = cnfstmtNew(S_IF);
@@ -160,20 +160,24 @@ stmt: actlst { $$ = $1; dbgprintf("RRRR: have stmt:actlst\n"); }
$$->d.cond.t_else = $6;
dbgprintf("RRRR: have s_if \n"); }
| PRIFILT block { $$ = cnfstmtNew(S_PRIFILT);
- $$->d.cond.printable = $1;
+ $$->printable = $1;
$$->d.cond.expr = $1;
$$->d.cond.t_then = $2;
- dbgprintf("RRRR: have s_prifilt\n"); }
+ dbgprintf("RRRR: have s_prifilt %p\n", $2);cnfstmtPrint($2, 0);dbgprintf("\n"); }
| PROPFILT block { $$ = cnfstmtNew(S_PROPFILT);
$$->d.cond.expr = $1;
$$->d.cond.t_then = $2;
dbgprintf("RRRR: have s_propfilt\n"); }
-block: stmt { $$ = $1; dbgprintf("RRRR: have block:stmt\n"); }
+block: stmt { $$ = $1; dbgprintf("RRRR: have block:stmt %p\n", $1); }
| '{' script '}' { $$ = $2; dbgprintf("RRRR: have block:script\n"); }
-actlst: s_act { $$ = $1; dbgprintf("RRRR: have s_act\n"); }
- | actlst '&' s_act { $3->next = $1; $$ = $3; dbgprintf("RRRR: have actlst actlst:s_act\n"); }
-s_act: BEGIN_ACTION nvlst ENDOBJ { $$ = cnfstmtNew(S_ACT); dbgprintf("RRRR: action object\n"); }
- | LEGACY_ACTION { $$ = cnfstmtNew(S_ACT); dbgprintf("RRRR: legacy action\n"); }
+actlst: s_act { $$ = $1; dbgprintf("RRRR: have s_act, %p\n", $1); }
+ | actlst '&' s_act { $$ = scriptAddStmt($1, $3); dbgprintf("RRRR: have actlst actlst:s_act\n"); }
+s_act: BEGIN_ACTION nvlst ENDOBJ { $$ = cnfstmtNew(S_ACT);
+ $$->printable="action()";
+ dbgprintf("RRRR: action object\n"); }
+ | LEGACY_ACTION { $$ = cnfstmtNew(S_ACT);
+ $$->printable = $1;
+ dbgprintf("RRRR: legacy action\n"); }
/*
rule: PRIFILT actlst { $$ = cnfruleNew(CNFFILT_PRI, $2); $$->filt.s = $1; }
| PROPFILT actlst { $$ = cnfruleNew(CNFFILT_PROP, $2); $$->filt.s = $1; }
diff --git a/grammar/lexer.l b/grammar/lexer.l
index d603c449..a56df4f8 100644
--- a/grammar/lexer.l
+++ b/grammar/lexer.l
@@ -165,7 +165,7 @@ int fileno(FILE *stream);
"action"[ \n\t]*"(" { dbgprintf("RRRR: lexer: %s\n", yytext); BEGIN INOBJ; return BEGIN_ACTION; }
^[ \t]*:\$?[a-z\-]+[ ]*,[ ]*!?[a-z]+[ ]*,[ ]*\".*\" {
yylval.s = strdup(yytext); return PROPFILT; }
-^[ \t]*[\*a-z][,\*a-z]*[0-7]*\.[,!=;\.\*a-z0-7]+ { yylval.s = strdup(yytext); return PRIFILT; }
+^[ \t]*[\*a-z][,\*a-z]*[0-7]*\.[,!=;\.\*a-z0-7]+ { yylval.s = strdup(rmLeadingSpace(yytext)); return PRIFILT; }
"~" |
"*" |
\-\/[^*][^\n]* |
diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c
index 2d5bbd9b..b127b906 100644
--- a/grammar/rainerscript.c
+++ b/grammar/rainerscript.c
@@ -130,6 +130,25 @@ objlstAdd(struct objlst *root, struct cnfobj *o)
return root;
}
+/* add stmt to current script, always return root stmt pointer */
+struct cnfstmt*
+scriptAddStmt(struct cnfstmt *root, struct cnfstmt *s)
+{
+ struct cnfstmt *l;
+dbgprintf("RRRR: scriptAddStmt(%p, %p): ", root, s);
+
+ if(root == NULL) {
+ root = s;
+dbgprintf("root set to %p\n", s);
+ } else { /* find last, linear search ok, as only during config phase */
+ for(l = root ; l->next != NULL ; l = l->next)
+ ;
+ l->next = s;
+dbgprintf("%p->next = %p\n", l, s);
+ }
+ return root;
+}
+
void
objlstDestruct(struct objlst *lst)
{
@@ -1498,45 +1517,47 @@ cnfexprPrint(struct cnfexpr *expr, int indent)
}
}
void
-cnfstmtPrint(struct cnfstmt *stmt, int indent)
+cnfstmtPrint(struct cnfstmt *root, int indent)
{
+ struct cnfstmt *stmt;
//dbgprintf("stmt %p, indent %d, type '%c'\n", expr, indent, expr->nodetype);
- switch(stmt->nodetype) {
- case S_STOP:
- doIndent(indent); dbgprintf("STOP\n");
- break;
- case S_ACT:
- doIndent(indent); dbgprintf("ACTION %p\n", stmt->d.act);
- break;
- case S_IF:
- doIndent(indent); dbgprintf("IF\n");
- cnfexprPrint(stmt->d.cond.expr, indent+1);
- doIndent(indent); dbgprintf("THEN\n");
- cnfstmtPrint(stmt->d.cond.t_then, indent+1);
- if(stmt->d.cond.t_else != NULL) {
- doIndent(indent); dbgprintf("ELSE\n");
- cnfstmtPrint(stmt->d.cond.t_else, indent+1);
+ for(stmt = root ; stmt != NULL ; stmt = stmt->next) {
+ switch(stmt->nodetype) {
+ case S_STOP:
+ doIndent(indent); dbgprintf("STOP\n");
+ break;
+ case S_ACT:
+ doIndent(indent); dbgprintf("ACTION %p (%s)\n", stmt->d.act, stmt->printable);
+ break;
+ case S_IF:
+ doIndent(indent); dbgprintf("IF\n");
+ cnfexprPrint(stmt->d.cond.expr, indent+1);
+ doIndent(indent); dbgprintf("THEN\n");
+ cnfstmtPrint(stmt->d.cond.t_then, indent+1);
+ if(stmt->d.cond.t_else != NULL) {
+ doIndent(indent); dbgprintf("ELSE\n");
+ cnfstmtPrint(stmt->d.cond.t_else, indent+1);
+ }
+ doIndent(indent); dbgprintf("END IF\n");
+ break;
+ case S_PRIFILT:
+ doIndent(indent); dbgprintf("PRIFILT '%s'\n", stmt->printable);
+ //cnfexprPrint(stmt->d.cond.expr, indent+1);
+ cnfstmtPrint(stmt->d.cond.t_then, indent+1);
+ doIndent(indent); dbgprintf("END PRIFILT\n");
+ break;
+ case S_PROPFILT:
+ doIndent(indent); dbgprintf("PROPFILT\n");
+ cnfexprPrint(stmt->d.cond.expr, indent+1);
+ doIndent(indent); dbgprintf("THEN\n");
+ cnfstmtPrint(stmt->d.cond.t_then, indent+1);
+ doIndent(indent); dbgprintf("END PROPFILT\n");
+ break;
+ default:
+ dbgprintf("error: unknown stmt type %u\n",
+ (unsigned) stmt->nodetype);
+ break;
}
- doIndent(indent); dbgprintf("END IF\n");
- break;
- case S_PRIFILT:
- doIndent(indent); dbgprintf("PRIFILT '%s'\n", stmt->d.cond.printable);
- //cnfexprPrint(stmt->d.cond.expr, indent+1);
- doIndent(indent); dbgprintf("THEN\n");
- cnfstmtPrint(stmt->d.cond.t_then, indent+1);
- doIndent(indent); dbgprintf("END PRIFILT\n");
- break;
- case S_PROPFILT:
- doIndent(indent); dbgprintf("PROPFILT\n");
- cnfexprPrint(stmt->d.cond.expr, indent+1);
- doIndent(indent); dbgprintf("THEN\n");
- cnfstmtPrint(stmt->d.cond.t_then, indent+1);
- doIndent(indent); dbgprintf("END PROPFILT\n");
- break;
- default:
- dbgprintf("error: unknown stmt type %u\n",
- (unsigned) stmt->nodetype);
- break;
}
}
@@ -1873,6 +1894,15 @@ cstrPrint(char *text, es_str_t *estr)
free(str);
}
+char *
+rmLeadingSpace(char *s)
+{
+ char *p;
+ for(p = s ; *p && isspace(*p) ; ++p)
+ ;
+ return(p);
+}
+
/* init must be called once before any parsing of the script files start */
rsRetVal
initRainerscript(void)
diff --git a/grammar/rainerscript.h b/grammar/rainerscript.h
index 1fe7f1b9..2d4d9271 100644
--- a/grammar/rainerscript.h
+++ b/grammar/rainerscript.h
@@ -157,10 +157,10 @@ struct cnfrule {
struct cnfstmt { /* base statement, for simple types */
unsigned nodetype;
struct cnfstmt *next;
+ uchar *printable; /* printable text for debugging */
union {
struct {
struct cnfexpr *expr;
- uchar *printable; /* printable expr for debugging */
struct cnfstmt *t_then;
struct cnfstmt *t_else;
} cond;
@@ -296,6 +296,8 @@ void cnfparamvalsDestruct(struct cnfparamvals *paramvals, struct cnfparamblk *bl
void cnfcfsyslinelstDestruct(struct cnfcfsyslinelst *cfslst);
struct cnfstmt * cnfstmtNew(unsigned s_type);
void cnfstmtPrint(struct cnfstmt *stmt, int indent);
+struct cnfstmt* scriptAddStmt(struct cnfstmt *root, struct cnfstmt *s);
+char *rmLeadingSpace(char *s);
rsRetVal initRainerscript(void);
/* debug helper */