Module Name: src Committed By: pgoyette Date: Tue Sep 1 01:50:14 UTC 2015
Modified Files: src/usr.bin/config: config.5 main.c Log Message: Allow redefinition of options (with only a warning message). Removal of non-included options was already only a warning. This also affects redefinition and removal of file-system and makeoption entries. Reviewed and OKd by uebayasi@ To generate a diff of this commit: cvs rdiff -u -r1.32 -r1.33 src/usr.bin/config/config.5 cvs rdiff -u -r1.81 -r1.82 src/usr.bin/config/main.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/config/config.5 diff -u src/usr.bin/config/config.5:1.32 src/usr.bin/config/config.5:1.33 --- src/usr.bin/config/config.5:1.32 Mon Aug 31 12:00:12 2015 +++ src/usr.bin/config/config.5 Tue Sep 1 01:50:14 2015 @@ -1,4 +1,4 @@ -.\" $NetBSD: config.5,v 1.32 2015/08/31 12:00:12 pgoyette Exp $ +.\" $NetBSD: config.5,v 1.33 2015/09/01 01:50:14 pgoyette Exp $ .\" .\" Copyright (c) 2006, 2007 The NetBSD Foundation. .\" All rights reserved. @@ -618,12 +618,16 @@ statements). If the option has not been declared in the options description part of the kernel configuration machinery, it will be added as a pre-processor definition when source files are compiled. +If the option has previously been selected, the statement produces a +warning, and the new +.Ic options +statement replaces the original. .It Ic no options Ar name Op , Ar name Op , Ar ... Un-selects the option .Ar name . If option .Ar name -has not been previously selected, the statement produces an error. +has not previously been selected, the statement produces a warning. .It Ic file-system Ar name Op , Ar name Op , Ar ... Adds support for all the listed file-systems. .It Ic no file-system Ar name Op , Ar name Op , Ar ... Index: src/usr.bin/config/main.c diff -u src/usr.bin/config/main.c:1.81 src/usr.bin/config/main.c:1.82 --- src/usr.bin/config/main.c:1.81 Mon Aug 31 02:58:25 2015 +++ src/usr.bin/config/main.c Tue Sep 1 01:50:14 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: main.c,v 1.81 2015/08/31 02:58:25 uebayasi Exp $ */ +/* $NetBSD: main.c,v 1.82 2015/09/01 01:50:14 pgoyette Exp $ */ /* * Copyright (c) 1992, 1993 @@ -45,7 +45,7 @@ #endif #include <sys/cdefs.h> -__RCSID("$NetBSD: main.c,v 1.81 2015/08/31 02:58:25 uebayasi Exp $"); +__RCSID("$NetBSD: main.c,v 1.82 2015/09/01 01:50:14 pgoyette Exp $"); #ifndef MAKE_BOOTSTRAP #include <sys/cdefs.h> @@ -114,8 +114,9 @@ static void dependopts_one(const char *) static void do_depends(struct nvlist *); static void do_depend(struct nvlist *); static void stop(void); -static int do_option(struct hashtab *, struct nvlist ***, - const char *, const char *, const char *); +static int do_option(struct hashtab *, struct nvlist **, + struct nvlist ***, const char *, const char *, + const char *, struct hashtab *); static int undo_option(struct hashtab *, struct nvlist **, struct nvlist ***, const char *, const char *); static int crosscheck(void); @@ -994,7 +995,8 @@ addoption(const char *name, const char * cfgwarn("undeclared option `%s' added to IDENT", name); } - if (do_option(opttab, &nextopt, name, value, "options")) + if (do_option(opttab, &options, &nextopt, name, value, "options", + selecttab)) return; /* make lowercase, then add to select table */ @@ -1036,7 +1038,8 @@ addfsoption(const char *name) */ n = strtolower(name); - if (do_option(fsopttab, &nextfsopt, name, n, "file-system")) + if (do_option(fsopttab, &fsoptions, &nextfsopt, name, n, "file-system", + selecttab)) return; /* Add to select table. */ @@ -1071,7 +1074,8 @@ void addmkoption(const char *name, const char *value) { - (void)do_option(mkopttab, &nextmkopt, name, value, "makeoptions"); + (void)do_option(mkopttab, &mkoptions, &nextmkopt, name, value, + "makeoptions", NULL); } void @@ -1144,28 +1148,41 @@ fixmkoption(void) * Add a name=value pair to an option list. The value may be NULL. */ static int -do_option(struct hashtab *ht, struct nvlist ***nppp, const char *name, - const char *value, const char *type) +do_option(struct hashtab *ht, struct nvlist **npp, struct nvlist ***next, + const char *name, const char *value, const char *type, + struct hashtab *stab) { - struct nvlist *nv; + struct nvlist *nv, *onv; /* assume it will work */ nv = newnv(name, value, NULL, 0, NULL); - if (ht_insert(ht, name, nv) == 0) { - **nppp = nv; - *nppp = &nv->nv_next; - return (0); + if (ht_insert(ht, name, nv) != 0) { + + /* oops, already got that option - remove it first */ + if ((onv = ht_lookup(ht, name)) == NULL) + panic("do_option 1"); + if (onv->nv_str != NULL && !OPT_FSOPT(name)) + cfgwarn("already have %s `%s=%s'", type, name, + onv->nv_str); + else + cfgwarn("already have %s `%s'", type, name); + + if (undo_option(ht, npp, next, name, type)) + panic("do_option 2"); + if (stab != NULL && + undo_option(stab, NULL, NULL, strtolower(name), type)) + panic("do_option 3"); + + /* now try adding it again */ + if (ht_insert(ht, name, nv) != 0) + panic("do_option 4"); + + CFGDBG(2, "opt `%s' replaced", name); } + **next = nv; + *next = &nv->nv_next; - /* oops, already got that option */ - nvfree(nv); - if ((nv = ht_lookup(ht, name)) == NULL) - panic("do_option"); - if (nv->nv_str != NULL && !OPT_FSOPT(name)) - cfgerror("already have %s `%s=%s'", type, name, nv->nv_str); - else - cfgerror("already have %s `%s'", type, name); - return (1); + return (0); } /*