aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/config
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2010-04-27 06:14:30 +0000
committerWarner Losh <imp@FreeBSD.org>2010-04-27 06:14:30 +0000
commit4bc2b0b76d0257c828db84a98400d7000aa6568a (patch)
tree8256046c2241eeb6f3d52fb7a40ffbbf3cead1a0 /usr.sbin/config
parent012ead2f2cfc8c23871e42cccc734ce3c764fb00 (diff)
downloadsrc-4bc2b0b76d0257c828db84a98400d7000aa6568a.tar.gz
src-4bc2b0b76d0257c828db84a98400d7000aa6568a.zip
Require the option that's mapped be listed in the options file. This
will allow people with old config options to either have it just work (if config is new enough), or get a version error (if their config is about 7.0 or newer) rather than getting a cryptic error about duplicated options in the options file, or getting an error about an unknown option, at which point they'd update their config file only to learn they need a new config, only to learn they didn't really need to update their config file... All this because our version checking was in the wrong place for the past decade... # hopefully this is the last change, and we'll be able to config with an # 8.0 GENERIC file on stable/8 after I merge this change and add the # compat options. MFC after: 3 days
Notes
Notes: svn path=/head/; revision=207265
Diffstat (limited to 'usr.sbin/config')
-rw-r--r--usr.sbin/config/mkoptions.c37
1 files changed, 28 insertions, 9 deletions
diff --git a/usr.sbin/config/mkoptions.c b/usr.sbin/config/mkoptions.c
index 846e028c4cd2..044b669f3a32 100644
--- a/usr.sbin/config/mkoptions.c
+++ b/usr.sbin/config/mkoptions.c
@@ -292,32 +292,49 @@ tooption(char *name)
static void
-insert_option(char *this, char *val, int flags)
+check_duplicate(const char *fname, const char *this)
{
struct opt_list *po;
+ SLIST_FOREACH(po, &otab, o_next) {
+ if (eq(po->o_name, this)) {
+ printf("%s: Duplicate option %s.\n",
+ fname, this);
+ exit(1);
+ }
+ }
+}
+
+static void
+insert_option(const char *fname, char *this, char *val)
+{
+ struct opt_list *po;
+
+ check_duplicate(fname, this);
po = (struct opt_list *) calloc(1, sizeof *po);
if (po == NULL)
err(EXIT_FAILURE, "calloc");
po->o_name = this;
po->o_file = val;
- po->o_flags = flags;
+ po->o_flags = 0;
SLIST_INSERT_HEAD(&otab, po, o_next);
}
-
static void
-check_duplicate(const char *fname, const char *this)
+update_option(const char *this, char *val, int flags)
{
struct opt_list *po;
SLIST_FOREACH(po, &otab, o_next) {
if (eq(po->o_name, this)) {
- printf("%s: Duplicate option %s.\n",
- fname, this);
- exit(1);
+ free(po->o_file);
+ po->o_file = val;
+ po->o_flags = flags;
+ return;
}
}
+ printf("Compat option %s not listed in options file.\n", this);
+ exit(1);
}
static int
@@ -355,8 +372,10 @@ read_option_file(const char *fname, int flags)
free(s);
}
val = ns(val);
- check_duplicate(fname, this);
- insert_option(this, val, flags);
+ if (flags == 0)
+ insert_option(fname, this, val);
+ else
+ update_option(this, val, flags);
}
(void)fclose(fp);
return (1);