%{ /* * CU sudo version 1.3.1 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 1, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please send bugs, changes, problems to sudo-bugs@cs.colorado.edu * ******************************************************************* * * parse.lex -- lexigraphical analyzer for sudo. * * Chris Jepeway */ #ifndef lint static char rcsid[] = "$Id$"; #endif /* lint */ #include "config.h" #ifdef HAVE_UNISTD_H #include #endif /* HAVE_UNISTD_H */ #include #include #include #include #include "sudo.h" #include "options.h" #include "y.tab.h" #undef yywrap /* guard against a yywrap macro */ extern YYSTYPE yylval; extern int clearaliases; int sudolineno = 1; static void fill __P((void)); static void append __P((void)); extern void reset_aliases __P((void)); #ifdef TRACELEXER #define LEXTRACE(msg) fputs(msg, stderr) #else #define LEXTRACE(msg) #endif %} N [0-9][0-9]?[0-9]? %e 4000 %p 6000 %k 3500 %s GOTCMND %% [ \t]+ { ; } /* throw away space/tabs */ \\\n { ++sudolineno; LEXTRACE("\n\t"); } /* throw away EOL after \ */ [:,=\n] { BEGIN 0; unput(yytext[0]); return(PATH); } /* end of command line args */ \n { ++sudolineno; LEXTRACE("\n"); return COMMENT; } /* return newline */ #.*\n { ++sudolineno; LEXTRACE("\n"); return COMMENT; } /* return comments */ [^\,:=\\ \t\n#]+ { LEXTRACE("ARG "); append(); } /* a command line arg */ \, { LEXTRACE(", "); return ','; } /* return ',' */ \! { return '!'; } /* return '!' */ = { LEXTRACE("= "); return '='; } /* return '=' */ : { LEXTRACE(": "); return ':'; } /* return ':' */ \. { return '.'; } \+[a-zA-Z][a-zA-Z0-9_-]* { fill(); return NETGROUP; } {N}\.{N}\.{N}\.{N} { fill(); return NTWKADDR; } \/[^\,:=\\ \t\n#]+ { BEGIN GOTCMND; LEXTRACE("PATH "); fill(); } /* a pathname */ [A-Z][A-Z0-9_]* { fill(); if (strcmp(yytext, "ALL") == 0) { LEXTRACE("ALL "); return ALL; } LEXTRACE("ALIAS "); return ALIAS; } [a-zA-Z][a-zA-Z0-9_-]* { int l; fill(); if (strcmp(yytext, "Host_Alias") == 0) { LEXTRACE("HOSTALIAS "); return HOSTALIAS; } if (strcmp(yytext, "Cmnd_Alias") == 0) { LEXTRACE("CMNDALIAS "); return CMNDALIAS; } if (strcmp(yytext, "User_Alias") == 0) { LEXTRACE("USERALIAS "); return USERALIAS; } l = strlen(yytext) - 1; if (isalpha(yytext[l]) || isdigit(yytext[l])) { /* NAME is what RFC1034 calls a label */ LEXTRACE("NAME "); return NAME; } return ERROR; } . { return ERROR; } /* return error */ %% static void fill() { (void) strcpy(yylval.string, yytext); } static void append() { (void) strcat(yylval.string, " "); (void) strcat(yylval.string, yytext); } int yywrap() { #ifdef YY_NEW_FILE YY_NEW_FILE; #endif /* YY_NEW_FILE */ /* don't reset the aliases if called by testsudoers */ if (clearaliases) reset_aliases(); return(1); }