diff options
| author | Ruslan Ermilov <ru@FreeBSD.org> | 2005-12-30 16:28:06 +0000 |
|---|---|---|
| committer | Ruslan Ermilov <ru@FreeBSD.org> | 2005-12-30 16:28:06 +0000 |
| commit | 8ee64886ef782e4e9d9e67eef7d2a4e24b8696a1 (patch) | |
| tree | 88ec37e8c7a70a624495559a2639d280f195a656 /usr.sbin/config/config.y | |
| parent | 22025511b4eb3ddb30c06ee4a3171023c9fd5ffa (diff) | |
Notes
Diffstat (limited to 'usr.sbin/config/config.y')
| -rw-r--r-- | usr.sbin/config/config.y | 88 |
1 files changed, 62 insertions, 26 deletions
diff --git a/usr.sbin/config/config.y b/usr.sbin/config/config.y index 168f4f8913aa..770833dae13b 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; + struct device *dp; - 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; - } + 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; + struct opt *op; - 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; - } + 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); } } |
