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