diff options
author | Ondrej Zajicek <santiago@crfreenet.org> | 2023-08-24 16:59:23 +0200 |
---|---|---|
committer | Ondrej Zajicek <santiago@crfreenet.org> | 2023-08-24 16:59:23 +0200 |
commit | f411a19bb0467cfc421f8aa6f5ead49972bab058 (patch) | |
tree | 4852ae63fc2657934eadb877c467ab1b26fb2593 | |
parent | 0dbcc927260c6da918fa1bd78c86800e41ab05a8 (diff) |
Conf: Use nonterminal bytestring instead of BYTETEXT
Nonterminal bytestring allows to provide expressions to be evaluated in
places where BYTETEXT is used now: passwords, radv custom option.
Based on the patch from Alexander Zubkov <green@qrator.net>, thanks!
-rw-r--r-- | conf/confbase.Y | 25 | ||||
-rw-r--r-- | nest/config.Y | 13 | ||||
-rw-r--r-- | proto/radv/config.Y | 4 |
3 files changed, 36 insertions, 6 deletions
diff --git a/conf/confbase.Y b/conf/confbase.Y index e109ddf5..f8d24415 100644 --- a/conf/confbase.Y +++ b/conf/confbase.Y @@ -117,9 +117,13 @@ CF_DECLS %type <mls> label_stack_start label_stack %type <t> text opttext +%type <bs> bytestring %type <s> symbol %type <kw> kw_sym +%type <v> bytestring_text +%type <x> bytestring_expr + %nonassoc PREFIX_DUMMY %left AND OR %nonassoc '=' '<' '>' '~' GEQ LEQ NEQ NMA PO PC @@ -395,6 +399,27 @@ opttext: | /* empty */ { $$ = NULL; } ; +bytestring: + BYTETEXT + | bytestring_expr { $$ = cf_eval($1, T_BYTESTRING).val.bs; } + ; + +bytestring_text: + BYTETEXT { $$.type = T_BYTESTRING; $$.val.bs = $1; } + | TEXT { $$.type = T_STRING; $$.val.s = $1; } + | bytestring_expr { + $$ = cf_eval($1, T_VOID); + if (($$.type != T_BYTESTRING) && ($$.type != T_STRING)) + cf_error("Bytestring or string value expected"); + } + ; + +bytestring_expr: + symbol_value + | term_bs + | '(' term ')' { $$ = $2; } + ; + CF_CODE diff --git a/nest/config.Y b/nest/config.Y index 610b1c01..1c40ced6 100644 --- a/nest/config.Y +++ b/nest/config.Y @@ -546,10 +546,15 @@ password_item: pass_key: PASSWORD | KEY; -password_item_begin: - pass_key text { init_password_list(); init_password($2, strlen($2), password_id++); } - | pass_key BYTETEXT { init_password_list(); init_password($2->data, $2->length, password_id++); } -; +password_item_begin: pass_key bytestring_text +{ + init_password_list(); + if ($2.type == T_BYTESTRING) + init_password($2.val.bs->data, $2.val.bs->length, password_id++); + else if ($2.type == T_STRING) + init_password($2.val.s, strlen($2.val.s), password_id++); + else bug("Bad bytestring_text"); +}; password_item_params: /* empty */ { } diff --git a/proto/radv/config.Y b/proto/radv/config.Y index 9653cd7b..9c5e1761 100644 --- a/proto/radv/config.Y +++ b/proto/radv/config.Y @@ -73,7 +73,7 @@ radv_proto_item: | PREFIX radv_prefix { add_tail(&RADV_CFG->pref_list, NODE this_radv_prefix); } | RDNSS { init_list(&radv_dns_list); } radv_rdnss { add_tail_list(&RADV_CFG->rdnss_list, &radv_dns_list); } | DNSSL { init_list(&radv_dns_list); } radv_dnssl { add_tail_list(&RADV_CFG->dnssl_list, &radv_dns_list); } - | CUSTOM OPTION TYPE expr VALUE BYTETEXT { radv_add_to_custom_list(&RADV_CFG->custom_list, $4, $6); } + | CUSTOM OPTION TYPE expr VALUE bytestring { radv_add_to_custom_list(&RADV_CFG->custom_list, $4, $6); } | TRIGGER net_ip6 { RADV_CFG->trigger = $2; } | PROPAGATE ROUTES bool { RADV_CFG->propagate_routes = $3; } ; @@ -138,7 +138,7 @@ radv_iface_item: | PREFIX radv_prefix { add_tail(&RADV_IFACE->pref_list, NODE this_radv_prefix); } | RDNSS { init_list(&radv_dns_list); } radv_rdnss { add_tail_list(&RADV_IFACE->rdnss_list, &radv_dns_list); } | DNSSL { init_list(&radv_dns_list); } radv_dnssl { add_tail_list(&RADV_IFACE->dnssl_list, &radv_dns_list); } - | CUSTOM OPTION TYPE expr VALUE BYTETEXT { radv_add_to_custom_list(&RADV_IFACE->custom_list, $4, $6); } + | CUSTOM OPTION TYPE expr VALUE bytestring { radv_add_to_custom_list(&RADV_IFACE->custom_list, $4, $6); } | RDNSS LOCAL bool { RADV_IFACE->rdnss_local = $3; } | DNSSL LOCAL bool { RADV_IFACE->dnssl_local = $3; } | CUSTOM OPTION LOCAL bool { RADV_IFACE->custom_local = $4; } |