krb5_error_code kg_init_name(krb5_context context, krb5_principal principal, krb5_authdata_context ad_context, krb5_flags flags, krb5_gss_name_t *ret_name) { krb5_error_code code; krb5_gss_name_t name; *ret_name = NULL; assert(principal != NULL); if (principal == NULL) return EINVAL; name = xmalloc(sizeof(krb5_gss_name_rec)); if (name == NULL) return ENOMEM; memset(name, 0, sizeof(krb5_gss_name_rec)); code = k5_mutex_init(&name->lock); if (code != 0) goto cleanup; if ((flags & KG_INIT_NAME_NO_COPY) == 0) { code = krb5_copy_principal(context, principal, &name->princ); if (code != 0) goto cleanup; if (ad_context != NULL) { code = krb5_authdata_context_copy(context, ad_context, &name->ad_context); if (code != 0) goto cleanup; } } else { name->princ = principal; name->ad_context = ad_context; } if ((flags & KG_INIT_NAME_INTERN) && !kg_save_name((gss_name_t)name)) { code = G_VALIDATE_FAILED; goto cleanup; } *ret_name = name; cleanup: if (code != 0) kg_release_name(context, 0, &name); return code; }
krb5_error_code kg_init_name(krb5_context context, krb5_principal principal, char *service, char *host, krb5_authdata_context ad_context, krb5_flags flags, krb5_gss_name_t *ret_name) { krb5_error_code code; krb5_gss_name_t name; *ret_name = NULL; assert(principal != NULL); if (principal == NULL) return EINVAL; name = xmalloc(sizeof(krb5_gss_name_rec)); if (name == NULL) return ENOMEM; memset(name, 0, sizeof(krb5_gss_name_rec)); code = k5_mutex_init(&name->lock); if (code != 0) goto cleanup; if ((flags & KG_INIT_NAME_NO_COPY) == 0) { code = krb5_copy_principal(context, principal, &name->princ); if (code != 0) goto cleanup; if (ad_context != NULL) { code = krb5_authdata_context_copy(context, ad_context, &name->ad_context); if (code != 0) goto cleanup; } code = ENOMEM; if (service != NULL) { name->service = strdup(service); if (name->service == NULL) goto cleanup; } if (host != NULL) { name->host = strdup(host); if (name->host == NULL) goto cleanup; } code = 0; } else { name->princ = principal; name->service = service; name->host = host; name->ad_context = ad_context; } *ret_name = name; cleanup: if (code != 0) kg_release_name(context, &name); return code; }