diff options
author | Gilles Chehade <gilles@poolp.org> | 2013-09-24 10:49:01 +0200 |
---|---|---|
committer | Gilles Chehade <gilles@poolp.org> | 2013-09-24 10:49:01 +0200 |
commit | ba3f48969521f2c2362f1dc3b4963ee5170599ce (patch) | |
tree | 7612352fb379bf02a8eac515bd01ef34c0b7b828 | |
parent | improve rule params matching (diff) | |
download | OpenSMTPD-ba3f48969521f2c2362f1dc3b4963ee5170599ce.tar.xz OpenSMTPD-ba3f48969521f2c2362f1dc3b4963ee5170599ce.zip |
further cleanup
-rw-r--r-- | smtpd/parse.y | 44 |
1 files changed, 21 insertions, 23 deletions
diff --git a/smtpd/parse.y b/smtpd/parse.y index 83092360..3f60f30f 100644 --- a/smtpd/parse.y +++ b/smtpd/parse.y @@ -763,56 +763,52 @@ userbase : USERBASE tables { $$ = t; } - | /**/ { $$ = table_find("<getpwnam>", NULL); } ; -action : userbase DELIVER TO MAILDIR { - rule->r_userbase = $1; +deliver_action : DELIVER TO MAILDIR { rule->r_action = A_MAILDIR; if (strlcpy(rule->r_value.buffer, "~/Maildir", sizeof(rule->r_value.buffer)) >= sizeof(rule->r_value.buffer)) fatal("pathname too long"); } - | userbase DELIVER TO MAILDIR STRING { - rule->r_userbase = $1; + | DELIVER TO MAILDIR STRING { rule->r_action = A_MAILDIR; - if (strlcpy(rule->r_value.buffer, $5, + if (strlcpy(rule->r_value.buffer, $4, sizeof(rule->r_value.buffer)) >= sizeof(rule->r_value.buffer)) fatal("pathname too long"); - free($5); + free($4); } - | userbase DELIVER TO LMTP STRING { - rule->r_userbase = $1; + | DELIVER TO LMTP STRING { rule->r_action = A_LMTP; - if (strchr($5, ':') || $5[0] == '/') { - if (strlcpy(rule->r_value.buffer, $5, + if (strchr($4, ':') || $4[0] == '/') { + if (strlcpy(rule->r_value.buffer, $4, sizeof(rule->r_value.buffer)) >= sizeof(rule->r_value.buffer)) fatal("lmtp destination too long"); } else fatal("invalid lmtp destination"); - free($5); + free($4); } - | userbase DELIVER TO MBOX { - rule->r_userbase = $1; + | DELIVER TO MBOX { rule->r_action = A_MBOX; if (strlcpy(rule->r_value.buffer, _PATH_MAILDIR "/%u", sizeof(rule->r_value.buffer)) >= sizeof(rule->r_value.buffer)) fatal("pathname too long"); } - | userbase DELIVER TO MDA STRING { - rule->r_userbase = $1; + | DELIVER TO MDA STRING { rule->r_action = A_MDA; - if (strlcpy(rule->r_value.buffer, $5, + if (strlcpy(rule->r_value.buffer, $4, sizeof(rule->r_value.buffer)) >= sizeof(rule->r_value.buffer)) fatal("command too long"); - free($5); + free($4); } - | RELAY relay { + ; + +relay_action : RELAY relay { rule->r_action = A_RELAY; } | RELAY VIA STRING { @@ -832,11 +828,10 @@ action : userbase DELIVER TO MAILDIR { } } } - | userbase { - rule->r_userbase = $1; - } ; +action : deliver_action | relay_action; + negation : '!' { $$ = 1; } | /* empty */ { $$ = 0; } ; @@ -901,6 +896,8 @@ opt_accept : sender | for | tagged | usermapping + | userbase + | action | FORWARDONLY { rule->r_forwardonly = 1; } @@ -937,8 +934,9 @@ rule : ACCEPT { rule->r_desttype = DEST_DOM; rule->r_sources = table_find("<localhost>", NULL); rule->r_destination = table_find("<localnames>", NULL); + rule->r_userbase = table_find("<getpwnam>", NULL); rule->r_qexpire = conf->sc_qexpire; - } accept_params action { + } accept_params { if (rule->r_mapping && rule->r_desttype == DEST_VDOM) { enum table_type type; |