svn commit: r342806 - stable/12/usr.sbin/config
Kyle Evans
kevans at FreeBSD.org
Sun Jan 6 02:12:56 UTC 2019
Author: kevans
Date: Sun Jan 6 02:12:55 2019
New Revision: 342806
URL: https://svnweb.freebsd.org/changeset/base/342806
Log:
MFC r342362-r342363: config(8) duplicate option handling
r342362:
config(8): Allow duplicate options to be specified
config(8)'s option handling has been written to allow duplicate options; if
the value changes, then the latest value is used and an informative message
is printed to stderr like so:
/usr/src/sys/amd64/conf/TEST: option "VERBOSE_SYSINIT" redefined from 0 to 1
Currently, this is only a possibility for cpu types, MAXUSERS, and
MACHINE_ARCH. Anything else duplicated in a config file will use the first
value set and error about duplicated options on subsequent appearances,
which is arguably unfriendly since one could specify:
include GENERIC
nooptions VERBOSE_SYSINIT
options VERBOSE_SYSINIT
to redefine the value later anyways.
Reported by: mmacy
r342363:
config(8): Remove all instances of an option when opting out
Quick follow-up to r342362: options can appear multiple times now, so
clean up all of them as needed. For non-OPTIONS options, this has no effect
since they're already de-duplicated.
Modified:
stable/12/usr.sbin/config/config.y
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/usr.sbin/config/config.y
==============================================================================
--- stable/12/usr.sbin/config/config.y Sun Jan 6 01:39:01 2019 (r342805)
+++ stable/12/usr.sbin/config/config.y Sun Jan 6 02:12:55 2019 (r342806)
@@ -99,7 +99,7 @@ static void newdev(char *name);
static void newfile(char *name);
static void newenvvar(char *name, bool is_file);
static void rmdev_schedule(struct device_head *dh, char *name);
-static void newopt(struct opt_head *list, char *name, char *value, int append);
+static void newopt(struct opt_head *list, char *name, char *value, int append, int dupe);
static void rmopt_schedule(struct opt_head *list, char *name);
static char *
@@ -212,7 +212,7 @@ System_spec:
;
System_id:
- Save_id { newopt(&mkopt, ns("KERNEL"), $1, 0); };
+ Save_id { newopt(&mkopt, ns("KERNEL"), $1, 0, 0); };
System_parameter_list:
System_parameter_list ID
@@ -232,13 +232,13 @@ NoOpt_list:
;
Option:
Save_id {
- newopt(&opt, $1, NULL, 0);
+ newopt(&opt, $1, NULL, 0, 1);
if (strchr($1, '=') != NULL)
errx(1, "%s:%d: The `=' in options should not be "
"quoted", yyfile, yyline);
} |
Save_id EQUALS Opt_value {
- newopt(&opt, $1, $3, 0);
+ newopt(&opt, $1, $3, 0, 1);
} ;
NoOption:
@@ -266,10 +266,10 @@ Mkopt_list:
;
Mkoption:
- Save_id { newopt(&mkopt, $1, ns(""), 0); } |
- Save_id EQUALS { newopt(&mkopt, $1, ns(""), 0); } |
- Save_id EQUALS Opt_value { newopt(&mkopt, $1, $3, 0); } |
- Save_id PLUSEQUALS Opt_value { newopt(&mkopt, $1, $3, 1); } ;
+ Save_id { newopt(&mkopt, $1, ns(""), 0, 0); } |
+ Save_id EQUALS { newopt(&mkopt, $1, ns(""), 0, 0); } |
+ Save_id EQUALS Opt_value { newopt(&mkopt, $1, $3, 0, 0); } |
+ Save_id PLUSEQUALS Opt_value { newopt(&mkopt, $1, $3, 1, 0); } ;
Dev:
ID { $$ = $1; }
@@ -295,7 +295,7 @@ NoDev_list:
Device:
Dev {
- newopt(&opt, devopt($1), ns("1"), 0);
+ newopt(&opt, devopt($1), ns("1"), 0, 0);
/* and the device part */
newdev($1);
}
@@ -432,7 +432,7 @@ findopt(struct opt_head *list, char *name)
* Add an option to the list of options.
*/
static void
-newopt(struct opt_head *list, char *name, char *value, int append)
+newopt(struct opt_head *list, char *name, char *value, int append, int dupe)
{
struct opt *op, *op2;
@@ -445,7 +445,7 @@ newopt(struct opt_head *list, char *name, char *value,
}
op2 = findopt(list, name);
- if (op2 != NULL && !append) {
+ if (op2 != NULL && !append && !dupe) {
fprintf(stderr,
"WARNING: duplicate option `%s' encountered.\n", name);
return;
@@ -458,9 +458,15 @@ newopt(struct opt_head *list, char *name, char *value,
op->op_ownfile = 0;
op->op_value = value;
if (op2 != NULL) {
- while (SLIST_NEXT(op2, op_append) != NULL)
- op2 = SLIST_NEXT(op2, op_append);
- SLIST_NEXT(op2, op_append) = op;
+ if (append) {
+ while (SLIST_NEXT(op2, op_append) != NULL)
+ op2 = SLIST_NEXT(op2, op_append);
+ SLIST_NEXT(op2, op_append) = op;
+ } else {
+ while (SLIST_NEXT(op2, op_next) != NULL)
+ op2 = SLIST_NEXT(op2, op_next);
+ SLIST_NEXT(op2, op_next) = op;
+ }
} else
SLIST_INSERT_HEAD(list, op, op_next);
}
@@ -473,8 +479,7 @@ rmopt_schedule(struct opt_head *list, char *name)
{
struct opt *op;
- op = findopt(list, name);
- if (op != NULL) {
+ while ((op = findopt(list, name)) != NULL) {
SLIST_REMOVE(list, op, opt, op_next);
free(op->op_name);
free(op);
More information about the svn-src-all
mailing list