void purge_locks(void) { dbref thing; for (thing = 0; thing < db_top; thing++) { lock_list *ll; for (ll = Locks(thing); ll; ll = L_NEXT(ll)) L_KEY(ll) = cleanup_boolexp(L_KEY(ll)); } }
/** Copy the locks from one object to another. * \param player the enactor. * \param orig the source object. * \param clone the destination object. */ void clone_locks(dbref player, dbref orig, dbref clone) { lock_list *ll; for (ll = Locks(orig); ll; ll = ll->next) { if (!(L_FLAGS(ll) & LF_NOCLONE)) add_lock(player, clone, L_TYPE(ll), dup_bool(L_KEY(ll)), L_FLAGS(ll)); } }
/** Given a lock type, find a lock without checking parents. * \param thing object on which lock is to be found. * \param type type of lock to find. * \return pointer to boolexp of lock. */ boolexp getlock_noparent(dbref thing, lock_type type) { struct lock_list *ll = getlockstruct_noparent(thing, type); if (!ll) return TRUE_BOOLEXP; else return L_KEY(ll); }
static void ct_generic(dbref player, dbref i, warn_type flags) { if ((flags & W_LOCK_PROBS)) { lock_list *ll; for (ll = Locks(i); ll; ll = L_NEXT(ll)) { check_lock(player, i, L_TYPE(ll), L_KEY(ll)); } } }
/** Migrate some number of chunks. * The requested amount is only a guideline; the actual amount * migrated will be more or less due to always migrating all the * attributes, locks, and mail on any given object together. * \param amount the suggested number of attributes to migrate. */ static void migrate_stuff(int amount) { static int start_obj = 0; static chunk_reference_t **refs = NULL; static int refs_size = 0; int end_obj; int actual; ATTR *aptr; lock_list *lptr; MAIL *mp; if (db_top == 0) return; end_obj = start_obj; actual = 0; do { for (aptr = List(end_obj); aptr; aptr = AL_NEXT(aptr)) if (aptr->data != NULL_CHUNK_REFERENCE) actual++; for (lptr = Locks(end_obj); lptr; lptr = L_NEXT(lptr)) if (L_KEY(lptr) != NULL_CHUNK_REFERENCE) actual++; if (IsPlayer(end_obj)) { for (mp = find_exact_starting_point(end_obj); mp; mp = mp->next) if (mp->msgid != NULL_CHUNK_REFERENCE) actual++; } end_obj = (end_obj + 1) % db_top; } while (actual < amount && end_obj != start_obj); if (actual == 0) return; if (!refs || actual > refs_size) { if (refs) mush_free(refs, "migration reference array"); refs = mush_calloc(actual, sizeof(chunk_reference_t *), "migration reference array"); refs_size = actual; if (!refs) mush_panic("Could not allocate migration reference array"); } #ifdef DEBUG_MIGRATE do_rawlog(LT_TRACE, "Migrate asked %d, actual objects #%d to #%d for %d", amount, start_obj, (end_obj + db_top - 1) % db_top, actual); #endif actual = 0; do { for (aptr = List(start_obj); aptr; aptr = AL_NEXT(aptr)) if (aptr->data != NULL_CHUNK_REFERENCE) { refs[actual] = &(aptr->data); actual++; } for (lptr = Locks(start_obj); lptr; lptr = L_NEXT(lptr)) if (L_KEY(lptr) != NULL_CHUNK_REFERENCE) { refs[actual] = &(lptr->key); actual++; } if (IsPlayer(start_obj)) { for (mp = find_exact_starting_point(start_obj); mp; mp = mp->next) if (mp->msgid != NULL_CHUNK_REFERENCE) { refs[actual] = &(mp->msgid); actual++; } } start_obj = (start_obj + 1) % db_top; } while (start_obj != end_obj); chunk_migration(actual, refs); }