/** 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)); } }
/** Set flags on a lock (user interface). * \verbatim * This implements @lset. * \endverbatim * \param player the enactor. * \param what string in the form obj/lock. * \param flags list of flags to set. */ void do_lset(dbref player, char *what, char *flags) { dbref thing; lock_list *l; char *lname; int flag; int unset = 0; if ((lname = strchr(what, '/')) == NULL) { notify(player, T("No lock name given.")); return; } *lname++ = '\0'; if ((thing = match_controlled(player, what)) == NOTHING) return; if (*flags == '!') { unset = 1; flags++; } if ((flag = string_to_lockflag(flags)) < 0) { notify(player, T("Unrecognized lock flag.")); return; } l = getlockstruct_noparent(thing, lname); if (!l || !Can_Read_Lock(player, thing, L_TYPE(l))) { notify(player, T("No such lock.")); return; } if (!can_write_lock(player, thing, l)) { notify(player, T("Permission denied.")); return; } if (unset) L_FLAGS(l) &= ~flag; else L_FLAGS(l) |= flag; if (!Quiet(player) && !(Quiet(thing) && (Owner(thing) == player))) notify_format(player, "%s/%s - %s.", Name(thing), L_TYPE(l), unset ? T("lock flags unset") : T("lock flags set")); if (!IsPlayer(thing)) { char lmbuf[1024]; ModTime(thing) = mudtime; snprintf(lmbuf, 1023, "lflags - %s[#%d]", flags, player); lmbuf[strlen(lmbuf)+1] = '\0'; set_lmod(thing, lmbuf); } }
/** Set flags on a lock (user interface). * \verbatim * This implements @lset. * \endverbatim * \param player the enactor. * \param what string in the form obj/lock. * \param flags list of flags to set. */ void do_lset(dbref player, char *what, char *flags) { dbref thing; lock_list *l; char *lname; privbits flag; bool unset = 0; if ((lname = strchr(what, '/')) == NULL) { notify(player, T("No lock name given.")); return; } *lname++ = '\0'; if ((thing = match_controlled(player, what)) == NOTHING) return; if (*flags == '!') { unset = 1; flags++; } if (string_to_lockflag(player, flags, &flag) < 0) { notify(player, T("Unrecognized lock flag.")); return; } l = getlockstruct_noparent(thing, lname); if (!l || !Can_Read_Lock(player, thing, L_TYPE(l))) { notify(player, T("No such lock.")); return; } if (!can_write_lock(player, thing, l)) { notify(player, T("Permission denied.")); return; } if (unset) L_FLAGS(l) &= ~flag; else L_FLAGS(l) |= flag; if (!Quiet(player) && !(Quiet(thing) && (Owner(thing) == player))) notify_format(player, "%s/%s - %s.", AName(thing, AN_SYS, NULL), L_TYPE(l), unset ? T("lock flags unset") : T("lock flags set")); if (!IsPlayer(thing)) ModTime(thing) = mudtime; }
static int can_write_lock(dbref player, dbref thing, lock_list *lock) { if (God(player)) return 1; if (God(thing)) return 0; if ((L_FLAGS(lock) & LF_PRIVILEGE) && !Prived(player)) return 0; if (L_FLAGS(lock) & LF_OWNER) return player == Owner(thing); if (L_FLAGS(lock) & LF_LOCKED) return Owner(player) == lock->creator; return 1; }
static int can_write_lock(dbref player, dbref thing, lock_list *lock) { if (God(player)) return 1; if (God(thing)) return 0; if (Wizard(player)) return 1; if (L_FLAGS(lock) & LF_WIZARD) return 0; if ((L_FLAGS(lock) & LF_OWNER) && player != Owner(thing)) return 0; if ((L_FLAGS(lock) & LF_LOCKED) && player != lock->creator && Owner(player) != lock->creator) return 0; return 1; }
/** Return a list of lock flag names. * \param ll pointer to a lock. * \return string of lock flag names, space-separated. */ const char * lock_flags_long(lock_list *ll) { return privs_to_string(lock_privs, L_FLAGS(ll)); }
/** Return a list of lock flag characters. * \param ll pointer to a lock. * \return string of lock flag characters. */ const char * lock_flags(lock_list *ll) { return privs_to_letters(lock_privs, L_FLAGS(ll)); }