ifchd: Make the command parser much more strict. It now has a concept of

argument types and command types.
This commit is contained in:
Nicholas J. Kain 2013-05-11 10:59:04 -04:00
parent 62d69e1909
commit 3ef87c1f26

View File

@ -72,38 +72,34 @@
} }
} }
interface = 'iface'; terminator = ';' > Dispatch;
ip = 'ip'; v4addr = digit{1,3} '.' digit{1,3} '.' digit{1,3} '.' digit{1,3};
subnet = 'snet'; ip_arg = (v4addr > ArgSt % ArgEn) terminator;
dns = 'dns'; iplist_arg = (((v4addr ',')* v4addr) > ArgSt % ArgEn) terminator;
lprsvr = 'lpr'; str_arg = ([^;\0]+ > ArgSt % ArgEn) terminator;
ntpsvr = 'ntp'; s32_arg = (extend{4} > ArgSt % ArgEn) terminator;
wins = 'wins'; u16_arg = (extend{2} > ArgSt % ArgEn) terminator;
router = 'routr'; u8_arg = (extend{1} > ArgSt % ArgEn) terminator;
broadcast = 'bcast';
timezone = 'tzone';
hostname = 'host';
domain = 'dom';
ipttl = 'ipttl';
mtu = 'mtu';
cmdname = (interface % { cl->state = STATE_INTERFACE; } cmd_ip = ('ip:' % { cl->state = STATE_IP; }
|ip % { cl->state = STATE_IP; } |'snet:' % { cl->state = STATE_SUBNET; }
|subnet % { cl->state = STATE_SUBNET; } |'routr:' % { cl->state = STATE_ROUTER; }
|dns % { cl->state = STATE_DNS; } |'bcast:' % { cl->state = STATE_BROADCAST; }
|lprsvr % { cl->state = STATE_LPRSVR; } ) ip_arg;
|ntpsvr % { cl->state = STATE_NTPSVR; } cmd_iplist = ('dns:' % { cl->state = STATE_DNS; }
|wins % { cl->state = STATE_WINS; } |'lpr:' % { cl->state = STATE_LPRSVR; }
|router % { cl->state = STATE_ROUTER; } |'ntp:' % { cl->state = STATE_NTPSVR; }
|broadcast % { cl->state = STATE_BROADCAST; } |'wins:' % { cl->state = STATE_WINS; }
|timezone % { cl->state = STATE_TIMEZONE; } ) iplist_arg;
|hostname % { cl->state = STATE_HOSTNAME; } cmd_str = ('iface:' % { cl->state = STATE_INTERFACE; }
|domain % { cl->state = STATE_DOMAIN; } |'host:' % { cl->state = STATE_HOSTNAME; }
|ipttl % { cl->state = STATE_IPTTL; } |'dom:' % { cl->state = STATE_DOMAIN; }
|mtu % { cl->state = STATE_MTU; } ) str_arg;
); cmd_s32 = ('tzone:' % { cl->state = STATE_TIMEZONE; }) s32_arg;
cmd_u16 = ('mtu:' % { cl->state = STATE_MTU; }) u16_arg;
cmd_u8 = ('ipttl:' % { cl->state = STATE_IPTTL; }) u8_arg;
command = cmdname ':' ([^;\0]+ > ArgSt % ArgEn) (';' > Dispatch); command = (cmd_ip|cmd_iplist|cmd_str|cmd_s32|cmd_u16|cmd_u8);
main := (command > Reset)+; main := (command > Reset)+;
}%% }%%