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
This commit is contained in:
imp 2010-04-27 06:14:30 +00:00
parent 687e047ca1
commit 7eb24f6aa6

View File

@ -291,21 +291,6 @@ tooption(char *name)
}
static void
insert_option(char *this, char *val, int flags)
{
struct opt_list *po;
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;
SLIST_INSERT_HEAD(&otab, po, o_next);
}
static void
check_duplicate(const char *fname, const char *this)
{
@ -320,6 +305,38 @@ check_duplicate(const char *fname, const char *this)
}
}
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 = 0;
SLIST_INSERT_HEAD(&otab, po, o_next);
}
static void
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)) {
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
read_option_file(const char *fname, int flags)
{
@ -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);