static krb5_error_code KRB5_CALLCONV scc_get_cache_next(krb5_context context, krb5_cc_cursor cursor, krb5_ccache *id) { struct cache_iter *ctx = cursor; krb5_error_code ret; const char *name; again: ret = sqlite3_step(ctx->stmt); if (ret == SQLITE_DONE) { krb5_clear_error_message(context); return KRB5_CC_END; } else if (ret != SQLITE_ROW) { krb5_set_error_message(context, KRB5_CC_IO, N_("Database failed: %s", ""), sqlite3_errmsg(ctx->db)); return KRB5_CC_IO; } if (sqlite3_column_type(ctx->stmt, 0) != SQLITE_TEXT) goto again; name = (const char *)sqlite3_column_text(ctx->stmt, 0); if (name == NULL) goto again; ret = _krb5_cc_allocate(context, &krb5_scc_ops, id); if (ret) return ret; return scc_resolve(context, id, name); }
static krb5_error_code mcc_get_cache_next(krb5_context context, krb5_cc_cursor cursor, krb5_ccache *id) { struct mcache_iter *iter = cursor; krb5_error_code ret; krb5_mcache *m; if (iter->cache == NULL) return KRB5_CC_END; HEIMDAL_MUTEX_lock(&mcc_mutex); m = iter->cache; if (m->next) m->next->refcnt++; iter->cache = m->next; HEIMDAL_MUTEX_unlock(&mcc_mutex); ret = _krb5_cc_allocate(context, &krb5_mcc_ops, id); if (ret) return ret; (*id)->data.data = m; (*id)->data.length = sizeof(*m); return 0; }
static krb5_error_code KRB5_CALLCONV get_cache_next(krb5_context context, krb5_cc_cursor cursor, const krb5_cc_ops *ops, krb5_ccache *id) { struct xcc_cursor *c = cursor; krb5_error_code ret; HeimCredRef cred; krb5_xcc *x; if (c->array == NULL) return KRB5_CC_END; if (c->offset >= CFArrayGetCount(c->array)) return KRB5_CC_END; cred = (HeimCredRef)CFArrayGetValueAtIndex(c->array, c->offset++); if (cred == NULL) return KRB5_CC_END; ret = _krb5_cc_allocate(context, ops, id); if (ret) return ret; xcc_alloc(context, id); x = XCACHE((*id)); x->uuid = HeimCredGetUUID(cred); CFRetain(x->uuid); x->cred = cred; CFRetain(cred); genName(x); return ret; }
static krb5_error_code kcm_get_cache_next(krb5_context context, krb5_cc_cursor cursor, const krb5_cc_ops *ops, krb5_ccache *id) { krb5_error_code ret; krb5_kcm_cursor c = KCMCURSOR(cursor); krb5_storage *request, *response; krb5_data response_data; ssize_t sret; char *name; *id = NULL; again: if (c->offset >= c->length) return KRB5_CC_END; ret = krb5_kcm_storage_request(context, KCM_OP_GET_CACHE_BY_UUID, &request); if (ret) return ret; sret = krb5_storage_write(request, &c->uuids[c->offset], sizeof(c->uuids[c->offset])); c->offset++; if (sret != sizeof(c->uuids[c->offset])) { krb5_storage_free(request); krb5_clear_error_message(context); return ENOMEM; } ret = krb5_kcm_call(context, request, &response, &response_data); krb5_storage_free(request); if (ret == KRB5_FCC_NOFILE) { /* cache no longer exists, try next */ goto again; } else if (ret) return ret; ret = krb5_ret_stringz(response, &name); krb5_storage_free(response); krb5_data_free(&response_data); if (ret) return ret; ret = _krb5_cc_allocate(context, ops, id); if (ret == 0) ret = kcm_alloc(context, name, id); krb5_xfree(name); return ret; }
static krb5_error_code KRB5_CALLCONV acc_get_cache_next(krb5_context context, krb5_cc_cursor cursor, krb5_ccache *id) { struct cache_iter *iter = cursor; cc_ccache_t cache; krb5_acc *a; krb5_error_code ret; int32_t error; error = (*iter->iter->func->next)(iter->iter, &cache); if (error) return translate_cc_error(context, error); ret = _krb5_cc_allocate(context, &krb5_acc_ops, id); if (ret) { (*cache->func->release)(cache); return ret; } ret = acc_alloc(context, id); if (ret) { (*cache->func->release)(cache); free(*id); return ret; } a = ACACHE(*id); a->ccache = cache; error = get_cc_name(a); if (error) { acc_close(context, *id); *id = NULL; return translate_cc_error(context, error); } return 0; }