diff options
author | imp <imp@FreeBSD.org> | 2007-05-17 04:53:52 +0000 |
---|---|---|
committer | imp <imp@FreeBSD.org> | 2007-05-17 04:53:52 +0000 |
commit | 5907a150d5e9ac5dbdae3755e2ea48c482dcff3c (patch) | |
tree | 2fdb18be10336648c3e3ee75a8e5f772db10e663 | |
parent | 107e03db097aaf6b92c0c4fd82fb3bad5c5abc97 (diff) | |
download | FreeBSD-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@
-rw-r--r-- | usr.sbin/config/config.h | 2 | ||||
-rw-r--r-- | usr.sbin/config/config.y | 80 | ||||
-rw-r--r-- | usr.sbin/config/main.c | 17 |
3 files changed, 26 insertions, 73 deletions
diff --git a/usr.sbin/config/config.h b/usr.sbin/config/config.h index 3a32520..759eef0 100644 --- a/usr.sbin/config/config.h +++ b/usr.sbin/config/config.h @@ -177,7 +177,7 @@ void headers(void); void cfgfile_add(const char *); void cfgfile_removeall(void); -extern STAILQ_HEAD(device_head, device) dtab, rmdtab; +extern STAILQ_HEAD(device_head, device) dtab; extern char errbuf[80]; extern int yyline; 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); } } diff --git a/usr.sbin/config/main.c b/usr.sbin/config/main.c index c0c6b2a..a3b300a 100644 --- a/usr.sbin/config/main.c +++ b/usr.sbin/config/main.c @@ -150,14 +150,14 @@ main(int argc, char **argv) usage(); PREFIX = *argv; - /* - * We mark lack of DEFAULTS here. Once we hit EOF in PREFIX, yywrap() - * will try to bring DEFAULTS to the playground, if this exists. - */ - found_defaults = 0; - if (freopen(PREFIX, "r", stdin) == NULL) - err(2, "%s", PREFIX); - yyfile = PREFIX; + if (freopen("DEFAULTS", "r", stdin) != NULL) { + found_defaults = 1; + yyfile = "DEFAULTS"; + } else { + if (freopen(PREFIX, "r", stdin) == NULL) + err(2, "%s", PREFIX); + yyfile = PREFIX; + } if (*destdir != '\0') { len = strlen(destdir); while (len > 1 && destdir[len - 1] == '/') @@ -184,7 +184,6 @@ main(int argc, char **argv) STAILQ_INIT(&fntab); STAILQ_INIT(&ftab); STAILQ_INIT(&hints); - STAILQ_INIT(&rmdtab); if (yyparse()) exit(3); |