/*
* Alias types
*/
-#define HOST 1
-#define CMND 2
-#define USER 3
+#define HOST_ALIAS 1
+#define CMND_ALIAS 2
+#define USER_ALIAS 3
+#define RUNAS_ALIAS 4
/*
* The matching stack, initial space allocated in init_parser().
%token <tok> HOSTALIAS /* Host_Alias keyword */
%token <tok> CMNDALIAS /* Cmnd_Alias keyword */
%token <tok> USERALIAS /* User_Alias keyword */
+%token <tok> RUNASALIAS /* Runas_Alias keyword */
%token <tok> ':' '=' ',' '!' '.' /* union member tokens */
%token <tok> ERROR
{ ; }
| CMNDALIAS cmndaliases
{ ; }
+ | RUNASALIAS runasaliases
+ { ; }
;
}
| ALIAS {
/* could be an all-caps hostname */
- if (find_alias($1, HOST) || !strcasecmp(shost, $1))
+ if (find_alias($1, HOST_ALIAS) == TRUE ||
+ strcasecmp(shost, $1) == 0)
host_matches = TRUE;
(void) free($1);
}
}
| ALIAS {
/* could be an all-caps username */
- if (find_alias($1, USER) || !strcmp($1, runas_user))
+ if (find_alias($1, RUNAS_ALIAS) == TRUE ||
+ strcmp($1, runas_user) == 0)
$$ = TRUE;
else
$$ = FALSE;
&cm_list[cm_list_len].cmnd_size, 0);
expand_match_list();
}
- if (find_alias($1, CMND)) {
+ if (find_alias($1, CMND_ALIAS) == TRUE) {
cmnd_matches = TRUE;
$$ = TRUE;
}
;
hostalias : ALIAS { push; } '=' hostlist {
- if (host_matches == TRUE && !add_alias($1, HOST))
+ if (host_matches == TRUE &&
+ add_alias($1, HOST_ALIAS) == FALSE)
YYERROR;
pop;
}
}
}
} '=' cmndlist {
- if (cmnd_matches == TRUE && !add_alias($1, CMND))
+ if (cmnd_matches == TRUE &&
+ add_alias($1, CMND_ALIAS) == FALSE)
YYERROR;
pop;
(void) free($1);
| cmndlist ',' cmnd
;
+runasaliases : runasalias
+ | runasaliases ':' runasalias
+ ;
+
+runasalias : ALIAS { push; } '=' runaslist {
+ if (add_alias($1, RUNAS_ALIAS) == FALSE)
+ YYERROR;
+ pop;
+ (void) free($1);
+ }
+ ;
+
useraliases : useralias
| useraliases ':' useralias
;
useralias : ALIAS { push; } '=' userlist {
- if (!add_alias($1, USER))
+ if (user_matches == TRUE &&
+ add_alias($1, USER_ALIAS) == FALSE)
YYERROR;
pop;
(void) free($1);
}
| ALIAS {
/* could be an all-caps username */
- if (find_alias($1, USER) || !strcmp($1, user_name))
+ if (find_alias($1, USER_ALIAS) == TRUE ||
+ strcmp($1, user_name) == 0)
user_matches = TRUE;
(void) free($1);
}
for (n = 0; n < naliases; n++) {
switch (aliases[n].type) {
- case HOST:
- (void) puts("HOST");
+ case HOST_ALIAS:
+ (void) puts("HOST_ALIAS");
+ break;
+
+ case CMND_ALIAS:
+ (void) puts("CMND_ALIAS");
break;
- case CMND:
- (void) puts("CMND");
+ case USER_ALIAS:
+ (void) puts("USER_ALIAS");
break;
- case USER:
- (void) puts("USER");
+ case RUNAS_ALIAS:
+ (void) puts("RUNAS_ALIAS");
break;
}
(void) printf("\t%s\n", aliases[n].name);