krb5_error_code KRB5_CALLCONV
krb5_kt_resolve(krb5_context context, const char *name, krb5_keytab *ktid);
+/**
+ * Duplicate keytab handle.
+ *
+ * @param [in] context Library context
+ * @param [in] in Key table handle to be duplicated
+ * @param [out] out Key table handle
+ *
+ * Create a new handle referring to the same key table as @a in. The new
+ * handle and @a in can be closed independently.
+ *
+ * @version New in 1.12
+ */
+krb5_error_code KRB5_CALLCONV
+krb5_kt_dup(krb5_context context, krb5_keytab in, krb5_keytab *out);
+
/**
* Get the default key table name.
*
assert(cred->keytab == NULL);
if (req_keytab != NULL) {
- char ktname[BUFSIZ];
-
- /* Duplicate keytab handle */
- code = krb5_kt_get_name(context, req_keytab, ktname, sizeof(ktname));
- if (code) {
- *minor_status = code;
- return GSS_S_CRED_UNAVAIL;
- }
- code = krb5_kt_resolve(context, ktname, &kt);
+ code = krb5_kt_dup(context, req_keytab, &kt);
} else {
code = k5_mutex_lock(&gssint_krb5_keytab_lock);
if (code) {
goto error;
}
- if (client_keytab != NULL) {
- char ktname[BUFSIZ];
-
- /* Duplicate keytab handle */
- code = krb5_kt_get_name(context, client_keytab, ktname,
- sizeof(ktname));
- if (code)
- goto error;
-
- code = krb5_kt_resolve(context, ktname, &cred->client_keytab);
- if (code)
- goto error;
- } else {
+ if (client_keytab != NULL)
+ code = krb5_kt_dup(context, client_keytab, &cred->client_keytab);
+ else
code = krb5_kt_client_default(context, &cred->client_keytab);
- if (code)
- goto error;
- }
+ if (code)
+ goto error;
if (password != GSS_C_NO_BUFFER) {
pwdata = make_data(password->value, password->length);
return err;
}
+krb5_error_code KRB5_CALLCONV
+krb5_kt_dup(krb5_context context, krb5_keytab in, krb5_keytab *out)
+{
+ krb5_error_code err;
+ char name[BUFSIZ];
+
+ err = in->ops->get_name(context, in, name, sizeof(name));
+ return err ? err : krb5_kt_resolve(context, name, out);
+}
+
/*
* Routines to deal with externalizingt krb5_keytab.
* keytab_size();