------------------------------------------------------------ revno: 11141 revision-id: [EMAIL PROTECTED] parent: svn-v2:[EMAIL PROTECTED] committer: Jelmer Vernooij <[EMAIL PROTECTED]> branch nick: 4.0-regwrite timestamp: Sat 2007-01-13 20:50:19 +0100 message: Initial work on .adm file parser by Wilco Baan Hofman <[EMAIL PROTECTED]> and me. added: source/lib/policy/ policy-20070113165253-mfj7irct13ujxegu-1 source/lib/policy/config.mk config.mk-20070113165302-5amgbz764f0myhw9-1 source/lib/policy/dumpadm.c dumpadm.c-20070113165302-5amgbz764f0myhw9-2 source/lib/policy/lex.l lex.l-20070113165302-5amgbz764f0myhw9-3 source/lib/policy/parse_adm.y parse_adm.y-20070113165302-5amgbz764f0myhw9-4 modified: source/lib/basic.mk svn-v2:[EMAIL PROTECTED] source/script/lex_compile.sh svn-v2:[EMAIL PROTECTED] === added directory 'source/lib/policy' === added file 'source/lib/policy/config.mk' --- a/source/lib/policy/config.mk 1970-01-01 00:00:00 +0000 +++ b/source/lib/policy/config.mk 2007-01-13 19:50:19 +0000 @@ -0,0 +1,11 @@ +[LIBRARY::LIBPOLICY] +CFLAGS = -Iheimdal/lib/roken +OBJ_FILES = lex.o parse_adm.o + +lib/policy/lex.c: lib/policy/lex.l + @echo "Building $< with $(LEX)" + @-$(srcdir)/script/lex_compile.sh "$(LEX)" "$<" "$@" -i + +[BINARY::dumpadm] +OBJ_FILES = dumpadm.o +PRIVATE_DEPENDENCIES = LIBPOLICY
=== added file 'source/lib/policy/dumpadm.c' --- a/source/lib/policy/dumpadm.c 1970-01-01 00:00:00 +0000 +++ b/source/lib/policy/dumpadm.c 2007-01-13 19:50:19 +0000 @@ -0,0 +1,35 @@ +/* + Unix SMB/CIFS implementation. + Copyright (C) 2006 Wilco Baan Hofman <[EMAIL PROTECTED]> + Copyright (C) 2006 Jelmer Vernooij <[EMAIL PROTECTED]> + + 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 2 of the License, 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. +*/ + +#include "includes.h" +#include "lib/policy/parse_adm.h" + +extern FILE *yyin; + +extern void yyparse(void); + +int main(int argc, char **argv) +{ + yyin = fopen("foo.adm", "r"); + if (yyin == NULL) + return -1; + + yyparse(); +} === added file 'source/lib/policy/lex.l' --- a/source/lib/policy/lex.l 1970-01-01 00:00:00 +0000 +++ b/source/lib/policy/lex.l 2007-01-13 19:50:19 +0000 @@ -0,0 +1,143 @@ +/* + Unix SMB/CIFS implementation. + Copyright (C) 2006 Wilco Baan Hofman <[EMAIL PROTECTED]> + Copyright (C) 2006 Jelmer Vernooij <[EMAIL PROTECTED]> + + 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 2 of the License, 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. +*/ + + +%{ +#include "includes.h" +#include "lib/policy/parse_adm.h" +#include "lex.h" +void error_message (const char *format, ...); +int yyparse (void); + +static int lineno = 1; +static bool utf16 = false; + +#define YY_INPUT(buf,result,max_size) \ +{ \ + if (utf16) { \ + uint16_t v; \ + if (fread(&v, 2, 1, yyin) < 1) \ + result = YY_NULL; \ + else \ + result = push_codepoint(buf, v); \ + } else { \ + int c = getc(yyin); \ + result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \ + } \ +} + +%} + +%% + +ACTIONLIST { return ACTIONLIST; } +CATEGORY { return CATEGORY; } +CHECKBOX { return CHECKBOX; } +CLASS { return CLASS; } +DELETE { return DEL; } +DEFAULT { return DEFAULT; } +DROPDOWNLIST { return DROPDOWNLIST; } +EDITTEXT { return EDITTEXT; } +END { return END; } +EXPLAIN { return EXPLAIN; } +ITEMLIST { return ITEMLIST; } +KEYNAME { return KEYNAME; } +MACHINE { return MACHINE; } +MIN { return MINIMUM; } +MAX { return MAXIMUM; } +NAME { return NAME; } +NUMERIC { return NUMERIC; } +PART { return PART; } +POLICY { return POLICY; } +REQUIRED { return REQUIRED; } +SPIN { return SPIN; } +SUPPORTED { return SUPPORTED; } +TEXT { return TEXT; } +USER { return USER; } +VALUE { return VALUE; } +VALUENAME { return VALUENAME; } +VALUEON { return VALUEON; } +VALUEOFF { return VALUEOFF; } += { return EQUALS; } +\[strings\] { return STRINGSSECTION; } + +[0-9]+ { + char *e, *y = yytext; + yylval.integer = strtol((const char *)yytext, &e, 0); + if(e == y) + error_message("malformed constant (%s)", yytext); + else + return INTEGER; + } + +[A-Za-z\\{}][{}\-\\A-Za-z0-9_]* { + yylval.text = strdup ((const char *)yytext); + return LITERAL; + } + +"!!"[A-Za-z][-A-Za-z0-9_]* { + yylval.text = strdup ((const char *)yytext); + return LOOKUPLITERAL; + } +[ \t]+ +\n { lineno++; } +;[^\n]*\n { lineno++; } +\"([^\n]+)\n { lineno++; yylval.text = strdup((const char *)yytext); return LITERAL; } +%% + +#ifndef yywrap /* XXX */ +int +yywrap () +{ + return 1; +} +#endif + + +void +error_message (const char *format, ...) +{ + va_list args; + + va_start (args, format); + fprintf (stderr, "%d:", lineno); + vfprintf (stderr, format, args); + va_end (args); +} + +struct adm_file *adm_read_file(const char *file) +{ + uint8_t c[2]; + yyin = fopen(file, "r"); + if (yyin == NULL) + return NULL; + + c[0] = getc(yyin); + c[1] = getc(yyin); + if (c[0] == 0xff && c[1] == 0xfe) { + utf16 = true; + } else { + rewind(yyin); + } + + yyparse(); + + return NULL; /* FIXME */ +} === added file 'source/lib/policy/parse_adm.y' --- a/source/lib/policy/parse_adm.y 1970-01-01 00:00:00 +0000 +++ b/source/lib/policy/parse_adm.y 2007-01-13 19:50:19 +0000 @@ -0,0 +1,136 @@ +/* + Unix SMB/CIFS implementation. + Copyright (C) 2006 Wilco Baan Hofman <[EMAIL PROTECTED]> + Copyright (C) 2006 Jelmer Vernooij <[EMAIL PROTECTED]> + + 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 2 of the License, 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. +*/ + +%{ +#include "config.h" +#include "lex.h" + +void yyerror (const char *s); + +%} + +%union { + char *text; + int integer; +} + +%token CATEGORY +%token CLASS +%token USER +%token MACHINE +%token POLICY +%token KEYNAME +%token EXPLAIN +%token VALUENAME +%token VALUEON VALUEOFF +%token PART +%token ITEMLIST +%token NAME +%token VALUE +%token NUMERIC EDITTEXT TEXT DROPDOWNLIST CHECKBOX +%token MIN MAX DEFAULT +%token END +%token ACTIONLIST +%token DELETE +%token SUPPORTED +%token <text> LITERAL +%token <integer> INTEGER +%token <text> LOOKUPLITERAL +%token CLIENTEXT +%token REQUIRED +%token NOSORT +%token SPIN +%token EQUALS +%token STRINGSSECTION + +%start admfile + +%% + +admfile: classes strings; + +classes: /* empty */ | class classes; + +class: CLASS classvalue categories; +classvalue: USER|MACHINE; + +categories: /* empty */ | category categories; + +string: LITERAL | LOOKUPLITERAL; + +category: CATEGORY string categoryitems END CATEGORY; + +categoryitem: explain | category | policy | keyname; +categoryitems: categoryitem categoryitems | /* empty */ ; + +policy: POLICY string policyitems END POLICY; + +policyitems: part policyitems | definition policyitems | /* empty */; + +definition: keyname | valuename | valueon | valueoff | explain | min | max | defaultvalue | supported; + +valuetype: NUMERIC | EDITTEXT | TEXT | DROPDOWNLIST | CHECKBOX; + +part: PART string valuetype partitems END PART; + +spin: SPIN INTEGER; + +partitem: definition | itemlist | REQUIRED | spin; +partitems: partitem partitems | /* empty */; + +min: MIN INTEGER; +max: MAX INTEGER; +defaultvalue: DEFAULT INTEGER; + +explain: EXPLAIN string; +value: NUMERIC INTEGER | DELETE; + +valueon: VALUEON value; +valueoff: VALUEOFF value; + +valuename: VALUENAME string; +keyname: KEYNAME string; + +itemlist: ITEMLIST items END ITEMLIST; +itemname: NAME string; +itemvalue: VALUE value; + +item: itemname | itemvalue | DEFAULT | actionlist; +items: /* empty */ | item items; + +supported: SUPPORTED string; + +actionlist: ACTIONLIST actions END ACTIONLIST; +actions: valuename actions | /* empty */; + +variable: LITERAL EQUALS LITERAL; +variables: variable variables | /* empty */; +strings: STRINGSSECTION variables; + +%% + +void +yyerror (const char *s) +{ + error_message ("%s\n", s); +} + + + === modified file 'source/lib/basic.mk' --- a/source/lib/basic.mk 2006-10-25 14:58:05 +0000 +++ b/source/lib/basic.mk 2007-01-13 19:50:19 +0000 @@ -7,6 +7,7 @@ include tdb/config.mk include tls/config.mk include registry/config.mk +include policy/config.mk include messaging/config.mk include events/config.mk include cmdline/config.mk === modified file 'source/script/lex_compile.sh' --- a/source/script/lex_compile.sh 2006-09-10 10:02:10 +0000 +++ b/source/script/lex_compile.sh 2007-01-13 19:50:19 +0000 @@ -3,6 +3,8 @@ LEX="$1" SRC="$2" DEST="$3" +shift 3 +ARGS="$*" dir=`dirname $SRC` file=`basename $SRC` @@ -17,12 +19,15 @@ fi fi TOP=`pwd` -if cd $dir && $LEX $file; then +if cd $dir && $LEX $ARGS $file; then if [ -r $base.yy.c ];then # we must guarantee that config.h comes first echo "#include \"config.h\"" > $base.c sed '/^#/ s|$base.yy\.c|$DEST|' $base.yy.c >> $base.c rm -f $base.yy.c + elif [ ! -r base.c ]; then + echo "$base.c nor $base.yy.c generated." + exit 1 fi fi cd $TOP