From 372db4d853280b7936358468bf5494a01a1b216d Mon Sep 17 00:00:00 2001 From: Love Hornquist Astrand Date: Thu, 7 Apr 2011 07:12:03 -0700 Subject: [PATCH] add krb5_kt_have_content --- lib/krb5/keytab.c | 61 +++++++++++++++++++++++++++++++------ lib/krb5/test_config.c | 3 +- lib/krb5/test_keytab.c | 4 +++ lib/krb5/version-script.map | 1 + 4 files changed, 58 insertions(+), 11 deletions(-) diff --git a/lib/krb5/keytab.c b/lib/krb5/keytab.c index 96c0bce27..f70fb3967 100644 --- a/lib/krb5/keytab.c +++ b/lib/krb5/keytab.c @@ -166,29 +166,27 @@ krb5_kt_register(krb5_context context, } static const char * -keytab_name(const char * name, const char ** ptype, size_t * ptype_len) +keytab_name(const char *name, const char **type, size_t *type_len) { - const char * residual; + const char *residual; residual = strchr(name, ':'); - if (residual == NULL - + if (residual == NULL || + name[0] == '/' #ifdef _WIN32 - /* Avoid treating : as a keytab type * specification */ - || name + 1 == residual #endif ) { - *ptype = "FILE"; - *ptype_len = strlen(*ptype); + *type = "FILE"; + *type_len = strlen(*type); residual = name; } else { - *ptype = name; - *ptype_len = residual - name; + *type = name; + *type_len = residual - name; residual++; } @@ -850,3 +848,46 @@ krb5_kt_remove_entry(krb5_context context, } return (*id->remove)(context, id, entry); } + +/** + * Return true if the keytab exists and have entries + * + * @param context a Keberos context. + * @param id a keytab. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + +KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL +krb5_kt_have_content(krb5_context context, + krb5_keytab id) +{ + krb5_keytab_entry entry; + krb5_kt_cursor cursor; + krb5_error_code ret; + char *name; + + ret = krb5_kt_start_seq_get(context, id, &cursor); + if (ret) + goto notfound; + + ret = krb5_kt_next_entry(context, id, &entry, &cursor); + krb5_kt_end_seq_get(context, id, &cursor); + if (ret) + goto notfound; + + krb5_kt_free_entry(context, &entry); + + return 0; + + notfound: + ret = krb5_kt_get_full_name(context, id, &name); + if (ret == 0) { + krb5_set_error_message(context, KRB5_KT_NOTFOUND, + N_("No entry in keytab: %s", ""), name); + free(name); + } + return KRB5_KT_NOTFOUND; +} diff --git a/lib/krb5/test_config.c b/lib/krb5/test_config.c index 4ca103aa2..08062275f 100644 --- a/lib/krb5/test_config.c +++ b/lib/krb5/test_config.c @@ -224,7 +224,8 @@ check_escaped_strings(void) } if (*s || *e) - errx(1, "Configuation string list for value [%s] has incorrect length.\n"); + errx(1, "Configuation string list for value [%s] has incorrect length.", + config_strings_tests[i].name); krb5_config_free_strings(ps); } diff --git a/lib/krb5/test_keytab.c b/lib/krb5/test_keytab.c index 33f2f1595..ca2bc4feb 100644 --- a/lib/krb5/test_keytab.c +++ b/lib/krb5/test_keytab.c @@ -54,6 +54,10 @@ test_empty_keytab(krb5_context context, const char *keytab) krb5_kt_remove_entry(context, id, &entry); + ret = krb5_kt_have_content(context, id); + if (ret == 0) + krb5_errx(context, 1, "supposed to be empty keytab isn't"); + ret = krb5_kt_close(context, id); if (ret) krb5_err(context, 1, ret, "krb5_kt_close"); diff --git a/lib/krb5/version-script.map b/lib/krb5/version-script.map index abda458fc..a7913110e 100644 --- a/lib/krb5/version-script.map +++ b/lib/krb5/version-script.map @@ -421,6 +421,7 @@ HEIMDAL_KRB5_2.0 { krb5_kt_get_full_name; krb5_kt_get_name; krb5_kt_get_type; + krb5_kt_have_content; krb5_kt_next_entry; krb5_kt_read_service_key; krb5_kt_register;