add copy config
authorLove Hörnquist Åstrand <lha@kth.se>
Sat, 18 Oct 2008 21:16:19 +0000 (21:16 +0000)
committerLove Hörnquist Åstrand <lha@kth.se>
Sat, 18 Oct 2008 21:16:19 +0000 (21:16 +0000)
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@23928 ec53bebd-3082-4978-b11e-865c3cabbd6b

lib/krb5/config_file.c
lib/krb5/context.c

index a05ab373a2fe5af70d57887f1feb1ec4286e223d..00266d2d0b438df8c8937faef07506c85153f4e6 100644 (file)
@@ -367,6 +367,36 @@ krb5_config_file_free (krb5_context context, krb5_config_section *s)
     return 0;
 }
 
+krb5_error_code
+_krb5_config_copy(krb5_context context,
+                 krb5_config_section *c,
+                 krb5_config_section **d)
+{
+    krb5_config_binding **previous = NULL;
+
+    while (c) {
+       *d = calloc(1, sizeof(**d));
+
+       (*d)->name = strdup(c->name);
+       (*d)->type = c->type;
+       if ((*d)->type == krb5_config_string)
+           (*d)->u.string = strdup(c->u.string);
+       else if ((*d)->type == krb5_config_list)
+           krb5_config_copy (context, c->u.list, &(*d)->u.list);
+       else
+           krb5_abortx(context,
+                       "unknown binding type (%d) in krb5_config_copy",
+                       (*d)->type);
+       if (previous)
+           *previous = *d;
+
+       previous = &(*d)->next;
+       c = c->next;
+    }
+}
+
+
+
 const void *
 krb5_config_get_next (krb5_context context,
                      const krb5_config_section *c,
index 8aff73edc7c266f5f958e7472b21d3ec784bbb50..7ef7db5a9700a258a2898dbf692e206a91ad0b5c 100644 (file)
@@ -349,11 +349,19 @@ krb5_copy_context(krb5_context context, krb5_context *out)
 
     p = calloc(1, sizeof(*p));
     if (p == NULL) {
-       ret = ENOMEM;
-       krb5_set_error_message(context, ret, N_("malloc: out of memory", ""));
-       goto out;
+       krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", ""));
+       return ENOMEM;
     }
 
+    p->mutex = malloc(sizeof(p->mutex));
+    if (p->mutex == NULL) {
+       krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", ""));
+       free(p);
+       return ENOMEM;
+    }
+    HEIMDAL_MUTEX_init(context->mutex);
+
+
     if (context->default_cc_name)
        p->default_cc_name = strdup(context->default_cc_name);
     if (context->default_cc_name_env)
@@ -377,7 +385,9 @@ krb5_copy_context(krb5_context context, krb5_context *out)
            goto out;
     }
 
-    p->cf = context->cf; /* XXX krb5_config_file_copy() */
+    ret = _krb5_config_copy(context, context->cf, &p->cf);
+    if (ret)
+       goto out;
 
     /* XXX should copy */
     krb5_init_ets(p);
@@ -400,14 +410,6 @@ krb5_copy_context(krb5_context context, krb5_context *out)
     if (ret)
        goto out;
 
-    p->mutex = malloc(sizeof(p->mutex));
-    if (p->mutex == NULL) {
-       ret = ENOMEM;
-       krb5_set_error_message(context, ret, N_("malloc: out of memory", ""));
-       goto out;
-    }
-    HEIMDAL_MUTEX_init(context->mutex);
-
     *out = p;
 
     return 0;