/* Run one invocation of the callback, unlocking the mutex and possibly the DB * around the invocation. */ static krb5_error_code curs_run_cb(iter_curs *curs, ctx_iterate_cb func, krb5_pointer func_arg) { krb5_db2_context *dbc = curs->dbc; krb5_error_code retval, lockerr; krb5_db_entry *entry; krb5_context ctx = curs->ctx; krb5_data contdata; contdata = make_data(curs->data.data, curs->data.size); retval = krb5_decode_princ_entry(ctx, &contdata, &entry); if (retval) return retval; /* Save libdb key across possible DB closure. */ retval = curs_save(curs); if (retval) return retval; if (dbc->unlockiter) curs_unlock(curs); k5_mutex_unlock(krb5_db2_mutex); retval = (*func)(func_arg, entry); krb5_db2_free(ctx, entry); k5_mutex_lock(krb5_db2_mutex); if (dbc->unlockiter) { lockerr = curs_lock(curs); if (lockerr) return lockerr; } return retval; }
/* Set up curs and lock DB. */ static krb5_error_code curs_init(iter_curs *curs, krb5_context ctx, krb5_db2_context *dbc, krb5_flags iterflags) { int isrecurse = iterflags & KRB5_DB_ITER_RECURSE; unsigned int prevflag = R_PREV; unsigned int nextflag = R_NEXT; curs->keycopy.size = 0; curs->keycopy.data = NULL; curs->islocked = FALSE; curs->ctx = ctx; curs->dbc = dbc; if (iterflags & KRB5_DB_ITER_WRITE) curs->lockmode = KRB5_LOCKMODE_EXCLUSIVE; else curs->lockmode = KRB5_LOCKMODE_SHARED; if (isrecurse) { #ifdef R_RNEXT if (dbc->hashfirst) { k5_setmsg(ctx, EINVAL, _("Recursive iteration is not supported " "for hash databases")); return EINVAL; } prevflag = R_RPREV; nextflag = R_RNEXT; #else k5_setmsg(ctx, EINVAL, _("Recursive iteration not supported " "in this version of libdb")); return EINVAL; #endif } if (iterflags & KRB5_DB_ITER_REV) { curs->startflag = R_LAST; curs->stepflag = prevflag; } else { curs->startflag = R_FIRST; curs->stepflag = nextflag; } return curs_lock(curs); }
/* Set up curs and lock DB. */ static krb5_error_code curs_init(iter_curs *curs, krb5_context ctx, krb5_db2_context *dbc, krb5_flags iterflags) { curs->keycopy.size = 0; curs->keycopy.data = NULL; curs->islocked = FALSE; curs->ctx = ctx; curs->dbc = dbc; if (iterflags & KRB5_DB_ITER_WRITE) curs->lockmode = KRB5_LOCKMODE_EXCLUSIVE; else curs->lockmode = KRB5_LOCKMODE_SHARED; if (iterflags & KRB5_DB_ITER_REV) { curs->startflag = R_LAST; curs->stepflag = R_PREV; } else { curs->startflag = R_FIRST; curs->stepflag = R_NEXT; } return curs_lock(curs); }