diff options
Diffstat (limited to 'usr.sbin/config/config.y')
-rw-r--r-- | usr.sbin/config/config.y | 92 |
1 files changed, 64 insertions, 28 deletions
diff --git a/usr.sbin/config/config.y b/usr.sbin/config/config.y index 168f4f8..770833d 100644 --- a/usr.sbin/config/config.y +++ b/usr.sbin/config/config.y @@ -343,13 +343,33 @@ newfile(char *name) } /* - * add a device to the list of devices + * Find a device in the list of devices. + */ +static struct device * +finddev(char *name) +{ + struct device *dp; + + STAILQ_FOREACH(dp, &dtab, d_next) + if (eq(dp->d_name, name)) + return (dp); + + return (NULL); +} + +/* + * Add a device to the list of devices. */ static void newdev(char *name) { struct device *np; + if (finddev(name)) { + printf("WARNING: duplicate device `%s' encountered.\n", name); + return; + } + np = (struct device *) malloc(sizeof *np); memset(np, 0, sizeof(*np)); np->d_name = name; @@ -357,31 +377,49 @@ newdev(char *name) } /* - * remove a device from the list of devices + * Remove a device from the list of devices. */ static void rmdev(char *name) { - struct device *dp, *rmdp; - - STAILQ_FOREACH(dp, &dtab, d_next) { - if (eq(dp->d_name, name)) { - rmdp = dp; - dp = STAILQ_NEXT(dp, d_next); - STAILQ_REMOVE(&dtab, rmdp, device, d_next); - free(rmdp->d_name); - free(rmdp); - if (dp == NULL) - break; - } + struct device *dp; + + dp = finddev(name); + if (dp != NULL) { + STAILQ_REMOVE(&dtab, dp, device, d_next); + free(dp->d_name); + free(dp); } } +/* + * Find an option in the list of options. + */ +static struct opt * +findopt(struct opt_head *list, char *name) +{ + struct opt *op; + + SLIST_FOREACH(op, list, op_next) + if (eq(op->op_name, name)) + return (op); + + return (NULL); +} + +/* + * Add an option to the list of options. + */ static void newopt(struct opt_head *list, char *name, char *value) { struct opt *op; + if (findopt(list, name)) { + printf("WARNING: duplicate option `%s' encountered.\n", name); + return; + } + op = (struct opt *)malloc(sizeof (struct opt)); memset(op, 0, sizeof(*op)); op->op_name = name; @@ -390,22 +428,20 @@ newopt(struct opt_head *list, char *name, char *value) SLIST_INSERT_HEAD(list, op, op_next); } +/* + * Remove an option from the list of options. + */ static void rmopt(struct opt_head *list, char *name) { - struct opt *op, *rmop; - - SLIST_FOREACH(op, list, op_next) { - if (eq(op->op_name, name)) { - rmop = op; - op = SLIST_NEXT(op, op_next); - SLIST_REMOVE(list, rmop, opt, op_next); - free(rmop->op_name); - if (rmop->op_value != NULL) - free(rmop->op_value); - free(rmop); - if (op == NULL) - break; - } + struct opt *op; + + op = findopt(list, name); + if (op != NULL) { + SLIST_REMOVE(list, op, opt, op_next); + free(op->op_name); + if (op->op_value != NULL) + free(op->op_value); + free(op); } } |