summaryrefslogtreecommitdiffstats
path: root/usr.sbin/config/config.y
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2007-05-17 04:53:52 +0000
committerimp <imp@FreeBSD.org>2007-05-17 04:53:52 +0000
commit5907a150d5e9ac5dbdae3755e2ea48c482dcff3c (patch)
tree2fdb18be10336648c3e3ee75a8e5f772db10e663 /usr.sbin/config/config.y
parent107e03db097aaf6b92c0c4fd82fb3bad5c5abc97 (diff)
downloadFreeBSD-src-5907a150d5e9ac5dbdae3755e2ea48c482dcff3c.zip
FreeBSD-src-5907a150d5e9ac5dbdae3755e2ea48c482dcff3c.tar.gz
Fix some problems that affect multiple file inclusion. Bruce found
this bug and submitted these patches to dunstan@. He sent them to me to test, and I discovered they were needed for the atmel kernel config files. Since we were playing with them in the terminal room after the developer's summit today, I thought I'd go ahead and commit them to allow those folks that now have atmel hardware (thanks Andre) a chance to try it out w/o my help. Since dunstan@ is asleep right now, risk stepping on his toes a little by going ahead and committing this change. Submitted by: dunstan@, bde@ Tested by: bde@
Diffstat (limited to 'usr.sbin/config/config.y')
-rw-r--r--usr.sbin/config/config.y80
1 files changed, 17 insertions, 63 deletions
diff --git a/usr.sbin/config/config.y b/usr.sbin/config/config.y
index 9c8ba39..36a7bf7 100644
--- a/usr.sbin/config/config.y
+++ b/usr.sbin/config/config.y
@@ -78,7 +78,7 @@
#include "config.h"
-struct device_head dtab, rmdtab;
+struct device_head dtab;
char *ident;
char *env;
int envmode;
@@ -105,9 +105,6 @@ devopt(char *dev)
return ret;
}
-static void rmoptall(struct opt_head *list, struct opt_head *torem);
-static void rmdevall(struct device_head *dh, struct device_head *torem);
-
%}
%%
Configuration:
@@ -177,7 +174,7 @@ Config_spec:
OPTIONS Opt_list
|
NOOPTION Save_id
- = { rmopt_schedule(&rmopts, $2); } |
+ = { rmopt_schedule(&opt, $2); } |
MAKEOPTIONS Mkopt_list
|
NOMAKEOPTION Save_id
@@ -305,10 +302,10 @@ NoDevice:
= {
char *s = devopt($1);
- rmopt_schedule(&rmopts, s);
+ rmopt_schedule(&opt, s);
free(s);
/* and the device part */
- rmdev_schedule(&rmdtab, $1);
+ rmdev_schedule(&dtab, $1);
} ;
%%
@@ -323,17 +320,14 @@ yyerror(const char *s)
int
yywrap(void)
{
-
- if (found_defaults == 0 && incignore == 0) {
- if (freopen("DEFAULTS", "r", stdin) == NULL)
- return 1;
- yyfile = "DEFAULTS";
+ if (found_defaults) {
+ if (freopen(PREFIX, "r", stdin) == NULL)
+ err(2, "%s", PREFIX);
+ yyfile = PREFIX;
yyline = 0;
- found_defaults = 1;
+ found_defaults = 0;
return 0;
}
- rmoptall(&opt, &rmopts);
- rmdevall(&dtab, &rmdtab);
return 1;
}
@@ -391,29 +385,10 @@ rmdev_schedule(struct device_head *dh, char *name)
{
struct device *dp;
- dp = calloc(1, sizeof(struct device));
- dp->d_name = strdup(name);
- assert(dp->d_name != NULL);
- STAILQ_INSERT_HEAD(dh, dp, d_next);
-}
-
-/*
- * Take care a devices previously scheduled for removal.
- */
-static void
-rmdevall(struct device_head *dh, struct device_head *torem)
-{
- struct device *dp, *rdp;
-
- while (!STAILQ_EMPTY(torem)) {
- dp = STAILQ_FIRST(torem);
- STAILQ_REMOVE_HEAD(torem, d_next);
- rdp = finddev(dh, dp->d_name);
- if (rdp != NULL) {
- STAILQ_REMOVE(dh, rdp, device, d_next);
- free(rdp->d_name);
- free(rdp);
- }
+ dp = finddev(dh, name);
+ if (dp != NULL) {
+ STAILQ_REMOVE(dh, dp, device, d_next);
+ free(dp->d_name);
free(dp);
}
}
@@ -469,31 +444,10 @@ rmopt_schedule(struct opt_head *list, char *name)
{
struct opt *op;
- op = calloc(1, sizeof(*op));
- op->op_name = ns(name);
- SLIST_INSERT_HEAD(list, op, op_next);
-}
-
-/*
- * Remove all options that were scheduled for removal.
- */
-static void
-rmoptall(struct opt_head *list, struct opt_head *torem)
-{
- struct opt *op, *rop;
-
- op = rop = NULL;
- while (!SLIST_EMPTY(torem)) {
- op = SLIST_FIRST(torem);
- SLIST_REMOVE_HEAD(torem, op_next);
- rop = findopt(list, op->op_name);
- if (rop != NULL) {
- SLIST_REMOVE(list, rop, opt, op_next);
- free(rop->op_name);
- if (rop->op_value != NULL)
- free(rop->op_value);
- free(rop);
- }
+ op = findopt(list, name);
+ if (op != NULL) {
+ SLIST_REMOVE(list, op, opt, op_next);
+ free(op->op_name);
free(op);
}
}
OpenPOWER on IntegriCloud