* Copyright (c) 1996, 1998-2001 Todd C. Miller <Todd.Miller@courtesan.com>
* All rights reserved.
*
- * This code is derived from software contributed by Chris Jepeway
- * <jepeway@cs.utk.edu>
+ * This code is derived from software contributed by Chris Jepeway.
*
* This code is derived from software contributed by Chris Jepeway
* Redistribution and use in source and binary forms, with or without
#define INDEFS 5
-#line 985 "lex.yy.c"
+#line 984 "lex.yy.c"
/* Macros after this point can all be overridden by user definitions in
* section 1.
register char *yy_cp, *yy_bp;
register int yy_act;
-#line 114 "parse.lex"
+#line 113 "parse.lex"
-#line 1141 "lex.yy.c"
+#line 1140 "lex.yy.c"
if ( yy_init )
{
case 1:
YY_RULE_SETUP
-#line 115 "parse.lex"
+#line 114 "parse.lex"
BEGIN STARTDEFS;
YY_BREAK
case 2:
YY_RULE_SETUP
-#line 117 "parse.lex"
+#line 116 "parse.lex"
{
BEGIN INDEFS;
LEXTRACE("DEFVAR ");
case 3:
YY_RULE_SETUP
-#line 125 "parse.lex"
+#line 124 "parse.lex"
{
BEGIN STARTDEFS;
LEXTRACE(", ");
YY_BREAK
case 4:
YY_RULE_SETUP
-#line 131 "parse.lex"
+#line 130 "parse.lex"
{
LEXTRACE("= ");
return('=');
YY_BREAK
case 5:
YY_RULE_SETUP
-#line 136 "parse.lex"
+#line 135 "parse.lex"
{
LEXTRACE("+= ");
return('+');
YY_BREAK
case 6:
YY_RULE_SETUP
-#line 141 "parse.lex"
+#line 140 "parse.lex"
{
LEXTRACE("-= ");
return('-');
YY_BREAK
case 7:
YY_RULE_SETUP
-#line 146 "parse.lex"
+#line 145 "parse.lex"
{
LEXTRACE("WORD(1) ");
fill(yytext + 1, yyleng - 2);
YY_BREAK
case 8:
YY_RULE_SETUP
-#line 152 "parse.lex"
+#line 151 "parse.lex"
{
LEXTRACE("WORD(2) ");
fill(yytext, yyleng);
case 9:
YY_RULE_SETUP
-#line 160 "parse.lex"
+#line 159 "parse.lex"
{
LEXTRACE("QUOTEDCHAR ");
fill_args(yytext + 1, 1, sawspace);
YY_BREAK
case 10:
YY_RULE_SETUP
-#line 166 "parse.lex"
+#line 165 "parse.lex"
{
BEGIN INITIAL;
unput(*yytext);
YY_BREAK
case 11:
YY_RULE_SETUP
-#line 172 "parse.lex"
+#line 171 "parse.lex"
{
LEXTRACE("ARG ");
fill_args(yytext, yyleng, sawspace);
case 12:
YY_RULE_SETUP
-#line 179 "parse.lex"
+#line 178 "parse.lex"
{
BEGIN GOTDEFS;
switch (yytext[8]) {
YY_BREAK
case 13:
YY_RULE_SETUP
-#line 194 "parse.lex"
+#line 193 "parse.lex"
{
fill(yytext, yyleng);
switch (*yytext) {
YY_BREAK
case 14:
YY_RULE_SETUP
-#line 213 "parse.lex"
+#line 212 "parse.lex"
{
/* cmnd does not require passwd for this user */
LEXTRACE("NOPASSWD ");
YY_BREAK
case 15:
YY_RULE_SETUP
-#line 219 "parse.lex"
+#line 218 "parse.lex"
{
/* cmnd requires passwd for this user */
LEXTRACE("PASSWD ");
YY_BREAK
case 16:
YY_RULE_SETUP
-#line 225 "parse.lex"
+#line 224 "parse.lex"
{
/* netgroup */
fill(yytext, yyleng);
YY_BREAK
case 17:
YY_RULE_SETUP
-#line 232 "parse.lex"
+#line 231 "parse.lex"
{
/* UN*X group */
fill(yytext, yyleng);
YY_BREAK
case 18:
YY_RULE_SETUP
-#line 239 "parse.lex"
+#line 238 "parse.lex"
{
fill(yytext, yyleng);
LEXTRACE("NTWKADDR ");
YY_BREAK
case 19:
YY_RULE_SETUP
-#line 245 "parse.lex"
+#line 244 "parse.lex"
{
fill(yytext, yyleng);
LEXTRACE("NTWKADDR ");
YY_BREAK
case 20:
YY_RULE_SETUP
-#line 251 "parse.lex"
+#line 250 "parse.lex"
{
BEGIN GOTRUNAS;
LEXTRACE("RUNAS ");
YY_BREAK
case 21:
YY_RULE_SETUP
-#line 257 "parse.lex"
+#line 256 "parse.lex"
{
if (strcmp(yytext, "ALL") == 0) {
LEXTRACE("ALL ");
YY_BREAK
case 22:
YY_RULE_SETUP
-#line 268 "parse.lex"
+#line 267 "parse.lex"
{
/* username/uid that user can run command as */
fill(yytext, yyleng);
YY_BREAK
case 23:
YY_RULE_SETUP
-#line 275 "parse.lex"
+#line 274 "parse.lex"
{
BEGIN INITIAL;
}
YY_BREAK
case 24:
YY_RULE_SETUP
-#line 279 "parse.lex"
+#line 278 "parse.lex"
{
/* directories can't have args... */
if (yytext[yyleng - 1] == '/') {
YY_BREAK
case 25:
YY_RULE_SETUP
-#line 292 "parse.lex"
+#line 291 "parse.lex"
{
/* a word */
fill(yytext, yyleng);
YY_BREAK
case 26:
YY_RULE_SETUP
-#line 299 "parse.lex"
+#line 298 "parse.lex"
{
LEXTRACE(", ");
return(',');
YY_BREAK
case 27:
YY_RULE_SETUP
-#line 304 "parse.lex"
+#line 303 "parse.lex"
{
LEXTRACE("= ");
return('=');
YY_BREAK
case 28:
YY_RULE_SETUP
-#line 309 "parse.lex"
+#line 308 "parse.lex"
{
LEXTRACE(": ");
return(':');
YY_BREAK
case 29:
YY_RULE_SETUP
-#line 314 "parse.lex"
+#line 313 "parse.lex"
{
if (yyleng % 2 == 1)
return('!'); /* return '!' */
YY_BREAK
case 30:
YY_RULE_SETUP
-#line 319 "parse.lex"
+#line 318 "parse.lex"
{
BEGIN INITIAL;
++sudolineno;
YY_BREAK
case 31:
YY_RULE_SETUP
-#line 326 "parse.lex"
+#line 325 "parse.lex"
{ /* throw away space/tabs */
sawspace = TRUE; /* but remember for fill_args */
}
YY_BREAK
case 32:
YY_RULE_SETUP
-#line 330 "parse.lex"
+#line 329 "parse.lex"
{
sawspace = TRUE; /* remember for fill_args */
++sudolineno;
YY_BREAK
case 33:
YY_RULE_SETUP
-#line 336 "parse.lex"
+#line 335 "parse.lex"
{
BEGIN INITIAL;
++sudolineno;
YY_BREAK
case 34:
YY_RULE_SETUP
-#line 343 "parse.lex"
+#line 342 "parse.lex"
{
LEXTRACE("ERROR ");
return(ERROR);
YY_BREAK
case 35:
YY_RULE_SETUP
-#line 348 "parse.lex"
+#line 347 "parse.lex"
ECHO;
YY_BREAK
-#line 1565 "lex.yy.c"
+#line 1564 "lex.yy.c"
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(GOTRUNAS):
case YY_STATE_EOF(GOTDEFS):
return 0;
}
#endif
-#line 348 "parse.lex"
+#line 347 "parse.lex"
static void
fill(s, len)
* Copyright (c) 1996, 1998-2001 Todd C. Miller <Todd.Miller@courtesan.com>
* All rights reserved.
*
- * This code is derived from software contributed by Chris Jepeway
- * <jepeway@cs.utk.edu>
+ * This code is derived from software contributed by Chris Jepeway.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
}
parse_error = TRUE;
}
-#line 215 "parse.yacc"
+#line 214 "parse.yacc"
typedef union {
char *string;
int BOOLEAN;
struct sudo_command command;
int tok;
} YYSTYPE;
-#line 239 "sudo.tab.c"
+#line 238 "sudo.tab.c"
#define COMMAND 257
#define ALIAS 258
#define DEFVAR 259
short *yysslim;
YYSTYPE *yyvs;
int yystacksize;
-#line 845 "parse.yacc"
+#line 844 "parse.yacc"
#define MOREALIASES (32)
aliasinfo *aliases = NULL;
if (printmatches == TRUE)
expand_match_list();
}
-#line 941 "sudo.tab.c"
+#line 940 "sudo.tab.c"
/* allocate initial stack or double stack size, up to YYMAXDEPTH */
#if defined(__cplusplus) || __STDC__
static int yygrowstack(void)
switch (yyn)
{
case 3:
-#line 265 "parse.yacc"
+#line 264 "parse.yacc"
{ ; }
break;
case 4:
-#line 267 "parse.yacc"
+#line 266 "parse.yacc"
{ yyerrok; }
break;
case 5:
-#line 268 "parse.yacc"
+#line 267 "parse.yacc"
{ push; }
break;
case 6:
-#line 268 "parse.yacc"
+#line 267 "parse.yacc"
{
while (top && user_matches != TRUE)
pop;
}
break;
case 7:
-#line 273 "parse.yacc"
+#line 272 "parse.yacc"
{ ; }
break;
case 8:
-#line 275 "parse.yacc"
+#line 274 "parse.yacc"
{ ; }
break;
case 9:
-#line 277 "parse.yacc"
+#line 276 "parse.yacc"
{ ; }
break;
case 10:
-#line 279 "parse.yacc"
+#line 278 "parse.yacc"
{ ; }
break;
case 11:
-#line 281 "parse.yacc"
+#line 280 "parse.yacc"
{ ; }
break;
case 13:
-#line 286 "parse.yacc"
+#line 285 "parse.yacc"
{
defaults_matches = TRUE;
}
break;
case 14:
-#line 289 "parse.yacc"
+#line 288 "parse.yacc"
{ push; }
break;
case 15:
-#line 289 "parse.yacc"
+#line 288 "parse.yacc"
{
defaults_matches = user_matches;
pop;
}
break;
case 16:
-#line 293 "parse.yacc"
+#line 292 "parse.yacc"
{ push; }
break;
case 17:
-#line 293 "parse.yacc"
+#line 292 "parse.yacc"
{
defaults_matches = host_matches;
pop;
}
break;
case 20:
-#line 302 "parse.yacc"
+#line 301 "parse.yacc"
{
if (defaults_matches == TRUE &&
!set_default(yyvsp[0].string, NULL, TRUE)) {
}
break;
case 21:
-#line 310 "parse.yacc"
+#line 309 "parse.yacc"
{
if (defaults_matches == TRUE &&
!set_default(yyvsp[0].string, NULL, FALSE)) {
}
break;
case 22:
-#line 318 "parse.yacc"
+#line 317 "parse.yacc"
{
if (defaults_matches == TRUE &&
!set_default(yyvsp[-2].string, yyvsp[0].string, TRUE)) {
}
break;
case 23:
-#line 327 "parse.yacc"
+#line 326 "parse.yacc"
{
if (defaults_matches == TRUE &&
!set_default(yyvsp[-2].string, yyvsp[0].string, '+')) {
}
break;
case 24:
-#line 336 "parse.yacc"
+#line 335 "parse.yacc"
{
if (defaults_matches == TRUE &&
!set_default(yyvsp[-2].string, yyvsp[0].string, '-')) {
}
break;
case 27:
-#line 350 "parse.yacc"
+#line 349 "parse.yacc"
{
/*
* We already did a push if necessary in
}
break;
case 28:
-#line 365 "parse.yacc"
+#line 364 "parse.yacc"
{
if (yyvsp[0].BOOLEAN != -1)
host_matches = yyvsp[0].BOOLEAN;
}
break;
case 29:
-#line 369 "parse.yacc"
+#line 368 "parse.yacc"
{
if (yyvsp[0].BOOLEAN != -1)
host_matches = ! yyvsp[0].BOOLEAN;
}
break;
case 30:
-#line 374 "parse.yacc"
+#line 373 "parse.yacc"
{
yyval.BOOLEAN = TRUE;
}
break;
case 31:
-#line 377 "parse.yacc"
+#line 376 "parse.yacc"
{
if (addr_matches(yyvsp[0].string))
yyval.BOOLEAN = TRUE;
}
break;
case 32:
-#line 384 "parse.yacc"
+#line 383 "parse.yacc"
{
if (netgr_matches(yyvsp[0].string, user_host, user_shost, NULL))
yyval.BOOLEAN = TRUE;
}
break;
case 33:
-#line 391 "parse.yacc"
+#line 390 "parse.yacc"
{
if (hostname_matches(user_shost, user_host, yyvsp[0].string) == 0)
yyval.BOOLEAN = TRUE;
}
break;
case 34:
-#line 398 "parse.yacc"
+#line 397 "parse.yacc"
{
aliasinfo *aip = find_alias(yyvsp[0].string, HOST_ALIAS);
}
break;
case 37:
-#line 426 "parse.yacc"
+#line 425 "parse.yacc"
{
/*
* Push the entry onto the stack if it is worth
}
break;
case 38:
-#line 453 "parse.yacc"
+#line 452 "parse.yacc"
{
if (yyvsp[0].BOOLEAN != -1)
cmnd_matches = yyvsp[0].BOOLEAN;
}
break;
case 39:
-#line 457 "parse.yacc"
+#line 456 "parse.yacc"
{
if (printmatches == TRUE) {
if (in_alias == TRUE)
}
break;
case 40:
-#line 465 "parse.yacc"
+#line 464 "parse.yacc"
{
if (yyvsp[0].BOOLEAN != -1)
cmnd_matches = ! yyvsp[0].BOOLEAN;
}
break;
case 41:
-#line 471 "parse.yacc"
+#line 470 "parse.yacc"
{
if (printmatches == TRUE && host_matches == TRUE &&
user_matches == TRUE) {
}
break;
case 42:
-#line 494 "parse.yacc"
+#line 493 "parse.yacc"
{
runas_matches = (yyvsp[0].BOOLEAN == TRUE ? TRUE : FALSE);
}
break;
case 43:
-#line 499 "parse.yacc"
+#line 498 "parse.yacc"
{ ; }
break;
case 44:
-#line 500 "parse.yacc"
+#line 499 "parse.yacc"
{
/* Later entries override earlier ones. */
if (yyvsp[0].BOOLEAN != -1)
}
break;
case 45:
-#line 509 "parse.yacc"
+#line 508 "parse.yacc"
{ ; }
break;
case 46:
-#line 510 "parse.yacc"
+#line 509 "parse.yacc"
{
if (printmatches == TRUE) {
if (in_alias == TRUE)
}
break;
case 47:
-#line 518 "parse.yacc"
+#line 517 "parse.yacc"
{
/* Set $$ to the negation of runasuser */
yyval.BOOLEAN = (yyvsp[0].BOOLEAN == -1 ? -1 : ! yyvsp[0].BOOLEAN);
}
break;
case 48:
-#line 523 "parse.yacc"
+#line 522 "parse.yacc"
{
if (printmatches == TRUE) {
if (in_alias == TRUE)
}
break;
case 49:
-#line 537 "parse.yacc"
+#line 536 "parse.yacc"
{
if (printmatches == TRUE) {
if (in_alias == TRUE)
}
break;
case 50:
-#line 551 "parse.yacc"
+#line 550 "parse.yacc"
{
if (printmatches == TRUE) {
if (in_alias == TRUE)
}
break;
case 51:
-#line 565 "parse.yacc"
+#line 564 "parse.yacc"
{
aliasinfo *aip = find_alias(yyvsp[0].string, RUNAS_ALIAS);
}
break;
case 52:
-#line 594 "parse.yacc"
+#line 593 "parse.yacc"
{
if (printmatches == TRUE) {
if (in_alias == TRUE)
}
break;
case 53:
-#line 606 "parse.yacc"
+#line 605 "parse.yacc"
{
/* Inherit NOPASSWD/PASSWD status. */
if (printmatches == TRUE && host_matches == TRUE &&
}
break;
case 54:
-#line 616 "parse.yacc"
+#line 615 "parse.yacc"
{
no_passwd = TRUE;
if (printmatches == TRUE && host_matches == TRUE &&
}
break;
case 55:
-#line 622 "parse.yacc"
+#line 621 "parse.yacc"
{
no_passwd = FALSE;
if (printmatches == TRUE && host_matches == TRUE &&
}
break;
case 56:
-#line 630 "parse.yacc"
+#line 629 "parse.yacc"
{
if (printmatches == TRUE) {
if (in_alias == TRUE)
}
break;
case 57:
-#line 647 "parse.yacc"
+#line 646 "parse.yacc"
{
aliasinfo *aip;
}
break;
case 58:
-#line 676 "parse.yacc"
+#line 675 "parse.yacc"
{
if (printmatches == TRUE) {
if (in_alias == TRUE) {
}
break;
case 61:
-#line 708 "parse.yacc"
+#line 707 "parse.yacc"
{ push; }
break;
case 62:
-#line 708 "parse.yacc"
+#line 707 "parse.yacc"
{
if ((host_matches != -1 || pedantic) &&
!add_alias(yyvsp[-3].string, HOST_ALIAS, host_matches))
}
break;
case 67:
-#line 724 "parse.yacc"
+#line 723 "parse.yacc"
{
push;
if (printmatches == TRUE) {
}
break;
case 68:
-#line 733 "parse.yacc"
+#line 732 "parse.yacc"
{
if ((cmnd_matches != -1 || pedantic) &&
!add_alias(yyvsp[-3].string, CMND_ALIAS, cmnd_matches))
}
break;
case 69:
-#line 745 "parse.yacc"
+#line 744 "parse.yacc"
{ ; }
break;
case 73:
-#line 753 "parse.yacc"
+#line 752 "parse.yacc"
{
if (printmatches == TRUE) {
in_alias = TRUE;
}
break;
case 74:
-#line 761 "parse.yacc"
+#line 760 "parse.yacc"
{
if ((yyvsp[0].BOOLEAN != -1 || pedantic) &&
!add_alias(yyvsp[-3].string, RUNAS_ALIAS, yyvsp[0].BOOLEAN))
}
break;
case 77:
-#line 776 "parse.yacc"
+#line 775 "parse.yacc"
{ push; }
break;
case 78:
-#line 776 "parse.yacc"
+#line 775 "parse.yacc"
{
if ((user_matches != -1 || pedantic) &&
!add_alias(yyvsp[-3].string, USER_ALIAS, user_matches))
}
break;
case 81:
-#line 789 "parse.yacc"
+#line 788 "parse.yacc"
{
if (yyvsp[0].BOOLEAN != -1)
user_matches = yyvsp[0].BOOLEAN;
}
break;
case 82:
-#line 793 "parse.yacc"
+#line 792 "parse.yacc"
{
if (yyvsp[0].BOOLEAN != -1)
user_matches = ! yyvsp[0].BOOLEAN;
}
break;
case 83:
-#line 798 "parse.yacc"
+#line 797 "parse.yacc"
{
if (strcmp(yyvsp[0].string, user_name) == 0)
yyval.BOOLEAN = TRUE;
}
break;
case 84:
-#line 805 "parse.yacc"
+#line 804 "parse.yacc"
{
if (usergr_matches(yyvsp[0].string, user_name))
yyval.BOOLEAN = TRUE;
}
break;
case 85:
-#line 812 "parse.yacc"
+#line 811 "parse.yacc"
{
if (netgr_matches(yyvsp[0].string, NULL, NULL, user_name))
yyval.BOOLEAN = TRUE;
}
break;
case 86:
-#line 819 "parse.yacc"
+#line 818 "parse.yacc"
{
aliasinfo *aip = find_alias(yyvsp[0].string, USER_ALIAS);
}
break;
case 87:
-#line 839 "parse.yacc"
+#line 838 "parse.yacc"
{
yyval.BOOLEAN = TRUE;
}
break;
-#line 1835 "sudo.tab.c"
+#line 1834 "sudo.tab.c"
}
yyssp -= yym;
yystate = *yyssp;