From c1f4dd93557804e77fec0210b4db4a6ad0369a0a Mon Sep 17 00:00:00 2001 From: Warner Losh Date: Thu, 17 May 2007 04:53:52 +0000 Subject: [PATCH] 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@ --- usr.sbin/config/config.h | 2 +- usr.sbin/config/config.y | 80 +++++++++------------------------------- 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 3a3252009a4f..759eef039958 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 9c8ba39eb639..36a7bf7eed41 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 c0c6b2a7b42f..a3b300a8da34 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);