From f411a19bb0467cfc421f8aa6f5ead49972bab058 Mon Sep 17 00:00:00 2001 From: Ondrej Zajicek Date: Thu, 24 Aug 2023 16:59:23 +0200 Subject: [PATCH] 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 , thanks! --- conf/confbase.Y | 25 +++++++++++++++++++++++++ nest/config.Y | 13 +++++++++---- 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 label_stack_start label_stack %type text opttext +%type bytestring %type symbol %type kw_sym +%type bytestring_text +%type 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; }