diff options
-rw-r--r-- | usr.sbin/config/Makefile | 2 | ||||
-rw-r--r-- | usr.sbin/config/config.h | 9 | ||||
-rw-r--r-- | usr.sbin/config/config.y | 24 | ||||
-rw-r--r-- | usr.sbin/config/lang.l | 8 | ||||
-rw-r--r-- | usr.sbin/config/main.c | 5 | ||||
-rw-r--r-- | usr.sbin/config/mkheaders.c | 6 | ||||
-rw-r--r-- | usr.sbin/config/mkmakefile.c | 30 | ||||
-rw-r--r-- | usr.sbin/config/mkoptions.c | 316 | ||||
-rw-r--r-- | usr.sbin/config/mkswapconf.c | 1 |
9 files changed, 393 insertions, 8 deletions
diff --git a/usr.sbin/config/Makefile b/usr.sbin/config/Makefile index 36e3d17..55f213e 100644 --- a/usr.sbin/config/Makefile +++ b/usr.sbin/config/Makefile @@ -3,7 +3,7 @@ PROG= config CFLAGS+=-I. -I${.CURDIR} SRCS= config.c main.c lang.c mkioconf.c mkmakefile.c mkglue.c mkheaders.c \ - mkswapconf.c + mkoptions.c mkswapconf.c MAN8= config.8 DPADD= ${LIBL} LDADD= -ll diff --git a/usr.sbin/config/config.h b/usr.sbin/config/config.h index c906e2b..41e492f 100644 --- a/usr.sbin/config/config.h +++ b/usr.sbin/config/config.h @@ -174,9 +174,16 @@ struct cputype { struct opt { char *op_name; char *op_value; + int op_ownfile; /* true = own file, false = makefile */ struct opt *op_next; } *opt, *mkopt; +struct opt_list { + char *o_name; + char *o_file; + struct opt_list *o_next; +} *otab; + char *ident; char *ns(); char *tc(); @@ -216,4 +223,6 @@ int debugging; int maxusers; u_int loadaddress; +extern int old_config_present; /* Old config/build directory still there */ + #define eq(a,b) (!strcmp(a,b)) diff --git a/usr.sbin/config/config.y b/usr.sbin/config/config.y index c161952..78d8bf4 100644 --- a/usr.sbin/config/config.y +++ b/usr.sbin/config/config.y @@ -9,6 +9,7 @@ %token ANY %token ARGS %token AT +%token AUTO %token BIO %token BUS %token COMMA @@ -37,6 +38,7 @@ %token MINUS %token NET %token NEXUS +%token NONE %token ON %token OPTIONS %token MAKEOPTIONS @@ -118,6 +120,7 @@ #include <ctype.h> #include <stdio.h> #include <err.h> +#include <string.h> struct device cur; struct device *curp = 0; @@ -183,6 +186,7 @@ Config_spec: = { struct cputype *cp = (struct cputype *)malloc(sizeof (struct cputype)); + memset(cp, 0, sizeof(*cp)); cp->cpu_name = ns($2); cp->cpu_next = cputype; cputype = cp; @@ -389,15 +393,23 @@ Option: Save_id = { struct opt *op = (struct opt *)malloc(sizeof (struct opt)); + char *s; + memset(op, 0, sizeof(*op)); op->op_name = ns($1); op->op_next = opt; op->op_value = 0; opt = op; + if (s = strchr(op->op_name, '=')) { + /* AARGH!!!! Old-style bogon */ + *s = '\0'; + op->op_value = ns(s + 1); + } free(temp_id); } | Save_id EQUALS Opt_value = { struct opt *op = (struct opt *)malloc(sizeof (struct opt)); + memset(op, 0, sizeof(*op)); op->op_name = ns($1); op->op_next = opt; op->op_value = ns($3); @@ -432,7 +444,9 @@ Mkoption: Save_id EQUALS Opt_value = { struct opt *op = (struct opt *)malloc(sizeof (struct opt)); + memset(op, 0, sizeof(*op)); op->op_name = ns($1); + op->op_ownfile = 0; /* for now */ op->op_next = mkopt; op->op_value = ns($3); mkopt = op; @@ -607,6 +621,10 @@ Info: = { cur.d_port = ns($2); } | PORT NUMBER = { cur.d_portn = $2; } | + PORT AUTO + = { cur.d_portn = -1; } | + PORT NONE + = { cur.d_portn = -2; } | TTY = { cur.d_mask = "tty"; } | BIO @@ -630,11 +648,13 @@ Id_list: Save_id = { struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst)); + memset(a, 0, sizeof(*a)); a->id = $1; a->id_next = 0; $$ = a; } | Save_id Id_list = { struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst)); + memset(a, 0, sizeof(*a)); a->id = $1; a->id_next = $2; $$ = a; }; @@ -670,6 +690,7 @@ newdev(dp) register struct device *np; np = (struct device *) malloc(sizeof *np); + memset(np, 0, sizeof(*np)); *np = *dp; np->d_next = 0; if (curp == 0) @@ -688,6 +709,7 @@ mkconf(sysname) register struct file_list *fl, **flp; fl = (struct file_list *) malloc(sizeof *fl); + memset(fl, 0, sizeof(*fl)); fl->f_type = SYSTEMSPEC; fl->f_needs = sysname; fl->f_rootdev = NODEV; @@ -705,6 +727,7 @@ newflist(ftype) u_char ftype; { struct file_list *fl = (struct file_list *)malloc(sizeof (*fl)); + memset(fl, 0, sizeof(*fl)); fl->f_type = ftype; fl->f_next = 0; @@ -763,6 +786,7 @@ mkcomp(dp) char buf[80]; fl = (struct file_list *) malloc(sizeof *fl); + memset(fl, 0, sizeof(*fl)); fl->f_type = COMPDEVICE; fl->f_compinfo = dp->d_unit; fl->f_fn = ns(dp->d_name); diff --git a/usr.sbin/config/lang.l b/usr.sbin/config/lang.l index 84fdf70..3d80f5d 100644 --- a/usr.sbin/config/lang.l +++ b/usr.sbin/config/lang.l @@ -52,6 +52,7 @@ struct kt { { "and", AND }, { "args", ARGS }, { "at", AT }, + { "auto", AUTO }, #if MACHINE_I386 { "bio", BIO }, { "bus", BUS }, @@ -86,6 +87,7 @@ struct kt { { "net", NET }, #endif MACHINE_I386 { "nexus", NEXUS }, + { "none", NONE }, { "on", ON }, { "options", OPTIONS }, #if MACHINE_I386 @@ -126,6 +128,12 @@ WORD [A-Za-z_][-A-Za-z_]* tprintf("(%s) ", yytext); return i; } +\\\"[^"]+\\\" { + yytext[strlen(yytext)-2] = '"'; + yytext[strlen(yytext)-1] = '\0'; + yylval.str = strdup(yytext + 1); + return ID; + } \"[^"]+\" { yytext[strlen(yytext)-1] = '\0'; yylval.str = strdup(yytext + 1); diff --git a/usr.sbin/config/main.c b/usr.sbin/config/main.c index 98d9bf7..3369504 100644 --- a/usr.sbin/config/main.c +++ b/usr.sbin/config/main.c @@ -59,6 +59,7 @@ static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/6/93"; static char *PREFIX; static int no_config_clobber = FALSE; +int old_config_present; /* * Config builds a set of files for building a UNIX @@ -135,6 +136,9 @@ usage: fputs("usage: config [-gpn] sysname\n", stderr); } } #endif + else + old_config_present++; + loadaddress = -1; dtab = NULL; confp = &conf_list; @@ -188,6 +192,7 @@ usage: fputs("usage: config [-gpn] sysname\n", stderr); (void) sprintf(xxx, "../../%s/include", machinename); (void) symlink(xxx, path("machine")); } + options(); /* make options .h files */ makefile(); /* build Makefile */ headers(); /* make a lot of .h files */ swapconf(); /* swap config files */ diff --git a/usr.sbin/config/mkheaders.c b/usr.sbin/config/mkheaders.c index 7929987..bfa5692 100644 --- a/usr.sbin/config/mkheaders.c +++ b/usr.sbin/config/mkheaders.c @@ -140,7 +140,7 @@ do_header(dev, hname, count) break; fl = (struct file_list *) malloc(sizeof *fl); bzero(fl, sizeof(*fl)); - fl->f_fn = inw; + fl->f_fn = inw; /* malloced */ fl->f_type = inc; fl->f_next = fl_head; fl_head = fl; @@ -149,6 +149,7 @@ do_header(dev, hname, count) if (count == oldcount) { for (fl = fl_head; fl != NULL; fl = tflp) { tflp = fl->f_next; + free(fl->f_fn); free(fl); } return; @@ -156,7 +157,7 @@ do_header(dev, hname, count) if (oldcount == -1) { fl = (struct file_list *) malloc(sizeof *fl); bzero(fl, sizeof(*fl)); - fl->f_fn = name; + fl->f_fn = ns(name); /* malloced */ fl->f_type = count; fl->f_next = fl_head; fl_head = fl; @@ -170,6 +171,7 @@ do_header(dev, hname, count) fprintf(outf, "#define %s %u\n", fl->f_fn, count ? fl->f_type : 0); tflp = fl->f_next; + free(fl->f_fn); free(fl); } (void) fclose(outf); diff --git a/usr.sbin/config/mkmakefile.c b/usr.sbin/config/mkmakefile.c index 1a347e8..8f6ca3a 100644 --- a/usr.sbin/config/mkmakefile.c +++ b/usr.sbin/config/mkmakefile.c @@ -63,6 +63,7 @@ static char sccsid[] = "@(#)mkmakefile.c 8.1 (Berkeley) 6/6/93"; static struct file_list *fcur; char *tail(); +extern int old_config_present; /* * Lookup a file, by name. @@ -139,6 +140,7 @@ makefile() char line[BUFSIZ]; struct opt *op; struct users *up; + int warn_make_clean = 0; read_files(); strcpy(line, "Makefile."); @@ -157,19 +159,27 @@ makefile() fprintf(ofp, "IDENT="); if (profiling) fprintf(ofp, " -DGPROF"); + if (cputype == 0) { printf("cpu type must be specified\n"); exit(1); } +#if 0 + /* XXX: moved to cputype.h */ { struct cputype *cp; for (cp = cputype; cp; cp = cp->cpu_next) fprintf(ofp, " -D%s", cp->cpu_name); } - for (op = opt; op; op = op->op_next) - if (op->op_value) - fprintf(ofp, " -D%s=\"%s\"", op->op_name, op->op_value); - else - fprintf(ofp, " -D%s", op->op_name); +#endif + for (op = opt; op; op = op->op_next) { + if (!op->op_ownfile) { + warn_make_clean++; + if (op->op_value) + fprintf(ofp, " -D%s=%s", op->op_name, op->op_value); + else + fprintf(ofp, " -D%s", op->op_name); + } + } fprintf(ofp, "\n"); if ((unsigned)machine > NUSERS) { printf("maxusers config info isn't present, using vax\n"); @@ -220,6 +230,15 @@ makefile() } (void) fclose(ifp); (void) fclose(ofp); +#ifdef notyet + if (warn_make_clean) { + printf("WARNING: Unknown options used (not in ../../conf/options or ./options.%s).\n", machinename); + if (old_config_present) { + printf("It is VERY important that you do a ``make clean'' before recompiling!\n"); + } + } + printf("Don't forget to do a ``make depend''\n"); +#endif } /* @@ -395,6 +414,7 @@ nextparam: } if (std) { dp = (struct device *) malloc(sizeof *dp); + bzero(dp, sizeof *dp); init_dev(dp); dp->d_name = ns(wd); dp->d_type = PSEUDO_DEVICE; diff --git a/usr.sbin/config/mkoptions.c b/usr.sbin/config/mkoptions.c new file mode 100644 index 0000000..f722d93 --- /dev/null +++ b/usr.sbin/config/mkoptions.c @@ -0,0 +1,316 @@ +/* + * Copyright (c) 1995 Peter Wemm + * Copyright (c) 1980, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)mkheaders.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +/* + * Make all the .h files for the optional entries + */ + +#include <stdio.h> +#include <ctype.h> +#include "config.h" +#include "y.tab.h" + +options() +{ + struct opt_list *ol; + + /* fake the cpu types as options */ + /* Please forgive me for this hack.. :-) */ + struct opt *op; + struct cputype *cp; + + for (cp = cputype; cp; cp = cp->cpu_next) { + struct opt *op = (struct opt *)malloc(sizeof (struct opt)); + memset(op, 0, sizeof(*op)); + op->op_name = cp->cpu_name; + op->op_value = 0; + op->op_next = opt; + opt = op; + } + + read_options(); + for (ol = otab; ol != 0; ol = ol->o_next) + do_option(ol->o_name); +} + +/* + * Generate an <options>.h file + */ + +do_option(name) + char *name; +{ + char *file, *inw, *tooption(); + struct opt *op, *op_head, *topp; + FILE *inf, *outf; + char *value; + char *oldvalue; + int seen; + + file = tooption(name); + + /* + * Check to see if the option was specified.. + */ + value = NULL; + for (op = opt; op; op = op->op_next) { + if (eq(name, op->op_name)) { + value = op->op_value; + if (!value) + value = ns("1"); + op->op_ownfile++; + } + } + + inf = fopen(file, "r"); + if (inf == 0) { + outf = fopen(file, "w"); + if (outf == 0) { + perror(file); + exit(1); + } + + /* was the option in the config file? */ + if (value) { + fprintf(outf, "#define %s %s\n", name, value); + } /* else empty file */ + + (void) fclose(outf); + return; + } + oldvalue = NULL; + op_head = NULL; + seen = 0; + for (;;) { + char *cp; + char *invalue; + + /* get the #define */ + if ((inw = get_word(inf)) == 0 || inw == (char *)EOF) + break; + /* get the option name */ + if ((inw = get_word(inf)) == 0 || inw == (char *)EOF) + break; + inw = ns(inw); + cp = get_word(inf); + if (cp == 0 || cp == (char *)EOF) + break; + /* option value */ + invalue = ns(cp); /* malloced */ + if (eq(inw, name)) { + oldvalue = invalue; + invalue = value; + seen++; + } + op = (struct opt *) malloc(sizeof *op); + bzero(op, sizeof(*op)); + op->op_name = inw; + op->op_value = invalue; + op->op_next = op_head; + op_head = op; + + /* EOL? */ + cp = get_word(inf); + if (cp == (char *)EOF) + break; + } + (void) fclose(inf); + if ((value == NULL && oldvalue == NULL) || + (value && oldvalue && eq(value,oldvalue))) { + for (op = op_head; op != NULL; op = topp) { + topp = op->op_next; + free(op->op_name); + free(op->op_value); + free(op); + } + return; + } + + if (value && !seen) { + /* New option appears */ + op = (struct opt *) malloc(sizeof *op); + bzero(op, sizeof(*op)); + op->op_name = ns(name); + op->op_value = value ? ns(value) : NULL; + op->op_next = op_head; + op_head = op; + } + + outf = fopen(file, "w"); + if (outf == 0) { + perror(file); + exit(1); + } + for (op = op_head; op != NULL; op = topp) { + /* was the option in the config file? */ + if (op->op_value) { + fprintf(outf, "#define %s %s\n", + op->op_name, op->op_value); + } + topp = op->op_next; + free(op->op_name); + free(op->op_value); + free(op); + } + (void) fclose(outf); +} + +/* + * Find the filename to store the option spec into. + */ +char * +tooption(name) + char *name; +{ + static char hbuf[80]; + char nbuf[80]; + struct opt_list *po; + + /* "cannot happen"? the otab list should be complete.. */ + (void) strcpy(nbuf, "options.h"); + + for (po = otab ; po != 0; po = po->o_next) { + if (eq(po->o_name, name)) { + strcpy(nbuf, po->o_file); + break; + } + } + + (void) strcpy(hbuf, path(nbuf)); + return (hbuf); +} + +/* + * read the options and options.<machine> files + */ +read_options() +{ + FILE *fp; + char fname[32]; + char *wd, *this, *val; + struct opt_list *po; + int first = 1; + char genopt[80]; + char *lower(); + + otab = 0; + (void) strcpy(fname, "../../conf/options"); +openit: + fp = fopen(fname, "r"); + if (fp == 0) { + return; + } + if(ident == NULL) { + printf("no ident line specified\n"); + exit(1); + } +next: + wd = get_word(fp); + if (wd == (char *)EOF) { + (void) fclose(fp); + if (first == 1) { + (void) sprintf(fname, "options.%s", machinename); + first++; + goto openit; + } + if (first == 2) { + (void) sprintf(fname, "options.%s", raise(ident)); + first++; + fp = fopen(fname, "r"); + if (fp != 0) + goto next; + } + return; + } + if (wd == 0) + goto next; + /*************************************************\ + * If it's a comment ignore to the end of the line * + \*************************************************/ + if(wd[0] == '#') + { + while( ((wd = get_word(fp)) != (char *)EOF) && wd) + ; + goto next; + } + this = ns(wd); + val = get_word(fp); + if (val == (char *)EOF) + return; + if (val == 0) { + char *s = ns(this); + (void) strcpy(genopt, "opt_"); + (void) strcat(genopt, lower(s)); + (void) strcat(genopt, ".h"); + val = genopt; + free(s); + } + val = ns(val); + + for (po = otab ; po != 0; po = po->o_next) { + if (eq(po->o_name, this)) { + printf("%s: Duplicate option %s.\n", + fname, this); + exit(1); + } + } + + po = (struct opt_list *) malloc(sizeof *po); + bzero(po, sizeof(*po)); + po->o_name = this; + po->o_file = val; + po->o_next = otab; + otab = po; + + goto next; +} + +char * +lower(str) + register char *str; +{ + register char *cp = str; + + while (*str) { + if (isupper(*str)) + *str = tolower(*str); + str++; + } + return (cp); +} + diff --git a/usr.sbin/config/mkswapconf.c b/usr.sbin/config/mkswapconf.c index 9722d9c..39d964b 100644 --- a/usr.sbin/config/mkswapconf.c +++ b/usr.sbin/config/mkswapconf.c @@ -245,6 +245,7 @@ initdevtable() if (sscanf(linebuf, "%s\t%d\n", buf, &maj) == 2) { *dp = (struct devdescription *)malloc(sizeof (**dp)); + memset(*dp, 0, sizeof(**dp)); (*dp)->dev_name = ns(buf); (*dp)->dev_major = maj; dp = &(*dp)->dev_next; |