mount.nfs: Add API to duplicate a mount option list
authorChuck Lever <chuck.lever@oracle.com>
Tue, 29 Sep 2009 14:36:19 +0000 (10:36 -0400)
committerSteve Dickson <steved@redhat.com>
Tue, 29 Sep 2009 14:36:19 +0000 (10:36 -0400)
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
utils/mount/parse_opt.c
utils/mount/parse_opt.h

index 1dfee8a..f0918f7 100644 (file)
@@ -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);
@@ -229,6 +260,40 @@ fail:
 }
 
 /**
+ * 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
  * @source: pointer to object containing source mount options
index f9243c3..2c0b5f4 100644 (file)
@@ -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 **);