summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2023-08-24 16:59:23 +0200
committerOndrej Zajicek <santiago@crfreenet.org>2023-08-24 16:59:23 +0200
commitf411a19bb0467cfc421f8aa6f5ead49972bab058 (patch)
tree4852ae63fc2657934eadb877c467ab1b26fb2593
parent0dbcc927260c6da918fa1bd78c86800e41ab05a8 (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.Y25
-rw-r--r--nest/config.Y13
-rw-r--r--proto/radv/config.Y4
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; }