From 88c4f664f869d7450b84f0262fd87fbda4f1f61b Mon Sep 17 00:00:00 2001 From: Chuck Lever Date: Tue, 29 Sep 2009 10:36:19 -0400 Subject: [PATCH] mount.nfs: Add API to duplicate a mount option list Signed-off-by: Chuck Lever Signed-off-by: Steve Dickson --- utils/mount/parse_opt.c | 65 +++++++++++++++++++++++++++++++++++++++++ utils/mount/parse_opt.h | 1 + 2 files changed, 66 insertions(+) diff --git a/utils/mount/parse_opt.c b/utils/mount/parse_opt.c index 1dfee8a..f0918f7 100644 --- a/utils/mount/parse_opt.c +++ b/utils/mount/parse_opt.c @@ -101,6 +101,37 @@ fail: return NULL; } +static struct mount_option *option_dup(const struct mount_option *option) +{ + struct mount_option *new; + + new = malloc(sizeof(*new)); + if (!new) + return NULL; + + new->next = NULL; + new->prev = NULL; + + new->keyword = strdup(option->keyword); + if (!new->keyword) + goto fail; + + new->value = NULL; + if (option->value) { + new->value = strdup(option->value); + if (!new->value) { + free(new->keyword); + goto fail; + } + } + + return new; + +fail: + free(new); + return NULL; +} + static void option_destroy(struct mount_option *option) { free(option->keyword); @@ -228,6 +259,40 @@ fail: return NULL; } +/** + * po_dup - duplicate an existing list of options + * @options: pointer to mount options + * + */ +struct mount_options *po_dup(struct mount_options *source) +{ + struct mount_options *target; + struct mount_option *current; + + if (!source) + return NULL; + + target = options_create(); + if (options_empty(source) || target == NULL) + return target; + + current = source->head; + while (target->count < source->count) { + struct mount_option *option; + + option = option_dup(current); + if (!option) { + po_destroy(target); + return NULL; + } + + options_tail_insert(target, option); + current = current->next; + } + + return target; +} + /** * po_replace - replace mount options in one mount_options object with another * @target: pointer to previously instantiated object to replace diff --git a/utils/mount/parse_opt.h b/utils/mount/parse_opt.h index f9243c3..2c0b5f4 100644 --- a/utils/mount/parse_opt.h +++ b/utils/mount/parse_opt.h @@ -38,6 +38,7 @@ typedef enum { struct mount_options; struct mount_options * po_split(char *); +struct mount_options * po_dup(struct mount_options *); void po_replace(struct mount_options *, struct mount_options *); po_return_t po_join(struct mount_options *, char **); -- 2.39.5