static krb5_error_code hdb_samba4_firstkey(krb5_context context, HDB *db, unsigned flags, hdb_entry_ex *entry) { struct samba_kdc_db_context *kdc_db_ctx; struct sdb_entry_ex sdb_entry_ex = {}; krb5_error_code ret; kdc_db_ctx = talloc_get_type_abort(db->hdb_db, struct samba_kdc_db_context); ret = samba_kdc_firstkey(context, kdc_db_ctx, &sdb_entry_ex); switch (ret) { case 0: break; case SDB_ERR_WRONG_REALM: return HDB_ERR_WRONG_REALM; case SDB_ERR_NOENTRY: return HDB_ERR_NOENTRY; default: return HDB_ERR_NOT_FOUND_HERE; } ret = sdb_entry_ex_to_hdb_entry_ex(context, &sdb_entry_ex, entry); sdb_free_entry(&sdb_entry_ex); return ret; }
static int mit_samba_get_firstkey(struct mit_samba_context *ctx, hdb_entry_ex **_hentry) { hdb_entry_ex *hentry; int ret; hentry = talloc(ctx, hdb_entry_ex); if (!hentry) { return ENOMEM; } ret = samba_kdc_firstkey(ctx->context, ctx->db_ctx, hentry); if (ret) { talloc_free(hentry); } else { talloc_steal(hentry->ctx, hentry); *_hentry = hentry; } return ret; }
int mit_samba_get_firstkey(struct mit_samba_context *ctx, krb5_db_entry **_kentry) { struct sdb_entry_ex sentry = { .free_entry = NULL, }; krb5_db_entry *kentry; int ret; kentry = malloc(sizeof(krb5_db_entry)); if (kentry == NULL) { return ENOMEM; } ret = samba_kdc_firstkey(ctx->context, ctx->db_ctx, &sentry); switch (ret) { case 0: break; case SDB_ERR_NOENTRY: free(kentry); return KRB5_KDB_NOENTRY; case SDB_ERR_NOT_FOUND_HERE: /* FIXME: RODC support */ default: free(kentry); return ret; } ret = sdb_entry_ex_to_kdb_entry_ex(ctx->context, &sentry, kentry); sdb_free_entry(&sentry); if (ret) { free(kentry); } else { *_kentry = kentry; } return ret; }