summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/parser.y211
-rw-r--r--src/scanner.l2
2 files changed, 165 insertions, 48 deletions
diff --git a/src/parser.y b/src/parser.y
index 9c20737b..20a836e7 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -92,6 +92,21 @@ static void location_update(struct location *loc, struct location *rhs, int n)
#define YYLLOC_DEFAULT(Current, Rhs, N) location_update(&Current, Rhs, N)
+enum {
+ NFT_EVENT_NEW = 0,
+ NFT_EVENT_DEL,
+};
+
+static int monitor_lookup_event(const char *event)
+{
+ if (strcmp(event, "new") == 0)
+ return NFT_EVENT_NEW;
+ else if (strcmp(event, "destroy") == 0)
+ return NFT_EVENT_DEL;
+
+ return -1;
+}
+
%}
/* Declaration section */
@@ -171,8 +186,6 @@ static void location_update(struct location *loc, struct location *rhs, int n)
%token ELEMENT "element"
%token MAP "map"
%token HANDLE "handle"
-%token NEW "new"
-%token DESTROY "destroy"
%token INET "inet"
@@ -777,64 +790,170 @@ monitor_cmd : monitor_flags output_format
monitor_flags : /* empty */
{
- $$ |= (1 << NFT_MSG_NEWRULE);
- $$ |= (1 << NFT_MSG_DELRULE);
- $$ |= (1 << NFT_MSG_NEWSET);
- $$ |= (1 << NFT_MSG_DELSET);
- $$ |= (1 << NFT_MSG_NEWSETELEM);
- $$ |= (1 << NFT_MSG_DELSETELEM);
- $$ |= (1 << NFT_MSG_NEWCHAIN);
- $$ |= (1 << NFT_MSG_DELCHAIN);
- $$ |= (1 << NFT_MSG_NEWTABLE);
- $$ |= (1 << NFT_MSG_DELTABLE);
- }
- | NEW
- {
- $$ |= (1 << NFT_MSG_NEWRULE);
- $$ |= (1 << NFT_MSG_NEWSET);
- $$ |= (1 << NFT_MSG_NEWSETELEM);
- $$ |= (1 << NFT_MSG_NEWCHAIN);
- $$ |= (1 << NFT_MSG_NEWTABLE);
- }
- | DESTROY
- {
- $$ |= (1 << NFT_MSG_DELRULE);
- $$ |= (1 << NFT_MSG_DELSET);
- $$ |= (1 << NFT_MSG_DELSETELEM);
- $$ |= (1 << NFT_MSG_DELCHAIN);
- $$ |= (1 << NFT_MSG_DELTABLE);
+ $$ = (1 << NFT_MSG_NEWRULE) |
+ (1 << NFT_MSG_DELRULE) |
+ (1 << NFT_MSG_NEWSET) |
+ (1 << NFT_MSG_DELSET) |
+ (1 << NFT_MSG_NEWSETELEM) |
+ (1 << NFT_MSG_DELSETELEM) |
+ (1 << NFT_MSG_NEWCHAIN) |
+ (1 << NFT_MSG_DELCHAIN) |
+ (1 << NFT_MSG_NEWTABLE) |
+ (1 << NFT_MSG_DELTABLE);
+ }
+ | STRING
+ {
+ int event;
+
+ event = monitor_lookup_event($1);
+ if (event < 0) {
+ erec_queue(error(&@1, "unknown event type %s", $1),
+ state->msgs);
+ YYERROR;
+ }
+
+ switch (event) {
+ case NFT_EVENT_NEW:
+ $$ = (1 << NFT_MSG_NEWTABLE) |
+ (1 << NFT_MSG_NEWCHAIN) |
+ (1 << NFT_MSG_NEWRULE) |
+ (1 << NFT_MSG_NEWSET) |
+ (1 << NFT_MSG_NEWSETELEM);
+ break;
+ case NFT_EVENT_DEL:
+ $$ = (1 << NFT_MSG_DELTABLE) |
+ (1 << NFT_MSG_DELCHAIN) |
+ (1 << NFT_MSG_DELRULE) |
+ (1 << NFT_MSG_DELSET) |
+ (1 << NFT_MSG_DELSETELEM);
+ break;
+ }
}
| TABLES
{
- $$ |= (1 << NFT_MSG_NEWTABLE); $$ |= (1 << NFT_MSG_DELTABLE);
+ $$ = (1 << NFT_MSG_NEWTABLE) |
+ (1 << NFT_MSG_DELTABLE);
}
- | NEW TABLES { $$ |= (1 << NFT_MSG_NEWTABLE); }
- | DESTROY TABLES { $$ |= (1 << NFT_MSG_DELTABLE); }
- | CHAIN
+ | STRING TABLES
{
- $$ |= (1 << NFT_MSG_NEWCHAIN); $$ |= (1 << NFT_MSG_DELCHAIN);
+ int event;
+
+ event = monitor_lookup_event($1);
+ if (event < 0) {
+ erec_queue(error(&@1, "unknown event type %s", $1),
+ state->msgs);
+ YYERROR;
+ }
+
+ switch (event) {
+ case NFT_EVENT_NEW:
+ $$ = (1 << NFT_MSG_NEWTABLE);
+ break;
+ case NFT_EVENT_DEL:
+ $$ = (1 << NFT_MSG_DELTABLE);
+ break;
+ }
+ }
+ | CHAINS
+ {
+ $$ = (1 << NFT_MSG_NEWCHAIN) |
+ (1 << NFT_MSG_DELCHAIN);
+ }
+ | STRING CHAINS
+ {
+ int event;
+
+ event = monitor_lookup_event($1);
+ if (event < 0) {
+ erec_queue(error(&@1, "unknown event type %s", $1),
+ state->msgs);
+ YYERROR;
+ }
+
+ switch (event) {
+ case NFT_EVENT_NEW:
+ $$ = (1 << NFT_MSG_NEWCHAIN);
+ break;
+ case NFT_EVENT_DEL:
+ $$ = (1 << NFT_MSG_DELCHAIN);
+ break;
+ }
}
- | NEW CHAINS { $$ |= (1 << NFT_MSG_NEWCHAIN); }
- | DESTROY CHAINS { $$ |= (1 << NFT_MSG_DELCHAIN); }
| SETS
{
- $$ |= (1 << NFT_MSG_NEWSET); $$ |= (1 << NFT_MSG_DELSET);
+ $$ = (1 << NFT_MSG_NEWSET) |
+ (1 << NFT_MSG_DELSET);
}
- | NEW SETS { $$ |= (1 << NFT_MSG_NEWSET); }
- | DESTROY SETS { $$ |= (1 << NFT_MSG_DELSET); }
- | RULE
+ | STRING SETS
{
- $$ |= (1 << NFT_MSG_NEWRULE); $$ |= (1 << NFT_MSG_DELRULE);
+ int event;
+
+ event = monitor_lookup_event($1);
+ if (event < 0) {
+ erec_queue(error(&@1, "unknown event type %s", $1),
+ state->msgs);
+ YYERROR;
+ }
+
+ switch (event) {
+ case NFT_EVENT_NEW:
+ $$ = (1 << NFT_MSG_NEWSET);
+ break;
+ case NFT_EVENT_DEL:
+ $$ = (1 << NFT_MSG_DELSET);
+ break;
+ }
+ }
+ | RULES
+ {
+ $$ = (1 << NFT_MSG_NEWRULE) |
+ (1 << NFT_MSG_DELRULE);
+ }
+ | STRING RULES
+ {
+ int event;
+
+ event = monitor_lookup_event($1);
+ if (event < 0) {
+ erec_queue(error(&@1, "unknown event type %s", $1),
+ state->msgs);
+ YYERROR;
+ }
+
+ switch (event) {
+ case NFT_EVENT_NEW:
+ $$ = (1 << NFT_MSG_NEWRULE);
+ break;
+ case NFT_EVENT_DEL:
+ $$ = (1 << NFT_MSG_DELRULE);
+ break;
+ }
}
- | NEW RULES { $$ |= (1 << NFT_MSG_NEWRULE); }
- | DESTROY RULES { $$ |= (1 << NFT_MSG_DELRULE); }
| ELEMENTS
{
- $$ |= (1 << NFT_MSG_NEWSETELEM);
- $$ |= (1 << NFT_MSG_DELSETELEM);
+ $$ = (1 << NFT_MSG_NEWSETELEM) |
+ (1 << NFT_MSG_DELSETELEM);
+ }
+ | STRING ELEMENTS
+ {
+ int event;
+
+ event = monitor_lookup_event($1);
+ if (event < 0) {
+ erec_queue(error(&@1, "unknown event type %s", $1),
+ state->msgs);
+ YYERROR;
+ }
+
+ switch (event) {
+ case NFT_EVENT_NEW:
+ $$ = (1 << NFT_MSG_NEWSETELEM);
+ break;
+ case NFT_EVENT_DEL:
+ $$ = (1 << NFT_MSG_DELSETELEM);
+ break;
+ }
}
- | NEW ELEMENTS { $$ |= (1 << NFT_MSG_NEWSETELEM); }
- | DESTROY ELEMENTS { $$ |= (1 << NFT_MSG_DELSETELEM); }
;
output_format : /* empty */
diff --git a/src/scanner.l b/src/scanner.l
index 801c0303..86bc519d 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -240,8 +240,6 @@ addrstring ({macaddr}|{ip4addr}|{ip6addr})
"element" { return ELEMENT; }
"map" { return MAP; }
"handle" { return HANDLE; }
-"new" { return NEW; }
-"destroy" { return DESTROY; }
"accept" { return ACCEPT; }
"drop" { return DROP; }