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>
