krb5_kt_add_entry.rst
krb5_kt_end_seq_get.rst
krb5_kt_get_entry.rst
+ krb5_kt_have_content.rst
krb5_kt_next_entry.rst
krb5_kt_read_service_key.rst
krb5_kt_remove_entry.rst
krb5_kt_end_seq_get(krb5_context context, krb5_keytab keytab,
krb5_kt_cursor *cursor);
+/**
+ * Check if a keytab exists and contains entries.
+ *
+ * @param [in] context Library context
+ * @param [in] keytab Key table handle
+ *
+ * @retval 0 Keytab exists and contains entries
+ * @retval KRB5_KT_NOTFOUND Keytab does not contain entries
+ */
+krb5_error_code KRB5_CALLCONV
+krb5_kt_have_content(krb5_context context, krb5_keytab keytab);
+
/*
* end "keytab.h"
*/
return krb5_x((keytab)->ops->end_get,(context, keytab, cursor));
}
+krb5_error_code KRB5_CALLCONV
+krb5_kt_have_content(krb5_context context, krb5_keytab keytab)
+{
+ krb5_keytab_entry entry;
+ krb5_kt_cursor cursor;
+ krb5_error_code ret;
+
+ /* If the keytab is not iterable, assume that it has content. */
+ if (keytab->ops->start_seq_get == NULL)
+ return 0;
+
+ /* See if we can get at least one entry via iteration. */
+ ret = krb5_kt_start_seq_get(context, keytab, &cursor);
+ if (ret)
+ return KRB5_KT_NOTFOUND;
+ ret = krb5_kt_next_entry(context, keytab, &entry, &cursor);
+ krb5_kt_end_seq_get(context, keytab, &cursor);
+ if (ret)
+ return KRB5_KT_NOTFOUND;
+ krb5_kt_free_entry(context, &entry);
+ return 0;
+}
+
/*
* In a couple of places we need to get a principal name from a keytab: when
* verifying credentials against a keytab, and when querying the name of a
CHECK_ERR(kret, KRB5_KT_NOTFOUND, "Getting non-existent entry");
}
+ kret = krb5_kt_have_content(context, kt);
+ CHECK_ERR(kret, KRB5_KT_NOTFOUND, "Checking for keytab content (empty)");
+
/* =================== Add entries to keytab ================= */
/*
/* ============== Test iterating over contents of keytab ========= */
+ kret = krb5_kt_have_content(context, kt);
+ CHECK(kret, "Checking for keytab content (full)");
+
kret = krb5_kt_start_seq_get(context, kt, &cursor);
CHECK(kret, "Start sequence get");
krb5_kt_get_entry
krb5_kt_get_name
krb5_kt_get_type
+krb5_kt_have_content
krb5_kt_next_entry
krb5_kt_read_service_key
krb5_kt_register
; new in 1.11 (note that 399-400 are used above)
krb5_chpw_message @398
+ krb5_kt_have_content @401