? doas ? doas.conf ? parse.c ? y.tab.h Index: Makefile =================================================================== RCS file: /cvs/src/usr.bin/doas/Makefile,v retrieving revision 1.1 diff -u -p -r1.1 Makefile --- Makefile 16 Jul 2015 20:44:21 -0000 1.1 +++ Makefile 23 Jul 2015 11:08:03 -0000 @@ -1,14 +1,12 @@ # $OpenBSD: Makefile,v 1.1 2015/07/16 20:44:21 tedu Exp $ -SRCS= parse.y doas.c - PROG= doas +SRCS= parse.y doas.c MAN= doas.1 doas.conf.5 BINOWN= root BINMODE=4555 -CFLAGS+= -I${.CURDIR} COPTS+= -Wall .include Index: doas.c =================================================================== RCS file: /cvs/src/usr.bin/doas/doas.c,v retrieving revision 1.18 diff -u -p -r1.18 doas.c --- doas.c 21 Jul 2015 17:49:33 -0000 1.18 +++ doas.c 23 Jul 2015 11:08:03 -0000 @@ -151,12 +151,16 @@ permit(uid_t uid, gid_t *groups, int ngr return (*lastr)->action == PERMIT; } +const char *conffile; + static void parseconfig(const char *filename) { extern FILE *yyfp; extern int yyparse(void); struct stat sb; + + conffile = filename; yyfp = fopen(filename, "r"); if (!yyfp) { Index: doas.h =================================================================== RCS file: /cvs/src/usr.bin/doas/doas.h,v retrieving revision 1.3 diff -u -p -r1.3 doas.h --- doas.h 21 Jul 2015 11:04:06 -0000 1.3 +++ doas.h 23 Jul 2015 11:08:03 -0000 @@ -15,8 +15,9 @@ extern int nrules, maxrules; size_t arraylen(const char **); -#define PERMIT 1 -#define DENY 2 +#define PERMIT 1 +#define NOPASS 2 +#define SSHAGENT 3 +#define DENY 4 -#define NOPASS 0x1 -#define KEEPENV 0x2 +#define KEEPENV 0x1 Index: parse.y =================================================================== RCS file: /cvs/src/usr.bin/doas/parse.y,v retrieving revision 1.8 diff -u -p -r1.8 parse.y --- parse.y 21 Jul 2015 16:12:04 -0000 1.8 +++ parse.y 23 Jul 2015 11:08:03 -0000 @@ -38,6 +38,7 @@ typedef struct { }; const char *str; }; + u_int lineno; } yystype; #define YYSTYPE yystype @@ -100,8 +101,10 @@ options: /* none */ $$.options = $1.options | $2.options; $$.envlist = $1.envlist; if ($2.envlist) { - if ($$.envlist) - errx(1, "can't have two keepenv sections"); + if ($$.envlist) { + yyerror("can't have two keepenv sections"); + YYERROR; + } else $$.envlist = $2.envlist; } @@ -168,10 +171,18 @@ argslist: /* empty */ { void yyerror(const char *fmt, ...) { - va_list va; + extern const char *conffile; + va_list ap; + char *msg; + + va_start(ap, fmt); + if (vasprintf(&msg, fmt, ap) == -1) + errx(1, "yyerror vasprintf"); + va_end(ap); - va_start(va, fmt); - verrx(1, fmt, va); + warnx("%s:%u: %s", conffile, yylval.lineno + 1, msg); + + free(msg); } struct keyword { @@ -203,19 +214,25 @@ repeat: goto repeat; /* skip spaces */ case '\\': next = getc(yyfp); - if (next == '\n') + if (next == '\n') { + yylval.lineno++; goto repeat; - else + } else c = next; case '\n': + yylval.lineno++; case '{': case '}': return c; case '#': - while ((c = getc(yyfp)) != '\n' && c != EOF) - ; /* skip comments */ - if (c == EOF) - return 0; + ; /* skip comments */ + do { + c = getc(yyfp); + if (c == EOF) + return (0); + } while (c != '\n'); + + yylval.lineno++; return c; case EOF: return 0; @@ -223,6 +240,7 @@ repeat: while (1) { switch (c) { case '\n': + yylval.lineno++; case '{': case '}': case '#':