2006-04-11 21:52:54 +00:00
|
|
|
/*
|
2007-04-11 08:12:51 +00:00
|
|
|
* Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
|
|
|
|
* NOVELL (All rights reserved)
|
2010-06-04 18:57:01 -07:00
|
|
|
* Copyright (c) 2010
|
|
|
|
* Canonical, Ltd.
|
2006-04-11 21:52:54 +00:00
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of version 2 of the GNU General Public
|
|
|
|
* License published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* 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
|
2010-06-04 18:57:01 -07:00
|
|
|
* along with this program; if not, contact Canonical, Ltd.
|
2006-04-11 21:52:54 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
/* Definitions section */
|
|
|
|
/* %option main */
|
|
|
|
|
|
|
|
/* eliminates need to link with libfl */
|
|
|
|
%option noyywrap
|
2010-11-09 13:39:18 -08:00
|
|
|
%option nounput
|
2012-01-02 16:48:24 -08:00
|
|
|
%option stack
|
2006-04-11 21:52:54 +00:00
|
|
|
|
|
|
|
%{
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <libintl.h>
|
2009-07-24 07:35:39 +00:00
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <dirent.h>
|
2006-04-11 21:52:54 +00:00
|
|
|
#define _(s) gettext(s)
|
|
|
|
|
|
|
|
#include "parser.h"
|
2009-07-24 07:35:39 +00:00
|
|
|
#include "parser_include.h"
|
2006-04-11 21:52:54 +00:00
|
|
|
#include "parser_yacc.h"
|
|
|
|
|
2009-07-24 07:35:39 +00:00
|
|
|
#ifdef PDEBUG
|
|
|
|
#undef PDEBUG
|
|
|
|
#endif
|
2006-04-11 21:52:54 +00:00
|
|
|
/* #define DEBUG */
|
|
|
|
#ifdef DEBUG
|
|
|
|
#define PDEBUG(fmt, args...) printf("Lexer: " fmt, ## args)
|
|
|
|
#else
|
|
|
|
#define PDEBUG(fmt, args...) /* Do nothing */
|
|
|
|
#endif
|
|
|
|
#define NPDEBUG(fmt, args...) /* Do nothing */
|
|
|
|
|
2010-06-26 13:13:52 -07:00
|
|
|
#define DUMP_PREPROCESS do { if (preprocess_only) ECHO; } while (0)
|
|
|
|
|
2010-07-26 09:22:45 -07:00
|
|
|
#define YY_NO_INPUT
|
|
|
|
|
2009-07-24 07:35:39 +00:00
|
|
|
struct ignored_suffix_t {
|
|
|
|
char * text;
|
|
|
|
int len;
|
|
|
|
int silent;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct ignored_suffix_t ignored_suffixes[] = {
|
|
|
|
/* Debian packging files, which are in flux during install
|
|
|
|
should be silently ignored. */
|
|
|
|
{ ".dpkg-new", 9, 1 },
|
|
|
|
{ ".dpkg-old", 9, 1 },
|
|
|
|
{ ".dpkg-dist", 10, 1 },
|
2010-02-16 12:56:04 -08:00
|
|
|
{ ".dpkg-bak", 9, 1 },
|
2009-07-24 07:35:39 +00:00
|
|
|
/* RPM packaging files have traditionally not been silently
|
|
|
|
ignored */
|
|
|
|
{ ".rpmnew", 7, 0 },
|
|
|
|
{ ".rpmsave", 8, 0 },
|
|
|
|
/* Backup files should be mentioned */
|
|
|
|
{ "~", 1, 0 },
|
|
|
|
{ NULL, 0, 0 }
|
|
|
|
};
|
|
|
|
|
|
|
|
void include_filename(char *filename, int search)
|
|
|
|
{
|
|
|
|
FILE *include_file = NULL;
|
|
|
|
struct stat my_stat;
|
|
|
|
char *fullpath = NULL;
|
|
|
|
|
2009-07-24 11:56:07 +00:00
|
|
|
if (search) {
|
2010-06-26 13:13:52 -07:00
|
|
|
if (preprocess_only)
|
|
|
|
fprintf(yyout, "\n\n##included <%s>\n", filename);
|
2009-07-24 11:56:07 +00:00
|
|
|
include_file = search_path(filename, &fullpath);
|
|
|
|
} else {
|
2010-06-26 13:13:52 -07:00
|
|
|
if (preprocess_only)
|
|
|
|
fprintf(yyout, "\n\n##included \"%s\"\n", filename);
|
2009-07-24 07:35:39 +00:00
|
|
|
fullpath = strdup(filename);
|
|
|
|
include_file = fopen(fullpath, "r");
|
|
|
|
}
|
|
|
|
|
2009-07-24 11:56:07 +00:00
|
|
|
if (!include_file)
|
2010-06-04 18:47:44 -07:00
|
|
|
yyerror(_("Could not open '%s'"),
|
|
|
|
fullpath ? fullpath: filename);
|
2009-07-24 07:35:39 +00:00
|
|
|
|
|
|
|
if (fstat(fileno(include_file), &my_stat))
|
|
|
|
yyerror(_("fstat failed for '%s'"), fullpath);
|
|
|
|
|
|
|
|
if (S_ISREG(my_stat.st_mode)) {
|
|
|
|
yyin = include_file;
|
2010-09-14 12:22:02 -07:00
|
|
|
update_mru_tstamp(include_file);
|
2009-07-24 07:35:39 +00:00
|
|
|
PDEBUG("Opened include \"%s\"\n", fullpath);
|
2010-06-04 18:47:44 -07:00
|
|
|
push_include_stack(fullpath);
|
2009-07-24 07:35:39 +00:00
|
|
|
yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (S_ISDIR(my_stat.st_mode)) {
|
|
|
|
DIR *dir = NULL;
|
|
|
|
char *dirent_path = NULL;
|
|
|
|
struct dirent *dirent;
|
|
|
|
|
|
|
|
PDEBUG("Opened include directory \"%s\"\n", fullpath);
|
|
|
|
if (!(dir = opendir(fullpath)))
|
|
|
|
yyerror(_("opendir failed '%s'"), fullpath);
|
|
|
|
fclose(include_file);
|
|
|
|
include_file = NULL;
|
|
|
|
|
|
|
|
while ((dirent = readdir(dir)) != NULL) {
|
|
|
|
int name_len;
|
|
|
|
struct ignored_suffix_t *suffix;
|
|
|
|
/* skip dotfiles silently. */
|
|
|
|
if (dirent->d_name[0] == '.')
|
|
|
|
continue;
|
|
|
|
|
2009-07-24 11:56:07 +00:00
|
|
|
if (dirent_path)
|
|
|
|
free(dirent_path);
|
|
|
|
if (asprintf(&dirent_path, "%s/%s", fullpath, dirent->d_name) < 0)
|
2009-07-24 07:35:39 +00:00
|
|
|
yyerror("Out of memory");
|
|
|
|
|
|
|
|
name_len = strlen(dirent->d_name);
|
|
|
|
/* skip blacklisted suffixes */
|
|
|
|
for (suffix = ignored_suffixes; suffix->text; suffix++) {
|
|
|
|
char *found;
|
|
|
|
if ( (found = strstr(dirent->d_name, suffix->text)) &&
|
|
|
|
found - dirent->d_name + suffix->len == name_len ) {
|
|
|
|
name_len = 0;
|
|
|
|
if (!suffix->silent)
|
|
|
|
PERROR("Ignoring: '%s'\n", dirent_path);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!name_len) continue;
|
|
|
|
|
|
|
|
if (stat(dirent_path, &my_stat))
|
|
|
|
yyerror(_("stat failed for '%s'"), dirent_path);
|
|
|
|
if (S_ISREG(my_stat.st_mode)) {
|
|
|
|
if (!(yyin = fopen(dirent_path,"r")))
|
2010-06-04 18:47:44 -07:00
|
|
|
yyerror(_("Could not open '%s' in '%s'"), dirent_path, filename);
|
|
|
|
PDEBUG("Opened include \"%s\" in \"%s\"\n", dirent_path, filename);
|
2010-09-14 12:22:02 -07:00
|
|
|
update_mru_tstamp(yyin);
|
2010-06-04 18:47:44 -07:00
|
|
|
push_include_stack(dirent_path);
|
2009-07-24 11:56:07 +00:00
|
|
|
yypush_buffer_state(yy_create_buffer(yyin, YY_BUF_SIZE));
|
2009-07-24 07:35:39 +00:00
|
|
|
}
|
|
|
|
}
|
2009-07-24 11:56:07 +00:00
|
|
|
if (dirent_path)
|
|
|
|
free(dirent_path);
|
2009-07-24 07:35:39 +00:00
|
|
|
closedir(dir);
|
|
|
|
}
|
2009-07-24 12:18:12 +00:00
|
|
|
|
|
|
|
if (fullpath)
|
|
|
|
free(fullpath);
|
2009-07-24 07:35:39 +00:00
|
|
|
}
|
|
|
|
|
2006-04-11 21:52:54 +00:00
|
|
|
%}
|
|
|
|
|
|
|
|
UP "^"
|
|
|
|
OPEN_BRACE \{
|
|
|
|
CLOSE_BRACE \}
|
|
|
|
SLASH \/
|
|
|
|
COLON :
|
|
|
|
END_OF_RULE [,]
|
2009-07-24 11:56:07 +00:00
|
|
|
SEPARATOR {UP}
|
2006-04-11 21:52:54 +00:00
|
|
|
RANGE -
|
2009-08-20 15:41:10 +00:00
|
|
|
MODE_CHARS ([RrWwaLlMmkXx])|(([Pp]|[Cc])[Xx])|(([Pp]|[Cc])?([IiUu])[Xx])
|
2007-11-29 18:06:53 +00:00
|
|
|
MODES {MODE_CHARS}+
|
2006-04-11 21:52:54 +00:00
|
|
|
WS [[:blank:]]
|
|
|
|
NUMBER [[:digit:]]+
|
2007-07-27 20:27:41 +00:00
|
|
|
ID [^ \t\n"!,]|(,[^ \t\n"!])
|
|
|
|
POST_VAR_ID [^ =\+\t\n"!,]|(,[^ =\+\t\n"!])
|
2006-04-11 21:52:54 +00:00
|
|
|
IP {NUMBER}\.{NUMBER}\.{NUMBER}\.{NUMBER}
|
|
|
|
ALLOWED_QUOTED_ID [^\0"]|\\\"
|
|
|
|
QUOTED_ID \"{ALLOWED_QUOTED_ID}*\"
|
|
|
|
|
2007-07-27 20:48:24 +00:00
|
|
|
HAT hat[ \t]+
|
2006-04-11 21:52:54 +00:00
|
|
|
KEYWORD [[:alpha:]_]+
|
|
|
|
VARIABLE_NAME [[:alpha:]][[:alnum:]_]*
|
|
|
|
SET_VAR_PREFIX @
|
|
|
|
SET_VARIABLE {SET_VAR_PREFIX}(\{{VARIABLE_NAME}\}|{VARIABLE_NAME})
|
|
|
|
BOOL_VARIABLE $(\{{VARIABLE_NAME}\}|{VARIABLE_NAME})
|
|
|
|
|
|
|
|
PATHNAME (\/|{SET_VARIABLE}{POST_VAR_ID}){ID}*
|
|
|
|
QPATHNAME \"(\/|{SET_VAR_PREFIX})([^\0"]|\\\")*\"
|
|
|
|
|
|
|
|
FLAGOPEN_PAREN \(
|
|
|
|
FLAGCLOSE_PAREN \)
|
|
|
|
FLAGSEP \,
|
|
|
|
EQUALS =
|
|
|
|
ADD_ASSIGN \+=
|
2007-11-16 09:37:31 +00:00
|
|
|
ARROW ->
|
2008-04-06 18:55:46 +00:00
|
|
|
LT_EQUAL <=
|
2006-04-11 21:52:54 +00:00
|
|
|
|
|
|
|
%x SUB_NAME
|
2008-05-22 20:11:03 +00:00
|
|
|
%x SUB_NAME2
|
2007-07-27 20:29:47 +00:00
|
|
|
%x NETWORK_MODE
|
2006-04-11 21:52:54 +00:00
|
|
|
%x FLAGS_MODE
|
|
|
|
%x ASSIGN_MODE
|
2008-04-06 18:55:46 +00:00
|
|
|
%x RLIMIT_MODE
|
2009-07-23 21:18:37 +00:00
|
|
|
%x CHANGE_PROFILE_MODE
|
2009-07-24 07:35:39 +00:00
|
|
|
%x INCLUDE
|
2006-04-11 21:52:54 +00:00
|
|
|
|
|
|
|
%%
|
|
|
|
|
2009-07-24 07:35:39 +00:00
|
|
|
<INCLUDE>{
|
|
|
|
{WS}+ { /* Eat whitespace */ }
|
|
|
|
\<([^\> \t\n]+)\> { /* <filename> */
|
|
|
|
char *filename = strdup(yytext);
|
2009-07-24 12:18:12 +00:00
|
|
|
filename[strlen(filename) - 1] = '\0';
|
|
|
|
include_filename(filename + 1, 1);
|
2009-07-24 07:35:39 +00:00
|
|
|
free(filename);
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_pop_state();
|
2009-07-24 07:35:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
\"([^\" \t\n]+)\" { /* "filename" */
|
|
|
|
char *filename = strdup(yytext);
|
2009-07-24 12:18:12 +00:00
|
|
|
filename[strlen(filename) - 1] = '\0';
|
|
|
|
include_filename(filename + 1, 0);
|
2009-07-24 07:35:39 +00:00
|
|
|
free(filename);
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_pop_state();
|
2009-07-24 07:35:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
[^\<\>\"{WS}]+ { /* filename */
|
|
|
|
include_filename(yytext, 0);
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_pop_state();
|
2009-07-24 07:35:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
<<EOF>> {
|
2010-03-12 01:50:26 -08:00
|
|
|
fclose(yyin);
|
2010-06-04 18:47:44 -07:00
|
|
|
pop_include_stack();
|
2009-07-24 07:35:39 +00:00
|
|
|
yypop_buffer_state();
|
|
|
|
if ( !YY_CURRENT_BUFFER ) yyterminate();
|
|
|
|
}
|
|
|
|
|
2006-04-11 21:52:54 +00:00
|
|
|
<SUB_NAME>{
|
|
|
|
{ID}+ {
|
|
|
|
/* Ugh, this is a gross hack. I used to use
|
|
|
|
* {ID}+ to match all TOK_IDs, but that would
|
|
|
|
* also match TOK_MODE + TOK_END_OF_RULE
|
|
|
|
* without any spaces in between (because it's
|
|
|
|
* a longer match). So now, when I want to
|
|
|
|
* match any random string, I go into a
|
2009-07-24 11:56:07 +00:00
|
|
|
* separate state. */
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2010-03-08 21:49:16 -08:00
|
|
|
yylval.id = processunquoted(yytext, yyleng);
|
|
|
|
PDEBUG("Found sub name: \"%s\"\n", yylval.id);
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_pop_state();
|
2006-04-11 21:52:54 +00:00
|
|
|
return TOK_ID;
|
|
|
|
}
|
|
|
|
{QUOTED_ID} {
|
|
|
|
/* Ugh, this is a gross hack. I used to use
|
|
|
|
* {ID}+ to match all TOK_IDs, but that would
|
|
|
|
* also match TOK_MODE + TOK_END_OF_RULE
|
|
|
|
* without any spaces in between (because it's
|
|
|
|
* a longer match). So now, when I want to
|
|
|
|
* match any random string, I go into a
|
2009-07-24 11:56:07 +00:00
|
|
|
* separate state. */
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2010-03-08 21:49:16 -08:00
|
|
|
yylval.id = processquoted(yytext, yyleng);
|
|
|
|
PDEBUG("Found sub name: \"%s\"\n", yylval.id);
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_pop_state();
|
2006-04-11 21:52:54 +00:00
|
|
|
return TOK_ID;
|
|
|
|
}
|
|
|
|
|
|
|
|
[^\n] {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2006-04-11 21:52:54 +00:00
|
|
|
/* Something we didn't expect */
|
|
|
|
yyerror(_("Found unexpected character: '%s'"), yytext);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-05-22 20:11:03 +00:00
|
|
|
<SUB_NAME2>{
|
|
|
|
{ID}+ {
|
|
|
|
/* Ugh, this is a gross hack. I used to use
|
|
|
|
* {ID}+ to match all TOK_IDs, but that would
|
|
|
|
* also match TOK_MODE + TOK_END_OF_RULE
|
|
|
|
* without any spaces in between (because it's
|
|
|
|
* a longer match). So now, when I want to
|
|
|
|
* match any random string, I go into a
|
2009-07-24 11:56:07 +00:00
|
|
|
* separate state. */
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2010-03-08 21:49:16 -08:00
|
|
|
yylval.id = processunquoted(yytext, yyleng);
|
|
|
|
PDEBUG("Found sub name: \"%s\"\n", yylval.id);
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_pop_state();
|
2008-05-22 20:11:03 +00:00
|
|
|
return TOK_ID;
|
|
|
|
}
|
|
|
|
{QUOTED_ID} {
|
|
|
|
/* Ugh, this is a gross hack. I used to use
|
|
|
|
* {ID}+ to match all TOK_IDs, but that would
|
|
|
|
* also match TOK_MODE + TOK_END_OF_RULE
|
|
|
|
* without any spaces in between (because it's
|
|
|
|
* a longer match). So now, when I want to
|
|
|
|
* match any random string, I go into a
|
2009-07-24 11:56:07 +00:00
|
|
|
* separate state. */
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2010-03-08 21:49:16 -08:00
|
|
|
yylval.id = processquoted(yytext, yyleng);
|
|
|
|
PDEBUG("Found sub name: \"%s\"\n", yylval.id);
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_pop_state();
|
2008-05-22 20:11:03 +00:00
|
|
|
return TOK_ID;
|
|
|
|
}
|
|
|
|
|
2010-06-26 13:13:52 -07:00
|
|
|
{WS}+ { DUMP_PREPROCESS; /* Ignoring whitespace */ }
|
2008-05-22 20:11:03 +00:00
|
|
|
[^\n] {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2008-05-22 20:11:03 +00:00
|
|
|
/* Something we didn't expect */
|
|
|
|
yyerror(_("Found unexpected character: '%s'"), yytext);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-04-11 21:52:54 +00:00
|
|
|
<FLAGS_MODE>{
|
|
|
|
{FLAGOPEN_PAREN} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2006-04-11 21:52:54 +00:00
|
|
|
PDEBUG("FLag (\n");
|
|
|
|
return TOK_FLAG_OPENPAREN;
|
|
|
|
}
|
|
|
|
{FLAGCLOSE_PAREN} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2006-04-11 21:52:54 +00:00
|
|
|
PDEBUG("Flag )\n");
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_pop_state();
|
2006-04-11 21:52:54 +00:00
|
|
|
return TOK_FLAG_CLOSEPAREN;
|
|
|
|
}
|
|
|
|
|
2010-06-26 13:13:52 -07:00
|
|
|
{WS}+ { DUMP_PREPROCESS; /* Eat whitespace */ }
|
2006-04-11 21:52:54 +00:00
|
|
|
|
|
|
|
{FLAGSEP} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2006-04-11 21:52:54 +00:00
|
|
|
PDEBUG("Flag , \n");
|
|
|
|
return TOK_FLAG_SEP;
|
|
|
|
}
|
|
|
|
|
|
|
|
{EQUALS} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2006-04-11 21:52:54 +00:00
|
|
|
PDEBUG("Flag = \n");
|
|
|
|
return TOK_EQUALS;
|
|
|
|
}
|
|
|
|
{KEYWORD} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2010-03-08 21:49:16 -08:00
|
|
|
yylval.flag_id = strdup(yytext);
|
|
|
|
PDEBUG("Found flag: \"%s\"\n", yylval.flag_id);
|
2007-11-16 09:31:33 +00:00
|
|
|
return TOK_FLAG_ID;
|
2006-04-11 21:52:54 +00:00
|
|
|
}
|
|
|
|
|
2007-11-16 09:31:33 +00:00
|
|
|
[^\n] {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2006-04-11 21:52:54 +00:00
|
|
|
/* Something we didn't expect */
|
|
|
|
yyerror(_("Found unexpected character: '%s'"), yytext);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
<ASSIGN_MODE>{
|
2010-06-26 13:13:52 -07:00
|
|
|
{WS}+ { DUMP_PREPROCESS; /* Eat whitespace */ }
|
2006-04-11 21:52:54 +00:00
|
|
|
|
|
|
|
{ID}+ {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2010-03-08 21:49:16 -08:00
|
|
|
yylval.var_val = processunquoted(yytext, yyleng);
|
|
|
|
PDEBUG("Found assignment value: \"%s\"\n", yylval.var_val);
|
2006-04-11 21:52:54 +00:00
|
|
|
return TOK_VALUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
{QUOTED_ID} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2010-03-08 21:49:16 -08:00
|
|
|
yylval.var_val = processquoted(yytext, yyleng);
|
|
|
|
PDEBUG("Found assignment value: \"%s\"\n", yylval.var_val);
|
2006-04-11 21:52:54 +00:00
|
|
|
return TOK_VALUE;
|
|
|
|
}
|
|
|
|
|
2010-11-19 01:42:04 -08:00
|
|
|
{END_OF_RULE} {
|
|
|
|
DUMP_PREPROCESS;
|
|
|
|
yylval.id = strdup(yytext);
|
|
|
|
yyerror(_("Variable declarations do not accept trailing commas"));
|
|
|
|
}
|
|
|
|
|
2010-06-26 13:13:52 -07:00
|
|
|
\\\n { DUMP_PREPROCESS; current_lineno++ ; }
|
2006-04-11 21:52:54 +00:00
|
|
|
|
|
|
|
\r?\n {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2006-04-11 21:52:54 +00:00
|
|
|
current_lineno++;
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_pop_state();
|
2006-04-11 21:52:54 +00:00
|
|
|
}
|
2010-11-19 02:27:33 -08:00
|
|
|
[^\n] {
|
|
|
|
DUMP_PREPROCESS;
|
|
|
|
/* Something we didn't expect */
|
|
|
|
yyerror(_("Found unexpected character: '%s'"), yytext);
|
|
|
|
}
|
2006-04-11 21:52:54 +00:00
|
|
|
}
|
|
|
|
|
2007-07-27 20:29:47 +00:00
|
|
|
<NETWORK_MODE>{
|
2010-06-26 13:13:52 -07:00
|
|
|
{WS}+ { DUMP_PREPROCESS; /* Eat whitespace */ }
|
2007-07-27 20:29:47 +00:00
|
|
|
|
|
|
|
{ID}+ {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2010-03-08 21:49:16 -08:00
|
|
|
yylval.id = strdup(yytext);
|
2007-07-27 20:29:47 +00:00
|
|
|
return TOK_ID;
|
|
|
|
}
|
|
|
|
{END_OF_RULE} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_pop_state();
|
2007-07-27 20:29:47 +00:00
|
|
|
return TOK_END_OF_RULE;
|
|
|
|
}
|
|
|
|
[^\n] {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2007-07-27 20:29:47 +00:00
|
|
|
/* Something we didn't expect */
|
2010-03-08 21:49:16 -08:00
|
|
|
yylval.id = strdup(yytext);
|
|
|
|
yyerror(_("(network_mode) Found unexpected character: '%s'"), yylval.id);
|
2007-07-27 20:29:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
\r?\n {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2007-07-27 20:29:47 +00:00
|
|
|
current_lineno++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-07-23 21:18:37 +00:00
|
|
|
<CHANGE_PROFILE_MODE>{
|
|
|
|
{ARROW} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2010-03-08 21:49:16 -08:00
|
|
|
PDEBUG("Matched a change profile arrow\n");
|
2009-07-23 21:18:37 +00:00
|
|
|
return TOK_ARROW;
|
|
|
|
}
|
|
|
|
|
|
|
|
{ID}+ {
|
|
|
|
/* Ugh, this is a gross hack. I used to use
|
|
|
|
* {ID}+ to match all TOK_IDs, but that would
|
|
|
|
* also match TOK_MODE + TOK_END_OF_RULE
|
|
|
|
* without any spaces in between (because it's
|
|
|
|
* a longer match). So now, when I want to
|
|
|
|
* match any random string, I go into a
|
2009-07-24 11:56:07 +00:00
|
|
|
* separate state. */
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2010-03-08 21:49:16 -08:00
|
|
|
yylval.id = processunquoted(yytext, yyleng);
|
|
|
|
PDEBUG("Found change profile name: \"%s\"\n", yylval.id);
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_pop_state();
|
2009-07-23 21:18:37 +00:00
|
|
|
return TOK_ID;
|
|
|
|
}
|
|
|
|
{QUOTED_ID} {
|
|
|
|
/* Ugh, this is a gross hack. I used to use
|
|
|
|
* {ID}+ to match all TOK_IDs, but that would
|
|
|
|
* also match TOK_MODE + TOK_END_OF_RULE
|
|
|
|
* without any spaces in between (because it's
|
|
|
|
* a longer match). So now, when I want to
|
|
|
|
* match any random string, I go into a
|
2009-07-24 11:56:07 +00:00
|
|
|
* separate state. */
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2010-03-08 21:49:16 -08:00
|
|
|
yylval.id = processquoted(yytext, yyleng);
|
|
|
|
PDEBUG("Found change profile quoted name: \"%s\"\n", yylval.id);
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_pop_state();
|
2009-07-23 21:18:37 +00:00
|
|
|
return TOK_ID;
|
|
|
|
}
|
|
|
|
|
2010-06-26 13:13:52 -07:00
|
|
|
{WS}+ { DUMP_PREPROCESS; /* Ignoring whitespace */ }
|
2009-07-23 21:18:37 +00:00
|
|
|
[^\n] {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2009-07-23 21:18:37 +00:00
|
|
|
/* Something we didn't expect */
|
|
|
|
yyerror(_("Found unexpected character: '%s'"), yytext);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-04-06 18:55:46 +00:00
|
|
|
<RLIMIT_MODE>{
|
2010-06-26 13:13:52 -07:00
|
|
|
{WS}+ { DUMP_PREPROCESS; /* Eat whitespace */ }
|
2008-04-06 18:55:46 +00:00
|
|
|
|
|
|
|
|
Update apparmor's handling of rlimits for cpu limit and more natural units
Allow for rlimit cpu to specified which is now supported by the kernel.
Previously the rlimit units where limited to K, M, G and would fail when
KB, MB, GB where used. Allow for both, also allow for units on lengths
of time, by specifying "seconds", "minutes", "hours".. or any unique subset
eg. "s", "sec", "m", "min", "h", "hour" ..
NOTE:
This patch does not extend rlimits to be able to handle setting of tasks
that are confined by other profiles.
Signed-off-by: John Johansen <john.johansen@canonical.com>
2011-08-10 15:53:39 -07:00
|
|
|
-?{NUMBER}[[:alpha:]]* {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2010-03-08 21:49:16 -08:00
|
|
|
yylval.var_val = strdup(yytext);
|
2008-04-06 18:55:46 +00:00
|
|
|
return TOK_VALUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
{KEYWORD} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2010-03-08 21:49:16 -08:00
|
|
|
yylval.id = strdup(yytext);
|
2008-04-06 18:55:46 +00:00
|
|
|
if (strcmp(yytext, "infinity") == 0)
|
|
|
|
return TOK_VALUE;
|
|
|
|
return TOK_ID;
|
|
|
|
}
|
|
|
|
|
2010-06-26 13:13:52 -07:00
|
|
|
{LT_EQUAL} { DUMP_PREPROCESS; return TOK_LE; }
|
2008-04-06 18:55:46 +00:00
|
|
|
|
|
|
|
{END_OF_RULE} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_pop_state();
|
2008-04-06 18:55:46 +00:00
|
|
|
return TOK_END_OF_RULE;
|
|
|
|
}
|
|
|
|
|
|
|
|
\\\n {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2008-04-06 18:55:46 +00:00
|
|
|
current_lineno++;
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_pop_state();
|
2008-04-06 18:55:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
\r?\n {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2008-04-06 18:55:46 +00:00
|
|
|
current_lineno++;
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_pop_state();
|
2008-04-06 18:55:46 +00:00
|
|
|
}
|
|
|
|
}
|
2006-04-11 21:52:54 +00:00
|
|
|
|
2012-01-02 16:47:32 -08:00
|
|
|
#include/.*\r?\n { /* include */
|
|
|
|
PDEBUG("Matched #include\n");
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_push_state(INCLUDE);
|
2012-01-02 16:47:32 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
#.*\r?\n { /* normal comment */
|
|
|
|
DUMP_PREPROCESS;
|
|
|
|
PDEBUG("comment(%d): %s\n", current_lineno, yytext);
|
|
|
|
current_lineno++;
|
|
|
|
}
|
|
|
|
|
|
|
|
{END_OF_RULE} { DUMP_PREPROCESS; return TOK_END_OF_RULE; }
|
|
|
|
|
|
|
|
{SEPARATOR} {
|
|
|
|
DUMP_PREPROCESS;
|
|
|
|
PDEBUG("Matched a separator\n");
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_push_state(SUB_NAME);
|
2012-01-02 16:47:32 -08:00
|
|
|
return TOK_SEP;
|
|
|
|
}
|
|
|
|
{ARROW} {
|
|
|
|
DUMP_PREPROCESS;
|
|
|
|
PDEBUG("Matched a arrow\n");
|
|
|
|
return TOK_ARROW;
|
|
|
|
}
|
|
|
|
{EQUALS} {
|
|
|
|
DUMP_PREPROCESS;
|
|
|
|
PDEBUG("Matched equals for assignment\n");
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_push_state(ASSIGN_MODE);
|
2012-01-02 16:47:32 -08:00
|
|
|
return TOK_EQUALS;
|
|
|
|
}
|
|
|
|
{ADD_ASSIGN} {
|
|
|
|
DUMP_PREPROCESS;
|
|
|
|
PDEBUG("Matched additive value assignment\n");
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_push_state(ASSIGN_MODE);
|
2012-01-02 16:47:32 -08:00
|
|
|
return TOK_ADD_ASSIGN;
|
|
|
|
}
|
2006-04-11 21:52:54 +00:00
|
|
|
{SET_VARIABLE} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2010-03-08 21:49:16 -08:00
|
|
|
yylval.set_var = strdup(yytext);
|
|
|
|
PDEBUG("Found set variable %s\n", yylval.set_var);
|
2006-04-11 21:52:54 +00:00
|
|
|
return TOK_SET_VAR;
|
|
|
|
}
|
|
|
|
|
|
|
|
{BOOL_VARIABLE} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2010-03-08 21:49:16 -08:00
|
|
|
yylval.bool_var = strdup(yytext);
|
|
|
|
PDEBUG("Found boolean variable %s\n", yylval.bool_var);
|
2006-04-11 21:52:54 +00:00
|
|
|
return TOK_BOOL_VAR;
|
|
|
|
}
|
|
|
|
|
|
|
|
{OPEN_BRACE} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2006-04-11 21:52:54 +00:00
|
|
|
PDEBUG("Open Brace\n");
|
|
|
|
return TOK_OPEN;
|
|
|
|
}
|
|
|
|
{CLOSE_BRACE} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2006-04-11 21:52:54 +00:00
|
|
|
PDEBUG("Close Brace\n");
|
|
|
|
return TOK_CLOSE;
|
|
|
|
}
|
|
|
|
|
2010-03-08 21:49:16 -08:00
|
|
|
{PATHNAME} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2010-03-08 21:49:16 -08:00
|
|
|
yylval.id = processunquoted(yytext, yyleng);
|
|
|
|
PDEBUG("Found id: \"%s\"\n", yylval.id);
|
2006-04-11 21:52:54 +00:00
|
|
|
return TOK_ID;
|
|
|
|
}
|
|
|
|
|
2010-03-08 21:49:16 -08:00
|
|
|
{QPATHNAME} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2010-03-08 21:49:16 -08:00
|
|
|
yylval.id = processquoted(yytext, yyleng);
|
|
|
|
PDEBUG("Found id: \"%s\"\n", yylval.id);
|
2006-04-11 21:52:54 +00:00
|
|
|
return TOK_ID;
|
|
|
|
}
|
|
|
|
|
2007-07-27 20:38:43 +00:00
|
|
|
{MODES} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2010-03-08 21:49:16 -08:00
|
|
|
yylval.mode = strdup(yytext);
|
|
|
|
PDEBUG("Found modes: %s\n", yylval.mode);
|
2006-04-11 21:52:54 +00:00
|
|
|
return TOK_MODE;
|
|
|
|
}
|
|
|
|
|
2007-07-27 20:48:24 +00:00
|
|
|
{HAT} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_push_state(SUB_NAME2);
|
2007-07-27 20:48:24 +00:00
|
|
|
return TOK_HAT;
|
|
|
|
}
|
|
|
|
|
2007-11-16 09:18:48 +00:00
|
|
|
{COLON} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2007-11-16 09:18:48 +00:00
|
|
|
PDEBUG("Found a colon\n");
|
|
|
|
return TOK_COLON;
|
|
|
|
}
|
|
|
|
|
2007-11-16 09:31:33 +00:00
|
|
|
{FLAGOPEN_PAREN} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2007-11-16 09:31:33 +00:00
|
|
|
PDEBUG("FLag (\n");
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_push_state(FLAGS_MODE);
|
2007-11-16 09:31:33 +00:00
|
|
|
return TOK_FLAG_OPENPAREN;
|
|
|
|
}
|
|
|
|
|
2007-11-16 09:18:48 +00:00
|
|
|
{VARIABLE_NAME} {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
2006-04-11 21:52:54 +00:00
|
|
|
int token = get_keyword_token(yytext);
|
|
|
|
|
|
|
|
/* special cases */
|
|
|
|
switch (token) {
|
|
|
|
case -1:
|
|
|
|
/* no token found */
|
2010-03-08 21:49:16 -08:00
|
|
|
yylval.id = processunquoted(yytext, yyleng);
|
|
|
|
PDEBUG("Found (var) id: \"%s\"\n", yylval.id);
|
2007-11-16 09:18:48 +00:00
|
|
|
return TOK_ID;
|
2006-04-11 21:52:54 +00:00
|
|
|
break;
|
2008-05-22 09:16:46 +00:00
|
|
|
case TOK_PROFILE:
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_push_state(SUB_NAME2);
|
2008-05-22 09:16:46 +00:00
|
|
|
break;
|
2006-04-11 21:52:54 +00:00
|
|
|
case TOK_FLAGS:
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_push_state(FLAGS_MODE);
|
2006-04-11 21:52:54 +00:00
|
|
|
break;
|
2008-04-06 18:55:46 +00:00
|
|
|
case TOK_RLIMIT:
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_push_state(RLIMIT_MODE);
|
2008-04-06 18:55:46 +00:00
|
|
|
break;
|
2007-07-27 20:29:47 +00:00
|
|
|
case TOK_NETWORK:
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_push_state(NETWORK_MODE);
|
2007-07-27 20:29:47 +00:00
|
|
|
break;
|
2009-07-23 21:18:37 +00:00
|
|
|
case TOK_CHANGE_PROFILE:
|
2012-01-02 16:48:24 -08:00
|
|
|
yy_push_state(CHANGE_PROFILE_MODE);
|
2009-07-23 21:18:37 +00:00
|
|
|
break;
|
2006-04-11 21:52:54 +00:00
|
|
|
default: /* nothing */
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return token;
|
|
|
|
}
|
|
|
|
|
2010-06-26 13:13:52 -07:00
|
|
|
{WS}+ { DUMP_PREPROCESS; /* Ignoring whitespace */ }
|
2006-04-11 21:52:54 +00:00
|
|
|
|
2010-06-26 13:13:52 -07:00
|
|
|
\r?\n { DUMP_PREPROCESS; current_lineno++ ; }
|
2006-04-11 21:52:54 +00:00
|
|
|
|
|
|
|
[^\n] {
|
2010-06-26 13:13:52 -07:00
|
|
|
DUMP_PREPROCESS;
|
|
|
|
|
2006-04-11 21:52:54 +00:00
|
|
|
/* Something we didn't expect */
|
2008-05-29 18:58:18 +00:00
|
|
|
yyerror(_("Found unexpected character: '%s'"), yytext);
|
2006-04-11 21:52:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
%%
|