On Mon, Feb 26, 2018 at 05:10:43PM -0600, Michael Graves wrote:
> Hello
>
> I use ifstated(8) to track the state of the the external interface that is
> configured via dhcp and based upon the state, (re)configure a VXLAN
> interface.
> The ifstated.conf currently looks like
>
> ===
> exif="em0"
> vxif="vxlan0"
>
> init-state state_down
>
> state state_up {
> init {
> run "ifconfig vlxna0 up"
> }
> if ( "ifconfig em0 | grep -q inet" every 60 )
> run "sleep 30 && ifconfig vxlan0 tunnel `ifconfig em0 | \
> sed -nre 's/.*inet ([^ ]+).*/\1/p'` \
> `dig +short name-of-remote-device`"
> if $exif.link.down
> set-state state_down
> }
>
> state state_down {
> init {
> run "ifconfig vxlan0 down"
> }
> if $exif.link.up
> set-state state_up
> }
> ===
>
> The problem I ran into is that when I tried to substitute the vxlan0 and em0
> entries with exif and vxif in the 'run' statements no macro expansion
> occurred.
> This patch allows macro expansion within the 'run' and 'if' statements.
>
> I appreciate any feedback.
> Regards
> Index: parse.y
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ifstated/parse.y,v
> retrieving revision 1.47
> diff -u -p -r1.47 parse.y
> --- parse.y 21 Aug 2017 17:38:55 -0000 1.47
> +++ parse.y 26 Feb 2018 22:47:11 -0000
> @@ -509,9 +509,10 @@ int
> yylex(void)
> {
> u_char buf[8096];
> - u_char *p, *val;
> + u_char *p, *p1, *val;
> int quotec, next, c;
> int token;
> + size_t x;
>
> top:
> p = buf;
> @@ -575,6 +576,35 @@ top:
> } else if (c == '\0') {
> yyerror("syntax error");
> return (findeol());
> + } else if (c == '$') {
> + p1 = p;
> + while (1) {
> + if ((c = lgetc(0)) == EOF)
> + return (0);
> + if (p1 + 1 >= buf + sizeof(buf) - 1) {
> + yyerror("string too long");
> + return (findeol());
> + }
> + if (isalnum(c) || c == '_') {
> + *p1++ = c;
> + continue;
> + }
> + *p1 = '\0';
> + lungetc(c);
> + break;
> + }
> + val = symget(p);
> + if (val == NULL) {
> + yyerror("macro '%s' not defined", buf);
> + return (findeol());
> + }
> + x = strlcpy(p,val,(buf-p));
> + if (x >= (buf-p)) {
> + yyerror("string too long");
> + return (findeol());
> + }
> + p += x;
> + continue;
> }
> if (p + 1 >= buf + sizeof(buf) - 1) {
> yyerror("string too long");
Hey Michael,
Thank you for your email. I have been playing with your diff and will send you
some comments shortly. This might be worth future consideration.
For now, I think we should update the man page to clearly state that macro
expansion does not take place inside quotes as is currently done in the other
man pages.
Ok?
Index: ifstated.conf.5
===================================================================
RCS file: /cvs/src/usr.sbin/ifstated/ifstated.conf.5,v
retrieving revision 1.11
diff -u -p -r1.11 ifstated.conf.5
--- ifstated.conf.5 3 Mar 2018 02:57:17 -0000 1.11
+++ ifstated.conf.5 5 Mar 2018 18:39:06 -0000
@@ -55,6 +55,8 @@ instead of using the first state defined
Macros can be defined that will later be expanded in context.
Macro names must start with a letter, digit, or underscore,
and may contain any of those characters.
+Macros are not expanded inside quotes.
+.Pp
Macro names may not be reserved words like, for example,
.Ar state
or