-/* $OpenBSD: parse.y,v 1.5 2015/07/19 22:09:08 benno Exp $ */
+/* $OpenBSD: parse.y,v 1.7 2015/07/21 11:04:06 zhuk Exp $ */
/*
* Copyright (c) 2015 Ted Unangst <tedu@openbsd.org>
*
struct {
int action;
int options;
+ const char *cmd;
+ const char **cmdargs;
const char **envlist;
};
const char *str;
%}
-%token TPERMIT TDENY TAS TCMD
+%token TPERMIT TDENY TAS TCMD TARGS
%token TNOPASS TKEEPENV
%token TSTRING
r->envlist = $1.envlist;
r->ident = $2.str;
r->target = $3.str;
- r->cmd = $4.str;
+ r->cmd = $4.cmd;
+ r->cmdargs = $4.cmdargs;
if (nrules == maxrules) {
if (maxrules == 0)
maxrules = 63;
} ;
cmd: /* optional */ {
- $$.str = NULL;
- } | TCMD TSTRING {
- $$.str = $2.str;
+ $$.cmd = NULL;
+ $$.cmdargs = NULL;
+ } | TCMD TSTRING args {
+ $$.cmd = $2.str;
+ $$.cmdargs = $3.cmdargs;
+ } ;
+
+args: /* empty */ {
+ $$.cmdargs = NULL;
+ } | TARGS argslist {
+ $$.cmdargs = $2.cmdargs;
+ } ;
+
+argslist: /* empty */ {
+ if (!($$.cmdargs = calloc(1, sizeof(char *))))
+ errx(1, "can't allocate args");
+ } | argslist TSTRING {
+ int nargs = arraylen($1.cmdargs);
+ if (!($$.cmdargs = reallocarray($1.cmdargs, nargs + 2, sizeof(char *))))
+ errx(1, "can't allocate args");
+ $$.cmdargs[nargs] = $2.str;
+ $$.cmdargs[nargs + 1] = NULL;
} ;
%%
{ "permit", TPERMIT },
{ "as", TAS },
{ "cmd", TCMD },
+ { "args", TARGS },
{ "nopass", TNOPASS },
{ "keepenv", TKEEPENV },
};
repeat:
c = getc(yyfp);
switch (c) {
- case ' ':
- case '\t':
- goto repeat; /* skip spaces */
- case '\\':
- next = getc(yyfp);
- if (next == '\n')
- goto repeat;
- else
- c = next;
- case '\n':
- case '{':
- case '}':
- return c;
- case '#':
- while ((c = getc(yyfp)) != '\n' && c != EOF)
- ; /* skip comments */
- if (c == EOF)
- return 0;
- return c;
- case EOF:
+ case ' ':
+ case '\t':
+ goto repeat; /* skip spaces */
+ case '\\':
+ next = getc(yyfp);
+ if (next == '\n')
+ goto repeat;
+ else
+ c = next;
+ case '\n':
+ case '{':
+ case '}':
+ return c;
+ case '#':
+ while ((c = getc(yyfp)) != '\n' && c != EOF)
+ ; /* skip comments */
+ if (c == EOF)
return 0;
+ return c;
+ case EOF:
+ return 0;
}
while (1) {
switch (c) {