Date: Wed, 04 Jul 2001 22:37:36 -0700 From: Dima Dorfman <dima@unixfreak.org> To: audit@freebsd.org, peter@freebsd.org Subject: Re: config(8) 'include' patch Message-ID: <20010705053736.EE5383E28@bazooka.unixfreak.org>
next in thread | raw e-mail | index | archive | help
Anybody care to review this? Anybody at all? Dima Dorfman <dima@hornet.unixfreak.org> writes: > The attached patch, mostly ported from OpenBSD, adds an 'include' > directive to config(8). As discussed on -hackers, this can be used to > split up kernel config files into a machine-dependent and > machine-independent parts. In relation to this, some people also > asked for unoption/undevice directives; it looks like those would be > easy to implement, but I'd like to commit this first since these > changes ('include' vs. 'unoption') are technically unrelated. > > Please review and comment. > > Thanks, > > Dima Dorfman > dima@unixfreak.org > > > Index: config.h > =================================================================== > RCS file: /stl/src/FreeBSD/src/usr.sbin/config/config.h,v > retrieving revision 1.48 > diff -u -r1.48 config.h > --- config.h 2001/02/28 02:55:15 1.48 > +++ config.h 2001/06/28 05:51:11 > @@ -142,6 +142,7 @@ > > extern char errbuf[80]; > extern int yyline; > +extern const char *yyfile; > > extern struct file_list *ftab; > > Index: config.y > =================================================================== > RCS file: /stl/src/FreeBSD/src/usr.sbin/config/config.y,v > retrieving revision 1.54 > diff -u -r1.54 config.y > --- config.y 2001/02/22 04:00:29 1.54 > +++ config.y 2001/06/28 05:51:11 > @@ -17,6 +17,7 @@ > %token OPTIONS > %token MAKEOPTIONS > %token SEMICOLON > +%token INCLUDE > > %token <str> ID > %token <val> NUMBER > @@ -77,14 +78,15 @@ > char *hints; > int hintmode; int yyline; > +const char *yyfile; > struct file_list *ftab; > char errbuf[80]; > int maxusers; > > #define ns(s) strdup(s) > +int include(const char *, int); > +void yyerror(const char *s); > > -static void yyerror(const char *s); > - > static char * > devopt(char *dev) > { > @@ -147,11 +149,14 @@ > = { > hints = $2; > hintmode = 1; > - }; > + } | > + INCLUDE ID > + = { include($2, 0); }; > > System_spec: > CONFIG System_id System_parameter_list > - = { errx(1, "line %d: root/dump/swap specifications obsolete", yyline > );} > + = { errx(1, "%s:%d: root/dump/swap specifications obsolete", > + yyfile, yyline);} > | > CONFIG System_id > ; > @@ -178,7 +183,8 @@ > > newopt(&opt, $1, NULL); > if ((s = strchr($1, '='))) > - errx(1, "line %d: The `=' in options should not be quot > ed", yyline); > + errx(1, "%s:%d: The `=' in options should not be " > + "quoted", yyfile, yyline); > } | > Save_id EQUALS Opt_value > = { > @@ -229,16 +235,17 @@ > /* and the device part */ > newdev($2, $3); > if ($3 == 0) > - errx(1, "line %d: devices with zero units are not likel > y to be correct", yyline); > + errx(1, "%s:%d: devices with zero units are not " > + "likely to be correct", yyfile, yyline); > } ; > > %% > > -static void > +void > yyerror(const char *s) > { > > - errx(1, "line %d: %s", yyline + 1, s); > + errx(1, "%s:%d: %s", yyfile, yyline + 1, s); > } > > /* > Index: lang.l > =================================================================== > RCS file: /stl/src/FreeBSD/src/usr.sbin/config/lang.l,v > retrieving revision 1.30 > diff -u -r1.30 lang.l > --- lang.l 2001/02/19 04:43:21 1.30 > +++ lang.l 2001/06/28 05:51:11 > @@ -35,6 +35,7 @@ > * $FreeBSD: src/usr.sbin/config/lang.l,v 1.30 2001/02/19 04:43:21 peter Exp > $ > */ > > +#include <assert.h> > #include <ctype.h> > #include <string.h> > #include "y.tab.h" > @@ -43,6 +44,19 @@ > #define YY_NO_UNPUT > > /* > + * Data for returning to previous files from include files. > + */ > +struct incl { > + struct incl *in_prev; /* previous includes in effect, if any */ > + YY_BUFFER_STATE in_buf; /* previous lex state */ > + const char *in_fname; /* previous file name */ > + int in_lineno; /* previous line number */ > + int in_ateof; /* token to insert at EOF */ > +}; > +static struct incl *inclp; > +static const char *lastfile; > + > +/* > * Key word table > */ > > @@ -61,13 +75,17 @@ > { "profile", PROFILE }, > { "option", OPTIONS }, > { "options", OPTIONS }, > + { "include", INCLUDE }, > { 0, 0 }, > }; > > > +static int endinclude(void); > +int include(const char *, int); > int kw_lookup(char *); > int octal(char *); > int hex(char *); > +int yyerror(const char *); > > %} > WORD [A-Za-z_][-A-Za-z_]* > @@ -145,6 +163,16 @@ > ";" { return SEMICOLON; } > "," { return COMMA; } > "=" { BEGIN TOEOL; return EQUALS; } > +<<EOF>> { > + int tok; > + > + if (inclp == NULL) > + return YY_NULL; > + tok = endinclude(); > + if (tok != 0) > + return tok; > + /* otherwise continue scanning */ > + } > . { return yytext[0]; } > > %% > @@ -185,4 +213,61 @@ > > (void) sscanf(str+2, "%x", &num); > return num; > +} > + > + > +/* > + * Open the named file for inclusion at the current point. Returns 0 on > + * success (file opened and previous state pushed), nonzero on failure > + * (fopen failed, complaint made). The `ateof' parameter controls the > + * token to be inserted at the end of the include file. If ateof == 0, > + * then nothing is inserted. > + */ > +int > +include(const char *fname, int ateof) > +{ > + FILE *fp; > + struct incl *in; > + > + fp = fopen(fname, "r"); > + if (fp == NULL) { > + yyerror("cannot open file"); > + return (-1); > + } > + in = malloc(sizeof(*in)); > + assert(in != NULL); > + in->in_prev = inclp; > + in->in_buf = YY_CURRENT_BUFFER; > + in->in_fname = yyfile; > + in->in_lineno = yyline; > + in->in_ateof = ateof; > + inclp = in; > + yy_switch_to_buffer(yy_create_buffer(fp, YY_BUF_SIZE)); > + yyfile = fname; > + yyline = 0; > + return (0); > +} > + > +/* > + * Terminate the most recent inclusion. > + */ > +static int > +endinclude() > +{ > + struct incl *in; > + int ateof; > + > + in = inclp; > + assert(in != NULL); > + inclp = in->in_prev; > + lastfile = yyfile; > + yy_delete_buffer(YY_CURRENT_BUFFER); > + (void)fclose(yyin); > + yy_switch_to_buffer(in->in_buf); > + yyfile = in->in_fname; > + yyline = in->in_lineno; > + ateof = in->in_ateof; > + free(in); > + > + return (ateof); > } > Index: main.c > =================================================================== > RCS file: /stl/src/FreeBSD/src/usr.sbin/config/main.c,v > retrieving revision 1.50 > diff -u -r1.50 main.c > --- main.c 2001/02/23 00:22:04 1.50 > +++ main.c 2001/06/28 05:51:11 > @@ -144,6 +144,7 @@ > errx(2, "%s isn't a directory", p); > > dtab = NULL; > + yyfile = *argv; > if (yyparse()) > exit(3); > if (machinename == NULL) { To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-audit" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010705053736.EE5383E28>