diff --git a/conf/confbase.Y b/conf/confbase.Y index 9725ef36..195efff1 100644 --- a/conf/confbase.Y +++ b/conf/confbase.Y @@ -120,8 +120,12 @@ CF_DECLS %type label_stack_start label_stack %type text opttext +%type bytestring %type symbol symbol_known toksym +%type bytestring_text +%type bytestring_expr + %nonassoc PREFIX_DUMMY %left AND OR %nonassoc '=' '<' '>' '~' GEQ LEQ NEQ NMA PO PC @@ -408,6 +412,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 dcf977fc..f19ea596 100644 --- a/nest/config.Y +++ b/nest/config.Y @@ -569,10 +569,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 6439c32b..a90b6db3 100644 --- a/proto/radv/config.Y +++ b/proto/radv/config.Y @@ -71,7 +71,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; } ; @@ -136,7 +136,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; }