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,
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)
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);
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;