mux/src/predicates.cpp File Reference

#include "copyright.h"
#include "autoconf.h"
#include "config.h"
#include "externs.h"
#include <signal.h>
#include "ansi.h"
#include "attrs.h"
#include "command.h"
#include "interface.h"
#include "powers.h"

Include dependency graph for predicates.cpp:

Go to the source code of this file.

Functions

char *DCL_CDECL tprintf (const char *fmt,...)
void DCL_CDECL safe_tprintf_str (char *str, char **bp, const char *fmt,...)
dbref insert_first (dbref head, dbref thing)
dbref remove_first (dbref head, dbref thing)
dbref reverse_list (dbref list)
bool member (dbref thing, dbref list)
bool could_doit (dbref player, dbref thing, int locknum)
bool can_see (dbref player, dbref thing, bool can_see_loc)
static bool pay_quota (dbref who, int cost)
bool canpayfees (dbref player, dbref who, int pennies, int quota)
bool payfor (dbref who, int cost)
void add_quota (dbref who, int payment)
void giveto (dbref who, int pennies)
char * MakeCanonicalObjectName (const char *pName, int *pnName, bool *pbValid)
char * MakeCanonicalExitName (const char *pName, int *pnName, bool *pbValid)
bool ValidatePlayerName (const char *pName)
bool ok_password (const char *password, const char **pmsg)
void handle_ears (dbref thing, bool could_hear, bool can_hear)
void do_switch (dbref player, dbref caller, dbref enactor, int key, char *expr, char *args[], int nargs, char *cargs[], int ncargs)
void do_if (dbref player, dbref caller, dbref enactor, int key, char *expr, char *args[], int nargs, char *cargs[], int ncargs)
void do_addcommand (dbref player, dbref caller, dbref enactor, int key, int nargs, char *name, char *command)
void do_listcommands (dbref player, dbref caller, dbref enactor, int key, char *name)
void do_delcommand (dbref player, dbref caller, dbref enactor, int key, int nargs, char *name, char *command)
void handle_prog (DESC *d, char *message)
void do_quitprog (dbref player, dbref caller, dbref enactor, int key, char *name)
void do_prog (dbref player, dbref caller, dbref enactor, int key, int nargs, char *name, char *command)
void do_restart (dbref executor, dbref caller, dbref enactor, int key)
void do_backup (dbref player, dbref caller, dbref enactor, int key)
void do_comment (dbref player, dbref caller, dbref enactor, int key)
static dbref promote_dflt (dbref old, dbref new0)
dbref match_possessed (dbref player, dbref thing, char *target, dbref dflt, bool check_enter)
void parse_range (char **name, dbref *low_bound, dbref *high_bound)
bool parse_thing_slash (dbref player, char *thing, char **after, dbref *it)
bool get_obj_and_lock (dbref player, char *what, dbref *it, ATTR **attr, char *errmsg, char **bufc)
bool bCanReadAttr (dbref executor, dbref target, ATTR *tattr, bool bCheckParent)
bool bCanSetAttr (dbref executor, dbref target, ATTR *tattr)
bool bCanLockAttr (dbref executor, dbref target, ATTR *tattr)
dbref where_is (dbref what)
dbref where_room (dbref what)
bool locatable (dbref player, dbref it, dbref enactor)
bool nearby (dbref player, dbref thing)
bool exit_visible (dbref exit, dbref player, int key)
bool exit_displayable (dbref exit, dbref player, int key)
void did_it (dbref player, dbref thing, int what, const char *def, int owhat, const char *odef, int awhat, char *args[], int nargs)
void do_verb (dbref executor, dbref caller, dbref enactor, int key, char *victim_str, char *args[], int nargs)
void OutOfMemory (const char *SourceFile, unsigned int LineNo)
bool AssertionFailed (const char *SourceFile, unsigned int LineNo)


Function Documentation

void add_quota ( dbref  who,
int  payment 
)

Definition at line 276 of file predicates.cpp.

References A_RQUOTA, atr_add_raw(), atr_get, free_lbuf, mux_atol(), and mux_ltoa().

Referenced by chown_all(), destroy_obj(), do_chown(), and link_exit().

00277 {
00278     dbref aowner;
00279     int aflags;
00280     char buf[20];
00281 
00282     char *quota = atr_get(who, A_RQUOTA, &aowner, &aflags);
00283     mux_ltoa(mux_atol(quota) + payment, buf);
00284     free_lbuf(quota);
00285     atr_add_raw(who, A_RQUOTA, buf);
00286 }

bool AssertionFailed ( const char *  SourceFile,
unsigned int  LineNo 
)

Definition at line 2630 of file predicates.cpp.

References statedata::bCanRestart, statedata::bStandAlone, do_restart(), ENDLINE, CLogFile::Flush(), GOD, Log, mudstate, and CLogFile::tinyprintf().

02631 {
02632     Log.tinyprintf("%s(%u): Assertion failed." ENDLINE, SourceFile, LineNo);
02633     Log.Flush();
02634     if (  !mudstate.bStandAlone
02635        && mudstate.bCanRestart)
02636     {
02637         do_restart(GOD, GOD, GOD, 0);
02638     }
02639     else
02640     {
02641         abort();
02642     }
02643     return false;
02644 }

bool bCanLockAttr ( dbref  executor,
dbref  target,
ATTR tattr 
)

Definition at line 1980 of file predicates.cpp.

References AF_CONST, AF_GOD, AF_INTERNAL, AF_IS_LOCK, AF_WIZARD, atr_get_info(), attr::flags, God, attr::number, Owner, and Wizard.

Referenced by do_lock(), and do_unlock().

01981 {
01982     if (!tattr)
01983     {
01984         return false;
01985     }
01986 
01987     int mDeny = AF_INTERNAL|AF_IS_LOCK|AF_CONST;
01988     if (!God(executor))
01989     {
01990         if (God(target))
01991         {
01992             return false;
01993         }
01994         if (Wizard(executor))
01995         {
01996             mDeny = AF_INTERNAL|AF_IS_LOCK|AF_CONST|AF_GOD;
01997         }
01998         else
01999         {
02000             mDeny = AF_INTERNAL|AF_IS_LOCK|AF_CONST|AF_WIZARD|AF_GOD;
02001         }
02002     }
02003 
02004     dbref aowner;
02005     int aflags;
02006     if (  (tattr->flags & mDeny)
02007        || !atr_get_info(target, tattr->number, &aowner, &aflags)
02008        || (aflags & mDeny))
02009     {
02010         return false;
02011     }
02012     else if (  Wizard(executor)
02013             || Owner(executor) == aowner)
02014     {
02015         return true;
02016     }
02017     else
02018     {
02019         return false;
02020     }
02021 }

bool bCanReadAttr ( dbref  executor,
dbref  target,
ATTR tattr,
bool  bCheckParent 
)

Definition at line 1871 of file predicates.cpp.

References A_DESC, AF_DARK, AF_INTERNAL, AF_MDARK, AF_VISUAL, atr_get_info(), atr_pget_info(), statedata::bStandAlone, Examinable, attr::flags, God, mudconf, mudstate, nearby(), attr::number, Owner, confdata::read_rem_desc, and WizRoy.

Referenced by debug_examine(), do_decomp(), do_verb(), eval_boolexp(), exam_wildattrs(), find_wild_attrs(), FUNCTION(), get_handler(), hasattr_handler(), list_attraccess(), and look_atrs1().

01872 {
01873     if (!tattr)
01874     {
01875         return false;
01876     }
01877 
01878     dbref aowner;
01879     int aflags;
01880 
01881     if (  !mudstate.bStandAlone
01882        && bCheckParent)
01883     {
01884         atr_pget_info(target, tattr->number, &aowner, &aflags);
01885     }
01886     else
01887     {
01888         atr_get_info(target, tattr->number, &aowner, &aflags);
01889     }
01890 
01891     int mAllow = AF_VISUAL;
01892     if (  (tattr->flags & mAllow)
01893        || (aflags & mAllow))
01894     {
01895         if (  mudstate.bStandAlone
01896            || tattr->number != A_DESC
01897            || mudconf.read_rem_desc
01898            || nearby(executor, target))
01899         {
01900             return true;
01901         }
01902     }
01903     int mDeny = 0;
01904     if (WizRoy(executor))
01905     {
01906         if (God(executor))
01907         {
01908             mDeny = AF_INTERNAL;
01909         }
01910         else
01911         {
01912             mDeny = AF_INTERNAL|AF_DARK;
01913         }
01914     }
01915     else if (  Owner(executor) == aowner
01916             || Examinable(executor, target))
01917     {
01918         mDeny = AF_INTERNAL|AF_DARK|AF_MDARK;
01919     }
01920     if (mDeny)
01921     {
01922         if (  (tattr->flags & mDeny)
01923            || (aflags & mDeny))
01924         {
01925             return false;
01926         }
01927         else
01928         {
01929             return true;
01930         }
01931     }
01932     return false;
01933 }

bool bCanSetAttr ( dbref  executor,
dbref  target,
ATTR tattr 
)

Definition at line 1935 of file predicates.cpp.

References AF_CONST, AF_GOD, AF_INTERNAL, AF_IS_LOCK, AF_LOCK, AF_WIZARD, atr_get_info(), Controls, attr::flags, God, attr::number, and Wizard.

Referenced by do_alias(), do_chown(), do_edit(), do_mvattr(), do_notify(), do_set(), do_wait(), do_wipe(), FUNCTION(), set_attr_internal(), and CGuests::WipeAttrs().

01936 {
01937     if (!tattr)
01938     {
01939         return false;
01940     }
01941 
01942     int mDeny = AF_INTERNAL|AF_IS_LOCK|AF_CONST;
01943     if (!God(executor))
01944     {
01945         if (God(target))
01946         {
01947             return false;
01948         }
01949         if (Wizard(executor))
01950         {
01951             mDeny = AF_INTERNAL|AF_IS_LOCK|AF_CONST|AF_LOCK|AF_GOD;
01952         }
01953         else if (Controls(executor, target))
01954         {
01955             mDeny = AF_INTERNAL|AF_IS_LOCK|AF_CONST|AF_LOCK|AF_WIZARD|AF_GOD;
01956         }
01957         else
01958         {
01959             return false;
01960         }
01961     }
01962 
01963     dbref aowner;
01964     int aflags;
01965     if (  (tattr->flags & mDeny)
01966 #ifdef FIRANMUX
01967        || Immutable(target)
01968 #endif
01969        || (  atr_get_info(target, tattr->number, &aowner, &aflags)
01970           && (aflags & mDeny)))
01971     {
01972         return false;
01973     }
01974     else
01975     {
01976         return true;
01977     }
01978 }

bool can_see ( dbref  player,
dbref  thing,
bool  can_see_loc 
)

Definition at line 134 of file predicates.cpp.

References Connected, Dark, confdata::dark_sleepers, isExit, isPlayer, IsReal, Light, mudconf, MyopicExam, Puppet, and confdata::see_own_dark.

Referenced by look_contents().

00135 {
00136     // Don't show if all the following apply: Sleeping players should not be
00137     // seen.  The thing is a disconnected player.  The player is not a
00138     // puppet.
00139     //
00140     if (  mudconf.dark_sleepers
00141        && isPlayer(thing)
00142        && !Connected(thing)
00143        && !Puppet(thing))
00144     {
00145         return false;
00146     }
00147 
00148     // You don't see yourself or exits.
00149     //
00150     if (  player == thing
00151        || isExit(thing))
00152     {
00153         return false;
00154     }
00155 
00156     // If loc is not dark, you see it if it's not dark or you control it.  If
00157     // loc is dark, you see it if you control it.  Seeing your own dark
00158     // objects is controlled by mudconf.see_own_dark.  In dark locations, you
00159     // also see things that are LIGHT and !DARK.
00160     //
00161     if (can_see_loc)
00162     {
00163 #ifdef REALITY_LVLS
00164        return ((!Dark(thing) && IsReal(player, thing)) ||
00165 #else
00166         return (!Dark(thing) ||
00167 #endif /* REALITY_LVLS */
00168             (mudconf.see_own_dark && MyopicExam(player, thing)));
00169     }
00170     else
00171     {
00172 #ifdef REALITY_LVLS
00173         return ((Light(thing) && !Dark(thing) && IsReal(player, thing)) ||
00174 #else
00175         return ((Light(thing) && !Dark(thing)) ||
00176 #endif /* REALITY_LVLS */
00177             (mudconf.see_own_dark && MyopicExam(player, thing)));
00178     }
00179 }

bool canpayfees ( dbref  player,
dbref  who,
int  pennies,
int  quota 
)

Definition at line 217 of file predicates.cpp.

References Free_Money, confdata::many_coins, mudconf, notify, Owner, pay_quota(), payfor(), Pennies(), confdata::quotas, tprintf(), and Wizard.

Referenced by create_obj(), do_chown(), and link_exit().

00218 {
00219     if (  !Wizard(who)
00220        && !Wizard(Owner(who))
00221        && !Free_Money(who)
00222        && !Free_Money(Owner(who))
00223        && (Pennies(Owner(who)) < pennies))
00224     {
00225         if (player == who)
00226         {
00227             notify(player, tprintf("Sorry, you don't have enough %s.",
00228                        mudconf.many_coins));
00229         }
00230         else
00231         {
00232             notify(player, tprintf("Sorry, that player doesn't have enough %s.",
00233                 mudconf.many_coins));
00234         }
00235         return false;
00236     }
00237     if (mudconf.quotas)
00238     {
00239         if (!pay_quota(who, quota))
00240         {
00241             if (player == who)
00242             {
00243                 notify(player, "Sorry, your building contract has run out.");
00244             }
00245             else
00246             {
00247                 notify(player,
00248                     "Sorry, that player's building contract has run out.");
00249             }
00250             return false;
00251         }
00252     }
00253     payfor(who, pennies);
00254     return true;
00255 }

bool could_doit ( dbref  player,
dbref  thing,
int  locknum 
)

Definition at line 107 of file predicates.cpp.

References atr_get, eval_boolexp_atr(), free_lbuf, HOME, isPlayer, Key, and Pass_Locks.

Referenced by atr_match1(), check_zone_handler(), do_drop(), do_enter_internal(), do_get(), do_leave(), do_link(), do_teleport_single(), do_use(), fwdlist_load(), give_money(), give_thing(), link_exit(), look_in(), mail_check(), move_exit(), move_via_teleport(), notify_check(), open_exit(), page_check(), promote_match(), sp_ok(), test_join_access(), test_receive_access(), and test_transmit_access().

00108 {
00109     if (thing == HOME)
00110     {
00111         return true;
00112     }
00113 
00114     // If nonplayer tries to get key, then no.
00115     //
00116     if (  !isPlayer(player)
00117        && Key(thing))
00118     {
00119         return false;
00120     }
00121     if (Pass_Locks(player))
00122     {
00123         return true;
00124     }
00125 
00126     dbref aowner;
00127     int   aflags;
00128     char *key = atr_get(thing, locknum, &aowner, &aflags);
00129     bool doit = eval_boolexp_atr(player, thing, thing, key);
00130     free_lbuf(key);
00131     return doit;
00132 }

void did_it ( dbref  player,
dbref  thing,
int  what,
const char *  def,
int  owhat,
const char *  odef,
int  awhat,
char *  args[],
int  nargs 
)

Definition at line 2261 of file predicates.cpp.

References A_CHARGES, A_RUNOUT, AF_HTML, alloc_lbuf, alloc_sbuf, atr_add_raw(), atr_pget, CMuxAlarm::bAlarmed, EV_EVAL, EV_FCHECK, EV_FIGNORE, EV_TOP, free_lbuf, free_sbuf, statedata::global_regs, Good_obj, Has_location, Html, IsReal, Location, MAX_GLOBAL_REGS, mudstate, mux_atol(), mux_exec(), mux_ltoa(), MuxAlarm, Name, NOTHING, notify, notify_except2(), notify_except2_rlevel(), notify_html, PopIntegers(), PopPointers(), PushIntegers(), PushPointers(), restore_global_regs(), safe_str, save_global_regs(), tprintf(), and wait_que().

Referenced by check_events(), do_clone(), do_drop(), do_enter_internal(), do_get(), do_kill(), do_leave(), do_teleport_single(), do_trigger(), do_use(), do_verb(), give_money(), give_thing(), look_in(), look_simple(), move_exit(), move_via_exit(), move_via_generic(), move_via_teleport(), notify_check(), process_enter_loc(), process_leave_loc(), process_preload(), send_mail(), show_a_desc(), and show_desc().

02263 {
02264     if (MuxAlarm.bAlarmed)
02265     {
02266         return;
02267     }
02268 
02269     char *d, *buff, *act, *charges, *bp, *str;
02270     dbref loc, aowner;
02271     int num, aflags;
02272 
02273     // If we need to call exec() from within this function, we first save
02274     // the state of the global registers, in order to avoid munging them
02275     // inappropriately. Do note that the restoration to their original
02276     // values occurs BEFORE the execution of the @a-attribute. Therefore,
02277     // any changing of setq() values done in the @-attribute and @o-attribute
02278     // will NOT be passed on. This prevents odd behaviors that result from
02279     // odd @verbs and so forth (the idea is to preserve the caller's control
02280     // of the global register values).
02281     //
02282 
02283     bool need_pres = false;
02284     char **preserve = NULL;
02285     int *preserve_len = NULL;
02286 
02287     // message to player.
02288     //
02289     if (what > 0)
02290     {
02291         d = atr_pget(thing, what, &aowner, &aflags);
02292         if (*d)
02293         {
02294             need_pres = true;
02295             preserve = PushPointers(MAX_GLOBAL_REGS);
02296             preserve_len = PushIntegers(MAX_GLOBAL_REGS);
02297             save_global_regs("did_it_save", preserve, preserve_len);
02298             buff = bp = alloc_lbuf("did_it.1");
02299             str = d;
02300             mux_exec(buff, &bp, thing, player, player,
02301                 EV_EVAL | EV_FIGNORE | EV_FCHECK | EV_TOP, &str, args, nargs);
02302             *bp = '\0';
02303             if (  (aflags & AF_HTML)
02304                && Html(player))
02305             {
02306                 safe_str("\r\n", buff, &bp);
02307                 *bp = '\0';
02308                 notify_html(player, buff);
02309             }
02310             else
02311             {
02312                 notify(player, buff);
02313             }
02314             free_lbuf(buff);
02315         }
02316         else if (def)
02317         {
02318             notify(player, def);
02319         }
02320         free_lbuf(d);
02321     }
02322     if (what < 0 && def)
02323     {
02324         notify(player, def);
02325     }
02326 
02327     // message to neighbors.
02328     //
02329     if (  owhat > 0
02330        && Has_location(player)
02331        && Good_obj(loc = Location(player)))
02332     {
02333         d = atr_pget(thing, owhat, &aowner, &aflags);
02334         if (*d)
02335         {
02336             if (!need_pres)
02337             {
02338                 need_pres = true;
02339                 preserve = PushPointers(MAX_GLOBAL_REGS);
02340                 preserve_len = PushIntegers(MAX_GLOBAL_REGS);
02341                 save_global_regs("did_it_save", preserve, preserve_len);
02342             }
02343             buff = bp = alloc_lbuf("did_it.2");
02344             str = d;
02345             mux_exec(buff, &bp, thing, player, player,
02346                      EV_EVAL | EV_FIGNORE | EV_FCHECK | EV_TOP, &str, args, nargs);
02347             *bp = '\0';
02348             if (*buff)
02349             {
02350 #ifdef REALITY_LVLS
02351                 notify_except2_rlevel(loc, player, player, thing, tprintf("%s %s", Name(player), buff));
02352 #else
02353                 notify_except2(loc, player, player, thing, tprintf("%s %s", Name(player), buff));
02354 #endif /* REALITY_LVLS */
02355             }
02356             free_lbuf(buff);
02357         }
02358         else if (odef)
02359         {
02360 #ifdef REALITY_LVLS
02361             notify_except2_rlevel(loc, player, player, thing, tprintf("%s %s", Name(player), odef));
02362 #else
02363             notify_except2(loc, player, player, thing, tprintf("%s %s", Name(player), odef));
02364 #endif /* REALITY_LVLS */
02365         }
02366         free_lbuf(d);
02367     }
02368     if (  owhat < 0
02369        && odef
02370        && Has_location(player)
02371        && Good_obj(loc = Location(player)))
02372     {
02373 #ifdef REALITY_LVLS
02374         notify_except2_rlevel(loc, player, player, thing, tprintf("%s %s", Name(player), odef));
02375 #else
02376         notify_except2(loc, player, player, thing, tprintf("%s %s", Name(player), odef));
02377 #endif /* REALITY_LVLS */
02378     }
02379 
02380     // If we preserved the state of the global registers, restore them.
02381     //
02382     if (need_pres)
02383     {
02384         restore_global_regs("did_it_restore", preserve, preserve_len);
02385         PopIntegers(preserve_len, MAX_GLOBAL_REGS);
02386         PopPointers(preserve, MAX_GLOBAL_REGS);
02387     }
02388 
02389     // do the action attribute.
02390     //
02391 #ifdef REALITY_LVLS
02392     if (awhat > 0 && IsReal(thing, player))
02393 #else
02394     if (awhat > 0)
02395 #endif /* REALITY_LVLS */
02396     {
02397         if (*(act = atr_pget(thing, awhat, &aowner, &aflags)))
02398         {
02399             charges = atr_pget(thing, A_CHARGES, &aowner, &aflags);
02400             if (*charges)
02401             {
02402                 num = mux_atol(charges);
02403                 if (num > 0)
02404                 {
02405                     buff = alloc_sbuf("did_it.charges");
02406                     mux_ltoa(num-1, buff);
02407                     atr_add_raw(thing, A_CHARGES, buff);
02408                     free_sbuf(buff);
02409                 }
02410                 else if (*(buff = atr_pget(thing, A_RUNOUT, &aowner, &aflags)))
02411                 {
02412                     free_lbuf(act);
02413                     act = buff;
02414                 }
02415                 else
02416                 {
02417                     free_lbuf(act);
02418                     free_lbuf(buff);
02419                     free_lbuf(charges);
02420                     return;
02421                 }
02422             }
02423             free_lbuf(charges);
02424             CLinearTimeAbsolute lta;
02425             wait_que(thing, player, player, false, lta, NOTHING, 0, act,
02426                 args, nargs, mudstate.global_regs);
02427         }
02428         free_lbuf(act);
02429     }
02430 }

void do_addcommand ( dbref  player,
dbref  caller,
dbref  enactor,
int  key,
int  nargs,
char *  name,
char *  command 
)

Definition at line 768 of file predicates.cpp.

References CMDENT::addent, addedentry::atr, CMDENT::callseq, CMDENT::cmdname, statedata::command_htab, CS_ADDED, CS_LEADIN, CS_ONE_ARG, CMDENT::extra, hashaddLEN(), hashdeleteLEN(), hashfindLEN(), hashreplall(), CMDENT::hookmask, ISOUTOFMEMORY, MEMALLOC, mudstate, mux_strlwr(), addedentry::name, addedentry::next, NOPERM_MESSAGE, notify, attr::number, parse_attrib(), CMDENT::perms, RemoveSetOfCharacters(), See_attr, set_prefix_cmds(), StringClone(), strip_ansi(), CMDENT::switches, addedentry::thing, tprintf(), and UNUSED_PARAMETER.

00777 {
00778     UNUSED_PARAMETER(caller);
00779     UNUSED_PARAMETER(enactor);
00780     UNUSED_PARAMETER(key);
00781 
00782     // Validate command name.
00783     //
00784     char *pName = NULL;
00785     if (1 <= nargs)
00786     {
00787         char *pStripped = strip_ansi(name);
00788         pName = RemoveSetOfCharacters(pStripped, "\r\n\t ");
00789         mux_strlwr(pName);
00790     }
00791     if (  !pName
00792        || pName[0] == '\0'
00793        || (  pName[0] == '_'
00794           && pName[1] == '_'))
00795     {
00796         notify(player, "That is not a valid command name.");
00797         return;
00798     }
00799 
00800     // Validate object/attribute.
00801     //
00802     dbref thing;
00803     ATTR *pattr;
00804     if (  !parse_attrib(player, command, &thing, &pattr)
00805        || !pattr)
00806     {
00807         notify(player, "No such attribute.");
00808         return;
00809     }
00810     if (!See_attr(player, thing, pattr))
00811     {
00812         notify(player, NOPERM_MESSAGE);
00813         return;
00814     }
00815 
00816     CMDENT *old = (CMDENT *)hashfindLEN(pName, strlen(pName),
00817         &mudstate.command_htab);
00818 
00819     CMDENT *cmd;
00820     ADDENT *add, *nextp;
00821 
00822     if (  old
00823        && (old->callseq & CS_ADDED))
00824     {
00825         // Don't allow the same (thing,atr) in the list.
00826         //
00827         for (nextp = old->addent; nextp != NULL; nextp = nextp->next)
00828         {
00829             if (  nextp->thing == thing
00830                && nextp->atr == pattr->number)
00831             {
00832                 notify(player, tprintf("%s already added.", pName));
00833                 return;
00834             }
00835         }
00836 
00837         // Otherwise, add another (thing,atr) to the list.
00838         //
00839         add = (ADDENT *)MEMALLOC(sizeof(ADDENT));
00840         ISOUTOFMEMORY(add);
00841         add->thing = thing;
00842         add->atr = pattr->number;
00843         add->name = StringClone(pName);
00844         add->next = old->addent;
00845         old->addent = add;
00846     }
00847     else
00848     {
00849         if (old)
00850         {
00851             // Delete the old built-in (which will later be added back as
00852             // __name).
00853             //
00854             hashdeleteLEN(pName, strlen(pName), &mudstate.command_htab);
00855         }
00856 
00857         cmd = (CMDENT *)MEMALLOC(sizeof(CMDENT));
00858         ISOUTOFMEMORY(cmd);
00859         cmd->cmdname = StringClone(pName);
00860         cmd->switches = NULL;
00861         cmd->perms = 0;
00862         cmd->extra = 0;
00863         if (  old
00864            && (old->callseq & CS_LEADIN))
00865         {
00866             cmd->callseq = CS_ADDED|CS_ONE_ARG|CS_LEADIN;
00867         }
00868         else
00869         {
00870             cmd->callseq = CS_ADDED|CS_ONE_ARG;
00871         }
00872         cmd->hookmask = 0;
00873         add = (ADDENT *)MEMALLOC(sizeof(ADDENT));
00874         ISOUTOFMEMORY(add);
00875         add->thing = thing;
00876         add->atr = pattr->number;
00877         add->name = StringClone(pName);
00878         add->next = NULL;
00879         cmd->addent = add;
00880 
00881         hashaddLEN(pName, strlen(pName), cmd, &mudstate.command_htab);
00882 
00883         if (  old
00884            && strcmp(pName, old->cmdname) == 0)
00885         {
00886             // We are @addcommand'ing over a built-in command by its
00887             // unaliased name, therefore, we want to re-target all the
00888             // aliases.
00889             //
00890             char *p = tprintf("__%s", pName);
00891             hashdeleteLEN(p, strlen(p), &mudstate.command_htab);
00892             hashreplall(old, cmd, &mudstate.command_htab);
00893             hashaddLEN(p, strlen(p), old, &mudstate.command_htab);
00894         }
00895     }
00896 
00897     // We reset the one letter commands here so you can overload them.
00898     //
00899     set_prefix_cmds();
00900     notify(player, tprintf("Command %s added.", pName));
00901 }

void do_backup ( dbref  player,
dbref  caller,
dbref  enactor,
int  key 
)

Definition at line 1540 of file predicates.cpp.

References dump_database_internal(), DUMP_I_FLAT, DUMP_I_NORMAL, statedata::dumping, ENDLOG, confdata::indb, LOG_ALWAYS, log_name(), log_text(), mudconf, mudstate, notify, raw_broadcast(), STARTLOG, and tprintf().

01541 {
01542 #ifndef WIN32
01543     if (mudstate.dumping)
01544     {
01545         notify(player, "Dumping. Please try again later.");
01546     }
01547 #endif // !WIN32
01548 
01549     raw_broadcast(0, "GAME: Backing up database. Please wait.");
01550     STARTLOG(LOG_ALWAYS, "WIZ", "BACK");
01551     log_text("Backup by ");
01552     log_name(player);
01553     ENDLOG;
01554 
01555 #ifdef MEMORY_BASED
01556     // Invoking _backupflat.sh with an argument prompts the backup script
01557     // to use it as the flatfile.
01558     //
01559     dump_database_internal(DUMP_I_FLAT);
01560     system(tprintf("./_backupflat.sh %s.FLAT 1>&2", mudconf.indb));
01561 #else // MEMORY_BASED
01562     // Invoking _backupflat.sh without an argument prompts the backup script
01563     // to use dbconvert itself.
01564     //
01565     dump_database_internal(DUMP_I_NORMAL);
01566     system(tprintf("./_backupflat.sh 1>&2"));
01567 #endif // MEMORY_BASED
01568     raw_broadcast(0, "GAME: Backup finished.");
01569 }

void do_comment ( dbref  player,
dbref  caller,
dbref  enactor,
int  key 
)

Definition at line 1576 of file predicates.cpp.

References UNUSED_PARAMETER.

01577 {
01578     UNUSED_PARAMETER(player);
01579     UNUSED_PARAMETER(caller);
01580     UNUSED_PARAMETER(enactor);
01581     UNUSED_PARAMETER(key);
01582 }

void do_delcommand ( dbref  player,
dbref  caller,
dbref  enactor,
int  key,
int  nargs,
char *  name,
char *  command 
)

Definition at line 982 of file predicates.cpp.

References CMDENT::addent, CMDENT::callseq, CMDENT::cmdname, statedata::command_htab, CS_ADDED, hashaddLEN(), hashdeleteLEN(), hashfindLEN(), hashreplall(), MEMFREE, mudstate, mux_strlwr(), addedentry::name, addedentry::next, NOPERM_MESSAGE, NOTHING, notify, attr::number, parse_attrib(), See_attr, set_prefix_cmds(), tprintf(), and UNUSED_PARAMETER.

00991 {
00992     UNUSED_PARAMETER(caller);
00993     UNUSED_PARAMETER(enactor);
00994     UNUSED_PARAMETER(key);
00995     UNUSED_PARAMETER(nargs);
00996 
00997     if (!*name)
00998     {
00999         notify(player, "Sorry.");
01000         return;
01001     }
01002 
01003     dbref thing = NOTHING;
01004     int atr = NOTHING;
01005     ATTR *pattr;
01006     if (*command)
01007     {
01008         if (  !parse_attrib(player, command, &thing, &pattr)
01009            || !pattr)
01010         {
01011             notify(player, "No such attribute.");
01012             return;
01013         }
01014         if (!See_attr(player, thing, pattr))
01015         {
01016             notify(player, NOPERM_MESSAGE);
01017             return;
01018         }
01019         atr = pattr->number;
01020     }
01021 
01022     // Let's make this case insensitive...
01023     //
01024     mux_strlwr(name);
01025 
01026     CMDENT *old, *cmd;
01027     ADDENT *prev = NULL, *nextp;
01028     size_t nName = strlen(name);
01029     old = (CMDENT *)hashfindLEN(name, nName, &mudstate.command_htab);
01030 
01031     if (  old
01032        && (old->callseq & CS_ADDED))
01033     {
01034         char *p__Name = tprintf("__%s", name);
01035         size_t n__Name = strlen(p__Name);
01036 
01037         if (command[0] == '\0')
01038         {
01039             // Delete all @addcommand'ed associations with the given name.
01040             //
01041             for (prev = old->addent; prev != NULL; prev = nextp)
01042             {
01043                 nextp = prev->next;
01044                 MEMFREE(prev->name);
01045                 prev->name = NULL;
01046                 MEMFREE(prev);
01047                 prev = NULL;
01048             }
01049             hashdeleteLEN(name, nName, &mudstate.command_htab);
01050             cmd = (CMDENT *)hashfindLEN(p__Name, n__Name, &mudstate.command_htab);
01051             if (cmd)
01052             {
01053                 hashaddLEN(cmd->cmdname, strlen(cmd->cmdname), cmd,
01054                     &mudstate.command_htab);
01055                 if (strcmp(name, cmd->cmdname) != 0)
01056                 {
01057                     hashaddLEN(name, nName, cmd, &mudstate.command_htab);
01058                 }
01059 
01060                 hashdeleteLEN(p__Name, n__Name, &mudstate.command_htab);
01061                 hashaddLEN(p__Name, n__Name, cmd, &mudstate.command_htab);
01062                 hashreplall(old, cmd, &mudstate.command_htab);
01063             }
01064             else
01065             {
01066                 // TODO: Delete everything related to 'old'.
01067                 //
01068             }
01069             MEMFREE(old->cmdname);
01070             old->cmdname = NULL;
01071             MEMFREE(old);
01072             old = NULL;
01073             set_prefix_cmds();
01074             notify(player, "Done.");
01075         }
01076         else
01077         {
01078             // Remove only the (name,thing,atr) association.
01079             //
01080             for (nextp = old->addent; nextp != NULL; nextp = nextp->next)
01081             {
01082                 if (  nextp->thing == thing
01083                    && nextp->atr == atr)
01084                 {
01085                     MEMFREE(nextp->name);
01086                     nextp->name = NULL;
01087                     if (!prev)
01088                     {
01089                         if (!nextp->next)
01090                         {
01091                             hashdeleteLEN(name, nName, &mudstate.command_htab);
01092                             cmd = (CMDENT *)hashfindLEN(p__Name, n__Name,
01093                                 &mudstate.command_htab);
01094                             if (cmd)
01095                             {
01096                                 hashaddLEN(cmd->cmdname, strlen(cmd->cmdname),
01097                                     cmd, &mudstate.command_htab);
01098                                 if (strcmp(name, cmd->cmdname) != 0)
01099                                 {
01100                                     hashaddLEN(name, nName, cmd,
01101                                         &mudstate.command_htab);
01102                                 }
01103 
01104                                 hashdeleteLEN(p__Name, n__Name,
01105                                     &mudstate.command_htab);
01106                                 hashaddLEN(p__Name, n__Name, cmd,
01107                                     &mudstate.command_htab);
01108                                 hashreplall(old, cmd,
01109                                     &mudstate.command_htab);
01110                             }
01111                             MEMFREE(old->cmdname);
01112                             old->cmdname = NULL;
01113                             MEMFREE(old);
01114                             old = NULL;
01115                         }
01116                         else
01117                         {
01118                             old->addent = nextp->next;
01119                             MEMFREE(nextp);
01120                             nextp = NULL;
01121                         }
01122                     }
01123                     else
01124                     {
01125                         prev->next = nextp->next;
01126                         MEMFREE(nextp);
01127                         nextp = NULL;
01128                     }
01129                     set_prefix_cmds();
01130                     notify(player, "Done.");
01131                     return;
01132                 }
01133                 prev = nextp;
01134             }
01135             notify(player, "Command not found in command table.");
01136         }
01137     }
01138     else
01139     {
01140         notify(player, "Command not found in command table.");
01141     }
01142 }

void do_if ( dbref  player,
dbref  caller,
dbref  enactor,
int  key,
char *  expr,
char *  args[],
int  nargs,
char *  cargs[],
int  ncargs 
)

Definition at line 729 of file predicates.cpp.

References alloc_lbuf, EV_EVAL, EV_FCHECK, EV_TOP, free_lbuf, statedata::global_regs, mudstate, mux_exec(), NOTHING, UNUSED_PARAMETER, wait_que(), and xlate().

00740 {
00741     UNUSED_PARAMETER(key);
00742 
00743     if (  !expr
00744        || nargs <= 0)
00745     {
00746         return;
00747     }
00748 
00749     char *buff, *bp;
00750     CLinearTimeAbsolute lta;
00751     buff = bp = alloc_lbuf("do_if");
00752 
00753     mux_exec(buff, &bp, player, caller, enactor, EV_FCHECK | EV_EVAL | EV_TOP,
00754         &expr, cargs, ncargs);
00755     *bp = '\0';
00756 
00757     int a = !xlate(buff);
00758     free_lbuf(buff);
00759 
00760     if (a < nargs)
00761     {
00762         wait_que(player, caller, enactor, false, lta, NOTHING, 0, args[a],
00763             cargs, ncargs, mudstate.global_regs);
00764     }
00765 }

void do_listcommands ( dbref  player,
dbref  caller,
dbref  enactor,
int  key,
char *  name 
)

Definition at line 903 of file predicates.cpp.

References CMDENT::addent, addedentry::atr, atr_num(), CMDENT::callseq, statedata::command_htab, CS_ADDED, hash_firstkey(), hash_nextkey(), hashfindLEN(), mudstate, mux_strlwr(), addedentry::name, attr::name, addedentry::next, notify, addedentry::thing, tprintf(), and UNUSED_PARAMETER.

00905 {
00906     UNUSED_PARAMETER(caller);
00907     UNUSED_PARAMETER(enactor);
00908     UNUSED_PARAMETER(key);
00909 
00910     CMDENT *old;
00911     ADDENT *nextp;
00912     bool didit = false;
00913 
00914     // Let's make this case insensitive...
00915     //
00916     mux_strlwr(name);
00917 
00918     if (*name)
00919     {
00920         old = (CMDENT *)hashfindLEN(name, strlen(name), &mudstate.command_htab);
00921 
00922         if (  old
00923            && (old->callseq & CS_ADDED))
00924         {
00925             // If it's already found in the hash table, and it's being added
00926             // using the same object and attribute...
00927             //
00928             for (nextp = old->addent; nextp != NULL; nextp = nextp->next)
00929             {
00930                 ATTR *ap = (ATTR *)atr_num(nextp->atr);
00931                 const char *pName = "(WARNING: Bad Attribute Number)";
00932                 if (ap)
00933                 {
00934                     pName = ap->name;
00935                 }
00936                 notify(player, tprintf("%s: #%d/%s", nextp->name, nextp->thing, pName));
00937             }
00938         }
00939         else
00940         {
00941             notify(player, tprintf("%s not found in command table.",name));
00942         }
00943         return;
00944     }
00945     else
00946     {
00947         char *pKeyName;
00948         int  nKeyName;
00949         for (old = (CMDENT *)hash_firstkey(&mudstate.command_htab, &nKeyName, &pKeyName);
00950              old != NULL;
00951              old = (CMDENT *)hash_nextkey(&mudstate.command_htab, &nKeyName, &pKeyName))
00952         {
00953             if (old->callseq & CS_ADDED)
00954             {
00955                 pKeyName[nKeyName] = '\0';
00956                 for (nextp = old->addent; nextp != NULL; nextp = nextp->next)
00957                 {
00958                     if (strcmp(pKeyName, nextp->name) != 0)
00959                     {
00960                         continue;
00961                     }
00962                     ATTR *ap = (ATTR *)atr_num(nextp->atr);
00963                     const char *pName = "(WARNING: Bad Attribute Number)";
00964                     if (ap)
00965                     {
00966                         pName = ap->name;
00967                     }
00968                     notify(player, tprintf("%s: #%d/%s", nextp->name,
00969                         nextp->thing, pName));
00970                     didit = true;
00971                 }
00972             }
00973         }
00974     }
00975     if (!didit)
00976     {
00977         notify(player, "No added commands found in command table.");
00978     }
00979 }

void do_prog ( dbref  player,
dbref  caller,
dbref  enactor,
int  key,
int  nargs,
char *  name,
char *  command 
)

Definition at line 1296 of file predicates.cpp.

References A_PROGCMD, alloc_lbuf, ANSI_HILITE, ANSI_NORMAL, atr_add_raw(), atr_get, Connected, DESC_ITER_PLAYER, free_lbuf, statedata::glob_reg_len, statedata::global_regs, God, Good_obj, ISOUTOFMEMORY, isPlayer, ITER_PARENTS, match_thing(), MAX_GLOBAL_REGS, MEMALLOC, msg, mudstate, NOMATCH_MESSAGE, NOPERM_MESSAGE, notify, attr::number, NVT_EOR, NVT_GA, NVT_IAC, OPTION_YES, Owner, parse_attrib(), parse_to(), Prog, descriptor_data::program_data, queue_string(), queue_write_LEN(), See_attr, TELNET_EOR, TELNET_SGA, tprintf(), UNUSED_PARAMETER, UsState(), prog_data::wait_enactor, and prog_data::wait_regs.

01305 {
01306     UNUSED_PARAMETER(caller);
01307     UNUSED_PARAMETER(enactor);
01308     UNUSED_PARAMETER(key);
01309     UNUSED_PARAMETER(nargs);
01310 
01311     if (  !name
01312        || !*name)
01313     {
01314         notify(player, "No players specified.");
01315         return;
01316     }
01317 
01318     dbref doer = match_thing(player, name);
01319     if (  !(  Prog(player)
01320            || Prog(Owner(player)))
01321        && player != doer)
01322     {
01323         notify(player, NOPERM_MESSAGE);
01324         return;
01325     }
01326     if (  !Good_obj(doer)
01327        || !isPlayer(doer))
01328     {
01329         notify(player, "That is not a player.");
01330         return;
01331     }
01332     if (!Connected(doer))
01333     {
01334         notify(player, "That player is not connected.");
01335         return;
01336     }
01337     char *msg = command;
01338     char *attrib = parse_to(&msg, ':', 1);
01339 
01340     if (msg && *msg)
01341     {
01342         notify(doer, msg);
01343     }
01344 
01345     dbref thing;
01346     ATTR *ap;
01347     if (!parse_attrib(player, attrib, &thing, &ap))
01348     {
01349         notify(player, NOMATCH_MESSAGE);
01350         return;
01351     }
01352     if (ap)
01353     {
01354         dbref aowner;
01355         int   aflags;
01356         int   lev;
01357         dbref parent;
01358         char *pBuffer = NULL;
01359         bool bFound = false;
01360         ITER_PARENTS(thing, parent, lev)
01361         {
01362             pBuffer = atr_get(parent, ap->number, &aowner, &aflags);
01363             if (pBuffer[0])
01364             {
01365                 bFound = true;
01366                 break;
01367             }
01368             free_lbuf(pBuffer);
01369         }
01370         if (bFound)
01371         {
01372             if (  (   God(player)
01373                   || !God(thing))
01374                && See_attr(player, thing, ap))
01375             {
01376                 atr_add_raw(doer, A_PROGCMD, pBuffer);
01377             }
01378             else
01379             {
01380                 notify(player, NOPERM_MESSAGE);
01381                 free_lbuf(pBuffer);
01382                 return;
01383             }
01384             free_lbuf(pBuffer);
01385         }
01386         else
01387         {
01388             notify(player, "Attribute not present on object.");
01389             return;
01390         }
01391     }
01392     else
01393     {
01394         notify(player, "No such attribute.");
01395         return;
01396     }
01397 
01398     // Check to see if the enactor already has an @prog input pending.
01399     //
01400     DESC *d;
01401     DESC_ITER_PLAYER(doer, d)
01402     {
01403         if (d->program_data != NULL)
01404         {
01405             notify(player, "Input already pending.");
01406             return;
01407         }
01408     }
01409 
01410     PROG *program = (PROG *)MEMALLOC(sizeof(PROG));
01411     ISOUTOFMEMORY(program);
01412     program->wait_enactor = player;
01413     for (int i = 0; i < MAX_GLOBAL_REGS; i++)
01414     {
01415         program->wait_regs[i] = alloc_lbuf("prog_regs");
01416         memcpy(program->wait_regs[i], mudstate.global_regs[i], mudstate.glob_reg_len[i]+1);
01417     }
01418 
01419     // Now, start waiting.
01420     //
01421     DESC_ITER_PLAYER(doer, d)
01422     {
01423         d->program_data = program;
01424 
01425         queue_string(d, tprintf("%s>%s ", ANSI_HILITE, ANSI_NORMAL));
01426 
01427         if (OPTION_YES == UsState(d, TELNET_EOR))
01428         {
01429             // Use telnet protocol's EOR command to show prompt.
01430             //
01431             const char aEOR[2] = { NVT_IAC, NVT_EOR };
01432             queue_write_LEN(d, aEOR, sizeof(aEOR));
01433         }
01434         else if (OPTION_YES != UsState(d, TELNET_SGA))
01435         {
01436             // Use telnet protocol's GOAHEAD command to show prompt.
01437             //
01438             const char aGoAhead[2] = { NVT_IAC, NVT_GA };
01439             queue_write_LEN(d, aGoAhead, sizeof(aGoAhead));
01440         }
01441     }
01442 }

void do_quitprog ( dbref  player,
dbref  caller,
dbref  enactor,
int  key,
char *  name 
)

Definition at line 1215 of file predicates.cpp.

References Connected, statedata::desc_htab, DESC_ITER_PLAYER, free_lbuf, Good_obj, hashfindLEN(), isPlayer, match_thing(), MAX_GLOBAL_REGS, MEMFREE, mudstate, NOPERM_MESSAGE, notify, Owner, Prog, descriptor_data::program_data, UNUSED_PARAMETER, and prog_data::wait_regs.

01216 {
01217     UNUSED_PARAMETER(caller);
01218     UNUSED_PARAMETER(enactor);
01219     UNUSED_PARAMETER(key);
01220 
01221     dbref doer;
01222 
01223     if (*name)
01224     {
01225         doer = match_thing(player, name);
01226     }
01227     else
01228     {
01229         doer = player;
01230     }
01231 
01232     if (  !(  Prog(player)
01233            || Prog(Owner(player)))
01234        && player != doer)
01235     {
01236         notify(player, NOPERM_MESSAGE);
01237         return;
01238     }
01239     if (  !Good_obj(doer)
01240        || !isPlayer(doer))
01241     {
01242         notify(player, "That is not a player.");
01243         return;
01244     }
01245     if (!Connected(doer))
01246     {
01247         notify(player, "That player is not connected.");
01248         return;
01249     }
01250     DESC *d;
01251     bool isprog = false;
01252     DESC_ITER_PLAYER(doer, d)
01253     {
01254         if (d->program_data != NULL)
01255         {
01256             isprog = true;
01257         }
01258     }
01259 
01260     if (!isprog)
01261     {
01262         notify(player, "Player is not in an @program.");
01263         return;
01264     }
01265 
01266     d = (DESC *)hashfindLEN(&doer, sizeof(doer), &mudstate.desc_htab);
01267     int i;
01268 
01269     if (d && d->program_data)
01270     {
01271         for (i = 0; i < MAX_GLOBAL_REGS; i++)
01272         {
01273             if (d->program_data->wait_regs[i])
01274             {
01275                 free_lbuf(d->program_data->wait_regs[i]);
01276                 d->program_data->wait_regs[i] = NULL;
01277             }
01278         }
01279         MEMFREE(d->program_data);
01280         d->program_data = NULL;
01281 
01282         // Set info for all player descriptors to NULL.
01283         //
01284         DESC_ITER_PLAYER(doer, d)
01285         {
01286             d->program_data = NULL;
01287         }
01288     }
01289 
01290     atr_clr(doer, A_PROGCMD);
01291     notify(player, "@program cleared.");
01292     notify(doer, "Your @program has been terminated.");
01293 }

void do_restart ( dbref  executor,
dbref  caller,
dbref  enactor,
int  key 
)

Definition at line 1447 of file predicates.cpp.

References al_store(), statedata::bCanRestart, Can_SiteAdmin, CleanUpSlaveProcess(), CleanUpSlaveSocket(), CLOSE, confdata::config_file, dump_database_internal(), DUMP_I_RESTART, dump_restart_db(), statedata::dumping, ENDLOG, local_presync_database(), Log, LOG_ALWAYS, log_name(), log_text(), confdata::mud_name, mudconf, mudstate, Name, NOPERM_MESSAGE, notify, Owner, pcache_sync(), confdata::pid_file, raw_broadcast(), STARTLOG, CLogFile::StopLogging(), SYNC, and UNUSED_PARAMETER.

Referenced by AssertionFailed(), OutOfMemory(), and sighandler().

01448 {
01449     UNUSED_PARAMETER(caller);
01450     UNUSED_PARAMETER(enactor);
01451     UNUSED_PARAMETER(key);
01452 
01453     if (!Can_SiteAdmin(executor))
01454     {
01455         notify(executor, NOPERM_MESSAGE);
01456         return;
01457     }
01458 
01459     bool bDenied = false;
01460 #ifndef WIN32
01461     if (mudstate.dumping)
01462     {
01463         notify(executor, "Dumping. Please try again later.");
01464         bDenied = true;
01465     }
01466 #endif // !WIN32
01467 
01468 
01469     if (!mudstate.bCanRestart)
01470     {
01471         notify(executor, "Server just started. Please try again in a few seconds.");
01472         bDenied = true;
01473     }
01474     if (bDenied)
01475     {
01476         STARTLOG(LOG_ALWAYS, "WIZ", "RSTRT");
01477         log_text("Restart requested but not executed by ");
01478         log_name(executor);
01479         ENDLOG;
01480         return;
01481     }
01482 
01483     raw_broadcast(0, "GAME: Restart by %s, please wait.", Name(Owner(executor)));
01484     STARTLOG(LOG_ALWAYS, "WIZ", "RSTRT");
01485     log_text("Restart by ");
01486     log_name(executor);
01487     ENDLOG;
01488 
01489     local_presync_database();
01490 
01491 #ifndef MEMORY_BASED
01492     al_store();
01493 #endif
01494     pcache_sync();
01495     dump_database_internal(DUMP_I_RESTART);
01496     SYNC;
01497     CLOSE;
01498 
01499 #ifdef WIN32 // WIN32
01500 
01501     WSACleanup();
01502     exit(12345678);
01503 
01504 #else // WIN32
01505 
01506     dump_restart_db();
01507 
01508     CleanUpSlaveSocket();
01509     CleanUpSlaveProcess();
01510 
01511     Log.StopLogging();
01512 
01513 #ifdef GAME_DOOFERMUX
01514     execl("bin/netmux", mudconf.mud_name, "-c", mudconf.config_file, "-p", mudconf.pid_file, NULL);
01515 #else
01516     execl("bin/netmux", "netmux", "-c", mudconf.config_file, "-p", mudconf.pid_file, NULL);
01517 #endif // GAME_DOOFERMUX
01518 #endif // !WIN32
01519 }

void do_switch ( dbref  player,
dbref  caller,
dbref  enactor,
int  key,
char *  expr,
char *  args[],
int  nargs,
char *  cargs[],
int  ncargs 
)

Definition at line 651 of file predicates.cpp.

References alloc_lbuf, EV_EVAL, EV_FCHECK, EV_TOP, free_lbuf, statedata::global_regs, mudconf, mudstate, mux_exec(), NOTHING, replace_tokens(), SWITCH_ANY, SWITCH_DEFAULT, confdata::switch_df_all, SWITCH_ONE, wait_que(), and wild_match().

00662 {
00663     if (  !expr
00664        || nargs <= 0)
00665     {
00666         return;
00667     }
00668 
00669     if (key == SWITCH_DEFAULT)
00670     {
00671         if (mudconf.switch_df_all)
00672         {
00673             key = SWITCH_ANY;
00674         }
00675         else
00676         {
00677             key = SWITCH_ONE;
00678         }
00679     }
00680 
00681     // Now try a wild card match of buff with stuff in coms.
00682     //
00683     bool any = false;
00684     int a;
00685     char *buff, *bp, *str;
00686     buff = bp = alloc_lbuf("do_switch");
00687     CLinearTimeAbsolute lta;
00688     for (  a = 0;
00689               a < nargs - 1
00690            && args[a]
00691            && args[a + 1];
00692            a += 2)
00693     {
00694         bp = buff;
00695         str = args[a];
00696         mux_exec(buff, &bp, player, caller, enactor, EV_FCHECK | EV_EVAL | EV_TOP,
00697             &str, cargs, ncargs);
00698         *bp = '\0';
00699         if (wild_match(buff, expr))
00700         {
00701             char *tbuf = replace_tokens(args[a+1], NULL, NULL, expr);
00702             wait_que(player, caller, enactor, false, lta, NOTHING, 0,
00703                 tbuf, cargs, ncargs, mudstate.global_regs);
00704             free_lbuf(tbuf);
00705             if (key == SWITCH_ONE)
00706             {
00707                 free_lbuf(buff);
00708                 return;
00709             }
00710             any = true;
00711         }
00712     }
00713     free_lbuf(buff);
00714     if (  a < nargs
00715        && !any
00716        && args[a])
00717     {
00718         char *tbuf = replace_tokens(args[a], NULL, NULL, expr);
00719         wait_que(player, caller, enactor, false, lta, NOTHING, 0, tbuf,
00720             cargs, ncargs, mudstate.global_regs);
00721         free_lbuf(tbuf);
00722     }
00723 }

void do_verb ( dbref  executor,
dbref  caller,
dbref  enactor,
int  key,
char *  victim_str,
char *  args[],
int  nargs 
)

Definition at line 2436 of file predicates.cpp.

References A_DESC, atr_get_info(), atr_num(), atr_str(), bCanReadAttr(), Controls, did_it(), EV_STRIP_LS, EV_STRIP_TS, Examinable, free_lbuf, Good_obj, init_match(), MAT_EXIT_PARENTS, match_everything(), mudconf, nearby(), noisy_match_result(), NOTHING, notify, notify_quiet, NOTYPE, attr::number, parse_arglist(), confdata::read_rem_desc, and UNUSED_PARAMETER.

02438 {
02439     UNUSED_PARAMETER(caller);
02440     UNUSED_PARAMETER(key);
02441 
02442     // Look for the victim.
02443     //
02444     if (  !victim_str
02445        || !*victim_str)
02446     {
02447         notify(executor, "Nothing to do.");
02448         return;
02449     }
02450 
02451     // Get the victim.
02452     //
02453     init_match(executor, victim_str, NOTYPE);
02454     match_everything(MAT_EXIT_PARENTS);
02455     dbref victim = noisy_match_result();
02456     if (!Good_obj(victim))
02457     {
02458         return;
02459     }
02460 
02461     // Get the actor.  Default is my cause.
02462     //
02463     dbref actor;
02464     if (  nargs >= 1
02465        && args[0] && *args[0])
02466     {
02467         init_match(executor, args[0], NOTYPE);
02468         match_everything(MAT_EXIT_PARENTS);
02469         actor = noisy_match_result();
02470         if (!Good_obj(actor))
02471         {
02472             return;
02473         }
02474     }
02475     else
02476     {
02477         actor = enactor;
02478     }
02479 
02480     // Check permissions.  There are two possibilities:
02481     //
02482     //    1. Executor controls both victim and actor. In this case,
02483     //       victim runs his action list.
02484     //
02485     //    2. Executor controls actor. In this case victim does not run
02486     //       his action list and any attributes that executor cannot read
02487     //       from victim are defaulted.
02488     //
02489     if (!Controls(executor, actor))
02490     {
02491         notify_quiet(executor, "Permission denied,");
02492         return;
02493     }
02494 
02495     ATTR *ap;
02496     int what = -1;
02497     int owhat = -1;
02498     int awhat = -1;
02499     const char *whatd = NULL;
02500     const char *owhatd = NULL;
02501     int nxargs = 0;
02502     dbref aowner = NOTHING;
02503     int aflags = NOTHING;
02504     char *xargs[10];
02505 
02506     switch (nargs) // Yes, this IS supposed to fall through.
02507     {
02508     case 7:
02509         // Get arguments.
02510         //
02511         parse_arglist(victim, actor, actor, args[6], '\0',
02512             EV_STRIP_LS | EV_STRIP_TS, xargs, 10, (char **)NULL, 0, &nxargs);
02513 
02514     case 6:
02515         // Get action attribute.
02516         //
02517         ap = atr_str(args[5]);
02518         if (ap)
02519         {
02520             awhat = ap->number;
02521         }
02522 
02523     case 5:
02524         // Get others message default.
02525         //
02526         if (args[4] && *args[4])
02527         {
02528             owhatd = args[4];
02529         }
02530 
02531     case 4:
02532         // Get others message attribute.
02533         //
02534         ap = atr_str(args[3]);
02535         if (ap && (ap->number > 0))
02536         {
02537             owhat = ap->number;
02538         }
02539 
02540     case 3:
02541         // Get enactor message default.
02542         //
02543         if (args[2] && *args[2])
02544         {
02545             whatd = args[2];
02546         }
02547 
02548     case 2:
02549         // Get enactor message attribute.
02550         //
02551         ap = atr_str(args[1]);
02552         if (ap && (ap->number > 0))
02553         {
02554             what = ap->number;
02555         }
02556     }
02557 
02558     // If executor doesn't control both, enforce visibility restrictions.
02559     //
02560     if (!Controls(executor, victim))
02561     {
02562         ap = NULL;
02563         if (what != -1)
02564         {
02565             atr_get_info(victim, what, &aowner, &aflags);
02566             ap = atr_num(what);
02567         }
02568         if (  !ap
02569            || !bCanReadAttr(executor, victim, ap, false)
02570            || (  ap->number == A_DESC
02571               && !mudconf.read_rem_desc
02572               && !Examinable(executor, victim)
02573               && !nearby(executor, victim)))
02574         {
02575             what = -1;
02576         }
02577 
02578         ap = NULL;
02579         if (owhat != -1)
02580         {
02581             atr_get_info(victim, owhat, &aowner, &aflags);
02582             ap = atr_num(owhat);
02583         }
02584         if (  !ap
02585            || !bCanReadAttr(executor, victim, ap, false)
02586            || (  ap->number == A_DESC
02587               && !mudconf.read_rem_desc
02588               && !Examinable(executor, victim)
02589               && !nearby(executor, victim)))
02590         {
02591             owhat = -1;
02592         }
02593 
02594         awhat = 0;
02595     }
02596 
02597     // Go do it.
02598     //
02599     did_it(actor, victim, what, whatd, owhat, owhatd, awhat, xargs, nxargs);
02600 
02601     // Free user args.
02602     //
02603     for (int i = 0; i < nxargs; i++)
02604     {
02605         free_lbuf(xargs[i]);
02606     }
02607 }

bool exit_displayable ( dbref  exit,
dbref  player,
int  key 
)

Definition at line 2217 of file predicates.cpp.

References statedata::bStandAlone, Dark, Light, mudstate, VE_BASE_DARK, and VE_LOC_DARK.

Referenced by look_exits().

02218 {
02219     // Dark exit
02220     //
02221     if (Dark(exit))
02222     {
02223         return false;
02224     }
02225 
02226 #ifdef WOD_REALMS
02227     if (!mudstate.bStandAlone)
02228     {
02229         int iRealmDirective = DoThingToThingVisibility(player, exit,
02230             ACTION_IS_STATIONARY);
02231         if (REALM_DO_HIDDEN_FROM_YOU == iRealmDirective)
02232         {
02233             return false;
02234         }
02235     }
02236 #endif // WOD_REALMS
02237 
02238     // Light exit
02239     //
02240     if (Light(exit))
02241     {
02242         return true;
02243     }
02244 
02245     // Dark location or base.
02246     //
02247     if (key & (VE_LOC_DARK | VE_BASE_DARK))
02248     {
02249         return false;
02250     }
02251 
02252     // Default
02253     //
02254     return true;
02255 }

bool exit_visible ( dbref  exit,
dbref  player,
int  key 
)

Definition at line 2171 of file predicates.cpp.

References statedata::bStandAlone, Dark, Examinable, IsReal, Light, mudstate, VE_BASE_DARK, VE_LOC_DARK, and VE_LOC_XAM.

Referenced by FUNCTION(), match_exit_internal(), and room_list().

02172 {
02173 #ifdef WOD_REALMS
02174     if (!mudstate.bStandAlone)
02175     {
02176         int iRealmDirective = DoThingToThingVisibility(player, exit,
02177             ACTION_IS_STATIONARY);
02178         if (REALM_DO_HIDDEN_FROM_YOU == iRealmDirective)
02179         {
02180             return false;
02181         }
02182     }
02183 #endif // WOD_REALMS
02184 
02185 #ifdef REALITY_LVLS
02186     if (!mudstate.bStandAlone)
02187     {
02188     if (!IsReal(player, exit))
02189        return 0;
02190     }
02191 #endif /* REALITY_LVLS */
02192 
02193     // Exam exit's location
02194     //
02195     if (  (key & VE_LOC_XAM)
02196        || Examinable(player, exit)
02197        || Light(exit))
02198     {
02199         return true;
02200     }
02201 
02202     // Dark location or base
02203     //
02204     if (  (key & (VE_LOC_DARK | VE_BASE_DARK))
02205        || Dark(exit))
02206     {
02207         return false;
02208     }
02209 
02210     // Default
02211     //
02212     return true;
02213 }

bool get_obj_and_lock ( dbref  player,
char *  what,
dbref it,
ATTR **  attr,
char *  errmsg,
char **  bufc 
)

Definition at line 1823 of file predicates.cpp.

References A_LOCK, alloc_lbuf, atr_num(), attr, free_lbuf, Good_obj, lock_sw, match_thing_quiet(), parse_thing_slash(), safe_match_result(), safe_str, and search_nametab().

Referenced by FUNCTION().

01824 {
01825     char *str, *tbuf;
01826     int anum;
01827 
01828     tbuf = alloc_lbuf("get_obj_and_lock");
01829     strcpy(tbuf, what);
01830     if (parse_thing_slash(player, tbuf, &str, it))
01831     {
01832         // <obj>/<lock> syntax, use the named lock.
01833         //
01834         if (!search_nametab(player, lock_sw, str, &anum))
01835         {
01836             free_lbuf(tbuf);
01837             safe_str("#-1 LOCK NOT FOUND", errmsg, bufc);
01838             return false;
01839         }
01840     }
01841     else
01842     {
01843         // Not <obj>/<lock>, do a normal get of the default lock.
01844         //
01845         *it = match_thing_quiet(player, what);
01846         if (!Good_obj(*it))
01847         {
01848             free_lbuf(tbuf);
01849             safe_match_result(*it, errmsg, bufc);
01850             return false;
01851         }
01852         anum = A_LOCK;
01853     }
01854 
01855     // Get the attribute definition, fail if not found.
01856     //
01857     free_lbuf(tbuf);
01858     *attr = atr_num(anum);
01859     if (!(*attr))
01860     {
01861         safe_str("#-1 LOCK NOT FOUND", errmsg, bufc);
01862         return false;
01863     }
01864     return true;
01865 }

void giveto ( dbref  who,
int  pennies 
)

Definition at line 288 of file predicates.cpp.

References Free_Money, Owner, Pennies(), s_Pennies(), and Wizard.

Referenced by CallBack_HaltQueue(), CallBack_NotifySemaphoreDrainOrAll(), connect_player(), destroy_obj(), do_chown(), do_kill(), do_processcom(), do_unlink(), give_money(), halt_que(), link_exit(), move_object(), and Task_RunQueueEntry().

00289 {
00290     if (  Wizard(who)
00291        || Wizard(Owner(who))
00292        || Free_Money(who)
00293        || Free_Money(Owner(who)))
00294     {
00295         return;
00296     }
00297     who = Owner(who);
00298     s_Pennies(who, Pennies(who) + pennies);
00299 }

void handle_ears ( dbref  thing,
bool  could_hear,
bool  can_hear 
)

Definition at line 608 of file predicates.cpp.

References alloc_lbuf, free_lbuf, get_gender(), isExit, MSG_INV, MSG_LOC, MSG_ME, MSG_NBR, Name, notify_check(), and tprintf().

Referenced by do_edit(), do_set(), do_wipe(), fh_hear_bit(), and set_attr_internal().

00609 {
00610     char *buff, *bp;
00611     int gender;
00612     static const char *poss[5] =
00613     {"", "its", "her", "his", "their"};
00614 
00615     if (could_hear != can_hear)
00616     {
00617         buff = alloc_lbuf("handle_ears");
00618         strcpy(buff, Name(thing));
00619         if (isExit(thing))
00620         {
00621             for (bp = buff; *bp && *bp != ';'; bp++)
00622             {
00623                 ; // Nothing.
00624             }
00625             *bp = '\0';
00626         }
00627         gender = get_gender(thing);
00628 
00629         if (can_hear)
00630         {
00631             notify_check(thing, thing,
00632                          tprintf("%s grow%s ears and can now hear.",
00633                                  buff, (gender == 4) ? "" : "s"),
00634                          (MSG_ME | MSG_NBR | MSG_LOC | MSG_INV));
00635         }
00636         else
00637         {
00638             notify_check(thing, thing,
00639                          tprintf("%s lose%s %s ears and become%s deaf.",
00640                                  buff, (gender == 4) ? "" : "s",
00641                                  poss[gender], (gender == 4) ? "" : "s"),
00642                          (MSG_ME | MSG_NBR | MSG_LOC | MSG_INV));
00643         }
00644         free_lbuf(buff);
00645     }
00646 }

void handle_prog ( DESC d,
char *  message 
)

Definition at line 1151 of file predicates.cpp.

References A_PROGCMD, ANSI_HILITE, ANSI_NORMAL, atr_get, statedata::desc_htab, DESC_ITER_PLAYER, do_command(), free_lbuf, hashfindLEN(), MAX_GLOBAL_REGS, MEMFREE, mudstate, NOTHING, NVT_EOR, NVT_GA, NVT_IAC, OPTION_YES, descriptor_data::player, descriptor_data::program_data, queue_string(), queue_write_LEN(), TELNET_EOR, TELNET_SGA, tprintf(), UsState(), prog_data::wait_enactor, wait_que(), and prog_data::wait_regs.

Referenced by Task_ProcessCommand().

01152 {
01153     // Allow the player to pipe a command while in interactive mode.
01154     //
01155     if (*message == '|')
01156     {
01157         do_command(d, message + 1);
01158 
01159         if (d->program_data != NULL)
01160         {
01161             queue_string(d, tprintf("%s>%s ", ANSI_HILITE, ANSI_NORMAL));
01162 
01163             if (OPTION_YES == UsState(d, TELNET_EOR))
01164             {
01165                 // Use telnet protocol's EOR command to show prompt.
01166                 //
01167                 const char aEOR[2] = { NVT_IAC, NVT_EOR };
01168                 queue_write_LEN(d, aEOR, sizeof(aEOR));
01169             }
01170             else if (OPTION_YES != UsState(d, TELNET_SGA))
01171             {
01172                 // Use telnet protocol's GOAHEAD command to show prompt.
01173                 //
01174                 const char aGoAhead[2] = { NVT_IAC, NVT_GA };
01175                 queue_write_LEN(d, aGoAhead, sizeof(aGoAhead));
01176             }
01177         }
01178         return;
01179     }
01180     dbref aowner;
01181     int aflags, i;
01182     char *cmd = atr_get(d->player, A_PROGCMD, &aowner, &aflags);
01183     CLinearTimeAbsolute lta;
01184     wait_que(d->program_data->wait_enactor, d->player, d->player, false, lta,
01185         NOTHING, 0, cmd, (char **)&message, 1,
01186         (char **)d->program_data->wait_regs);
01187 
01188     // First, set 'all' to a descriptor we find for this player.
01189     //
01190     DESC *all = (DESC *)hashfindLEN(&(d->player), sizeof(d->player), &mudstate.desc_htab) ;
01191 
01192     if (all && all->program_data)
01193     {
01194         for (i = 0; i < MAX_GLOBAL_REGS; i++)
01195         {
01196             if (all->program_data->wait_regs[i])
01197             {
01198                 free_lbuf(all->program_data->wait_regs[i]);
01199                 all->program_data->wait_regs[i] = NULL;
01200             }
01201         }
01202 
01203         MEMFREE(all->program_data);
01204         all->program_data = NULL;
01205 
01206         // Set info for all player descriptors to NULL
01207         //
01208         DESC_ITER_PLAYER(d->player, all)
01209             all->program_data = NULL;
01210     }
01211     atr_clr(d->player, A_PROGCMD);
01212     free_lbuf(cmd);
01213 }

dbref insert_first ( dbref  head,
dbref  thing 
)

Definition at line 46 of file predicates.cpp.

References s_Next.

Referenced by do_clone(), do_drop(), do_get(), move_object(), and move_the_exit().

00047 {
00048     s_Next(thing, head);
00049     return thing;
00050 }

bool locatable ( dbref  player,
dbref  it,
dbref  enactor 
)

Definition at line 2080 of file predicates.cpp.

References Examinable, Find_Unfindable, Findable, Good_obj, NOTHING, where_is(), where_room(), and Wizard.

Referenced by FUNCTION().

02081 {
02082     // No sense if trying to locate a bad object
02083     //
02084     if (!Good_obj(it))
02085     {
02086         return false;
02087     }
02088 
02089     dbref loc_it = where_is(it);
02090 
02091     // Succeed if we can examine the target, if we are the target, if we can
02092     // examine the location, if a wizard caused the lookup, or if the target
02093     // caused the lookup.
02094     //
02095     if (  Examinable(player, it)
02096        || Find_Unfindable(player)
02097        || loc_it == player
02098        || (  loc_it != NOTHING
02099           && (  Examinable(player, loc_it)
02100              || loc_it == where_is(player)))
02101        || Wizard(enactor)
02102        || it == enactor)
02103     {
02104         return true;
02105     }
02106 
02107     dbref room_it = where_room(it);
02108     bool findable_room;
02109     if (Good_obj(room_it))
02110     {
02111         findable_room = Findable(room_it);
02112     }
02113     else
02114     {
02115         findable_room = true;
02116     }
02117 
02118     // Succeed if we control the containing room or if the target is findable
02119     // and the containing room is not unfindable.
02120     //
02121     if (  (  room_it != NOTHING
02122           && Examinable(player, room_it))
02123        || Find_Unfindable(player)
02124        || (  Findable(it)
02125           && findable_room))
02126     {
02127         return true;
02128     }
02129 
02130     // We can't do it.
02131     //
02132     return false;
02133 }

char* MakeCanonicalExitName ( const char *  pName,
int *  pnName,
bool *  pbValid 
)

Definition at line 374 of file predicates.cpp.

References ANSI_ENDGOAL_NORMAL, ANSI_TruncateToField(), MakeCanonicalObjectName(), MBUF_SIZE, safe_mb_chr, safe_mb_str, and strip_ansi().

Referenced by create_obj(), and do_name().

00375 {
00376     static char Buf[MBUF_SIZE];
00377     static char Out[MBUF_SIZE];
00378 
00379     *pnName = 0;
00380     *pbValid = false;
00381 
00382     if (!pName)
00383     {
00384         return NULL;
00385     }
00386 
00387     // Build the non-ANSI version so that we can parse for semicolons
00388     // safely.
00389     //
00390     char *pStripped = strip_ansi(pName);
00391     char *pBuf = Buf;
00392     safe_mb_str(pStripped, Buf, &pBuf);
00393     *pBuf = '\0';
00394 
00395     size_t nBuf = pBuf - Buf;
00396     pBuf = Buf;
00397 
00398     bool bHaveDisplay = false;
00399 
00400     char *pOut = Out;
00401 
00402     for (; nBuf;)
00403     {
00404         // Build (q,n) as the next segment.  Leave the the remaining segments as
00405         // (pBuf,nBuf).
00406         //
00407         char *q = strchr(pBuf, ';');
00408         size_t n;
00409         if (q)
00410         {
00411             *q = '\0';
00412             n = q - pBuf;
00413             q = pBuf;
00414             pBuf += n + 1;
00415             nBuf -= n + 1;
00416         }
00417         else
00418         {
00419             n = nBuf;
00420             q = pBuf;
00421             pBuf += nBuf;
00422             nBuf = 0;
00423         }
00424 
00425         if (bHaveDisplay)
00426         {
00427             // We already have the displayable name. We don't allow ANSI in
00428             // any segment but the first, so we can pull them directly from
00429             // the stripped buffer.
00430             //
00431             int  nN;
00432             bool bN;
00433             char *pN = MakeCanonicalObjectName(q, &nN, &bN);
00434             if (  bN
00435                && nN < MBUF_SIZE - (pOut - Out) - 1)
00436             {
00437                 safe_mb_chr(';', Out, &pOut);
00438                 safe_mb_str(pN, Out, &pOut);
00439             }
00440         }
00441         else
00442         {
00443             // We don't have the displayable name, yet. We know where the next
00444             // semicolon occurs, so we limit the visible width of the
00445             // truncation to that.  We should be picking up all the visible
00446             // characters leading up to the semicolon, but not including the
00447             // semi-colon.
00448             //
00449             int vw;
00450             ANSI_TruncateToField(pName, sizeof(Out), Out, n, &vw,
00451                 ANSI_ENDGOAL_NORMAL);
00452 
00453             // vw should always be equal to n, but we'll just make sure.
00454             //
00455             if ((size_t)vw == n)
00456             {
00457                 int  nN;
00458                 bool bN;
00459                 char *pN = MakeCanonicalObjectName(Out, &nN, &bN);
00460                 if (  bN
00461                    && nN <= MBUF_SIZE - 1)
00462                 {
00463                     safe_mb_str(pN, Out, &pOut);
00464                     bHaveDisplay = true;
00465                 }
00466             }
00467         }
00468     }
00469     if (bHaveDisplay)
00470     {
00471         *pnName = pOut - Out;
00472         *pbValid = true;
00473         *pOut = '\0';
00474         return Out;
00475     }
00476     else
00477     {
00478         return NULL;
00479     }
00480 }

char* MakeCanonicalObjectName ( const char *  pName,
int *  pnName,
bool *  pbValid 
)

Definition at line 305 of file predicates.cpp.

References ANSI_ENDGOAL_NORMAL, ANSI_TruncateToField(), MBUF_SIZE, mux_isspace, mux_ObjectNameSet, and strip_ansi().

Referenced by create_obj(), do_clone(), do_fixdb(), do_name(), FUNCTION(), and MakeCanonicalExitName().

00306 {
00307     static char Buf[MBUF_SIZE];
00308 
00309     *pnName = 0;
00310     *pbValid = false;
00311 
00312     if (!pName)
00313     {
00314         return NULL;
00315     }
00316 
00317     // Build up what the real name would be. If we pass all the
00318     // checks, this is what we will return as a result.
00319     //
00320     int nVisualWidth;
00321     int nBuf = ANSI_TruncateToField(pName, sizeof(Buf), Buf, MBUF_SIZE,
00322         &nVisualWidth, ANSI_ENDGOAL_NORMAL);
00323 
00324     // Disallow pure ANSI names. There must be at least -something-
00325     // visible.
00326     //
00327     if (nVisualWidth <= 0)
00328     {
00329         return NULL;
00330     }
00331 
00332     // Get the stripped version (Visible parts without color info).
00333     //
00334     size_t nStripped;
00335     char *pStripped = strip_ansi(Buf, &nStripped);
00336 
00337     // Do not allow LOOKUP_TOKEN, NUMBER_TOKEN, NOT_TOKEN, or SPACE
00338     // as the first character, or SPACE as the last character
00339     //
00340     if (  strchr("*!#", *pStripped)
00341        || mux_isspace(pStripped[0])
00342        || mux_isspace(pStripped[nStripped-1]))
00343     {
00344         return NULL;
00345     }
00346 
00347     // Only printable characters besides ARG_DELIMITER, AND_TOKEN,
00348     // and OR_TOKEN are allowed.
00349     //
00350     for (unsigned int i = 0; i < nStripped; i++)
00351     {
00352         if (!mux_ObjectNameSet(pStripped[i]))
00353         {
00354             return NULL;
00355         }
00356     }
00357 
00358     // Special names are specifically dis-allowed.
00359     //
00360     if (  (nStripped == 2 && memcmp("me", pStripped, 2) == 0)
00361        || (nStripped == 4 && (  memcmp("home", pStripped, 4) == 0
00362                              || memcmp("here", pStripped, 4) == 0)))
00363     {
00364         return NULL;
00365     }
00366 
00367     *pnName = nBuf;
00368     *pbValid = true;
00369     return Buf;
00370 }

dbref match_possessed ( dbref  player,
dbref  thing,
char *  target,
dbref  dflt,
bool  check_enter 
)

Definition at line 1599 of file predicates.cpp.

References alloc_lbuf, Controls, d1, Dark, Enter_ok, free_lbuf, Good_obj, init_match(), match_neighbor(), match_possessed(), match_possession(), match_result(), NOPERM, NOTHING, NOTYPE, Opaque, and promote_dflt().

Referenced by do_get(), do_look(), and match_possessed().

01600 {
01601     // First, check normally.
01602     //
01603     if (Good_obj(dflt))
01604     {
01605         return dflt;
01606     }
01607 
01608     // Didn't find it directly.  Recursively do a contents check.
01609     //
01610     dbref result, result1;
01611     char *buff, *place, *s1, *d1, *temp;
01612     char *start = target;
01613     while (*target)
01614     {
01615         // Fail if no ' characters.
01616         //
01617         place = target;
01618         target = strchr(place, '\'');
01619         if (  target == NULL
01620            || !*target)
01621         {
01622             return dflt;
01623         }
01624 
01625         // If string started with a ', skip past it
01626         //
01627         if (place == target)
01628         {
01629             target++;
01630             continue;
01631         }
01632 
01633         // If next character is not an s or a space, skip past
01634         //
01635         temp = target++;
01636         if (!*target)
01637         {
01638             return dflt;
01639         }
01640         if (  *target != 's'
01641            && *target != 'S'
01642            && *target != ' ')
01643         {
01644             continue;
01645         }
01646 
01647         // If character was not a space make sure the following character is
01648         // a space.
01649         //
01650         if (*target != ' ')
01651         {
01652             target++;
01653             if (!*target)
01654             {
01655                 return dflt;
01656             }
01657             if (*target != ' ')
01658             {
01659                 continue;
01660             }
01661         }
01662 
01663         // Copy the container name to a new buffer so we can terminate it.
01664         //
01665         buff = alloc_lbuf("is_posess");
01666         for (s1 = start, d1 = buff; *s1 && (s1 < temp); *d1++ = (*s1++))
01667         {
01668             ; // Nothing.
01669         }
01670         *d1 = '\0';
01671 
01672         // Look for the container here and in our inventory.  Skip past if we
01673         // can't find it.
01674         //
01675         init_match(thing, buff, NOTYPE);
01676         if (player == thing)
01677         {
01678             match_neighbor();
01679             match_possession();
01680         }
01681         else
01682         {
01683             match_possession();
01684         }
01685         result1 = match_result();
01686 
01687         free_lbuf(buff);
01688         if (!Good_obj(result1))
01689         {
01690             dflt = promote_dflt(dflt, result1);
01691             continue;
01692         }
01693 
01694         // If we don't control it and it is either dark or opaque, skip past.
01695         //
01696         bool control = Controls(player, result1);
01697         if (  (  Dark(result1)
01698               || Opaque(result1))
01699            && !control)
01700         {
01701             dflt = promote_dflt(dflt, NOTHING);
01702             continue;
01703         }
01704 
01705         // Validate object has the ENTER bit set, if requested.
01706         //
01707         if (  check_enter
01708            && !Enter_ok(result1)
01709            && !control)
01710         {
01711             dflt = promote_dflt(dflt, NOPERM);
01712             continue;
01713         }
01714 
01715         // Look for the object in the container.
01716         //
01717         init_match(result1, target, NOTYPE);
01718         match_possession();
01719         result = match_result();
01720         result = match_possessed(player, result1, target, result, check_enter);
01721         if (Good_obj(result))
01722         {
01723             return result;
01724         }
01725         dflt = promote_dflt(dflt, result);
01726     }
01727     return dflt;
01728 }

bool member ( dbref  thing,
dbref  list 
)

Definition at line 95 of file predicates.cpp.

References DOLIST.

Referenced by eval_boolexp().

00096 {
00097     DOLIST(list, list)
00098     {
00099         if (list == thing)
00100         {
00101             return true;
00102         }
00103     }
00104     return false;
00105 }

bool nearby ( dbref  player,
dbref  thing 
)

Definition at line 2140 of file predicates.cpp.

References Can_Hide, Good_obj, Hidden, See_Hidden, and where_is().

Referenced by bCanReadAttr(), do_examine(), do_pemit_single(), do_verb(), exam_wildattrs(), FUNCTION(), and nearby_or_control().

02141 {
02142     if (  !Good_obj(player)
02143        || !Good_obj(thing))
02144     {
02145         return false;
02146     }
02147     if (  Can_Hide(thing)
02148        && Hidden(thing)
02149        && !See_Hidden(player))
02150     {
02151         return false;
02152     }
02153     dbref thing_loc = where_is(thing);
02154     if (thing_loc == player)
02155     {
02156         return true;
02157     }
02158     dbref player_loc = where_is(player);
02159     if (  thing_loc == player_loc
02160        || thing == player_loc)
02161     {
02162         return true;
02163     }
02164     return false;
02165 }

bool ok_password ( const char *  password,
const char **  pmsg 
)

Definition at line 544 of file predicates.cpp.

References statedata::bStandAlone, mudconf, mudstate, mux_islower, mux_isprint, mux_isspace, mux_isupper, and confdata::safer_passwords.

Referenced by create_player(), do_newpassword(), and do_password().

00545 {
00546     *pmsg = NULL;
00547 
00548     if (*password == '\0')
00549     {
00550         *pmsg = "Null passwords are not allowed.";
00551         return false;
00552     }
00553 
00554     const char *scan;
00555     int num_upper = 0;
00556     int num_special = 0;
00557     int num_lower = 0;
00558 
00559     for (scan = password; *scan; scan++)
00560     {
00561         if (  !mux_isprint(*scan)
00562            || mux_isspace(*scan))
00563         {
00564             *pmsg = "Illegal character in password.";
00565             return false;
00566         }
00567         if (mux_isupper(*scan))
00568         {
00569             num_upper++;
00570         }
00571         else if (mux_islower(*scan))
00572         {
00573             num_lower++;
00574         }
00575         else if (  *scan != '\''
00576                 && *scan != '-')
00577         {
00578             num_special++;
00579         }
00580     }
00581 
00582     if (  !mudstate.bStandAlone
00583        && mudconf.safer_passwords)
00584     {
00585         if (num_upper < 1)
00586         {
00587             *pmsg = "The password must contain at least one capital letter.";
00588             return false;
00589         }
00590         if (num_lower < 1)
00591         {
00592             *pmsg = "The password must contain at least one lowercase letter.";
00593             return false;
00594         }
00595         if (num_special < 1)
00596         {
00597             *pmsg = "The password must contain at least one number or a symbol other than the apostrophe or dash.";
00598             return false;
00599         }
00600     }
00601     return true;
00602 }

void OutOfMemory ( const char *  SourceFile,
unsigned int  LineNo 
)

Definition at line 2612 of file predicates.cpp.

References statedata::bCanRestart, statedata::bStandAlone, do_restart(), ENDLINE, CLogFile::Flush(), GOD, Log, mudstate, and CLogFile::tinyprintf().

02613 {
02614     Log.tinyprintf("%s(%u): Out of memory." ENDLINE, SourceFile, LineNo);
02615     Log.Flush();
02616     if (  !mudstate.bStandAlone
02617        && mudstate.bCanRestart)
02618     {
02619         do_restart(GOD, GOD, GOD, 0);
02620     }
02621     else
02622     {
02623         abort();
02624     }
02625 }

void parse_range ( char **  name,
dbref low_bound,
dbref high_bound 
)

Definition at line 1734 of file predicates.cpp.

References statedata::db_top, EV_STRIP_TS, mudstate, mux_atol(), mux_isspace, NUMBER_TOKEN, and parse_to().

Referenced by do_entrances(), do_find(), and search_setup().

01735 {
01736     char *buff1 = *name;
01737     if (buff1 && *buff1)
01738     {
01739         *name = parse_to(&buff1, ',', EV_STRIP_TS);
01740     }
01741     if (buff1 && *buff1)
01742     {
01743         char *buff2 = parse_to(&buff1, ',', EV_STRIP_TS);
01744         if (buff1 && *buff1)
01745         {
01746             while (mux_isspace(*buff1))
01747             {
01748                 buff1++;
01749             }
01750 
01751             if (*buff1 == NUMBER_TOKEN)
01752             {
01753                 buff1++;
01754             }
01755 
01756             *high_bound = mux_atol(buff1);
01757             if (*high_bound >= mudstate.db_top)
01758             {
01759                 *high_bound = mudstate.db_top - 1;
01760             }
01761         }
01762         else
01763         {
01764             *high_bound = mudstate.db_top - 1;
01765         }
01766 
01767         while (mux_isspace(*buff2))
01768         {
01769             buff2++;
01770         }
01771 
01772         if (*buff2 == NUMBER_TOKEN)
01773         {
01774             buff2++;
01775         }
01776 
01777         *low_bound = mux_atol(buff2);
01778         if (*low_bound < 0)
01779         {
01780             *low_bound = 0;
01781         }
01782     }
01783     else
01784     {
01785         *low_bound = 0;
01786         *high_bound = mudstate.db_top - 1;
01787     }
01788 }

bool parse_thing_slash ( dbref  player,
char *  thing,
char **  after,
dbref it 
)

Definition at line 1790 of file predicates.cpp.

References Good_obj, init_match(), MAT_EXIT_PARENTS, match_everything(), match_result(), NOTHING, and NOTYPE.

Referenced by get_obj_and_lock(), parse_attrib(), and parse_attrib_wild().

01791 {
01792     // Get name up to '/'.
01793     //
01794     char *str = thing;
01795     while (  *str != '\0'
01796           && *str != '/')
01797     {
01798         str++;
01799     }
01800 
01801     // If no '/' in string, return failure.
01802     //
01803     if (*str == '\0')
01804     {
01805         *after = NULL;
01806         *it = NOTHING;
01807         return false;
01808     }
01809     *str++ = '\0';
01810     *after = str;
01811 
01812     // Look for the object.
01813     //
01814     init_match(player, thing, NOTYPE);
01815     match_everything(MAT_EXIT_PARENTS);
01816     *it = match_result();
01817 
01818     // Return status of search.
01819     //
01820     return Good_obj(*it);
01821 }

static bool pay_quota ( dbref  who,
int  cost 
) [static]

Definition at line 181 of file predicates.cpp.

References A_RQUOTA, atr_add_raw(), atr_get, free_lbuf, Free_Quota, mux_atol(), mux_ltoa(), and Owner.

Referenced by canpayfees().

00182 {
00183     // If no cost, succeed
00184     //
00185     if (cost <= 0)
00186     {
00187         return true;
00188     }
00189 
00190     // determine quota
00191     //
00192     dbref aowner;
00193     int aflags;
00194     char *quota_str = atr_get(Owner(who), A_RQUOTA, &aowner, &aflags);
00195     int quota = mux_atol(quota_str);
00196     free_lbuf(quota_str);
00197 
00198     // enough to build?  Wizards always have enough.
00199     //
00200     quota -= cost;
00201     if (  quota < 0
00202        && !Free_Quota(who)
00203        && !Free_Quota(Owner(who)))
00204     {
00205         return false;
00206     }
00207 
00208     // Dock the quota.
00209     //
00210     char buf[20];
00211     mux_ltoa(quota, buf);
00212     atr_add_raw(Owner(who), A_RQUOTA, buf);
00213 
00214     return true;
00215 }

bool payfor ( dbref  who,
int  cost 
)

Definition at line 257 of file predicates.cpp.

References Free_Money, Owner, Pennies(), s_Pennies(), and Wizard.

Referenced by canpayfees(), do_entrances(), do_find(), do_kill(), do_mail_stats(), do_processcom(), FUNCTION(), get_stats(), give_money(), open_exit(), page_check(), and setup_que().

00258 {
00259     if (  Wizard(who)
00260        || Wizard(Owner(who))
00261        || Free_Money(who)
00262        || Free_Money(Owner(who)))
00263     {
00264         return true;
00265     }
00266     who = Owner(who);
00267     int tmp;
00268     if ((tmp = Pennies(who)) >= cost)
00269     {
00270         s_Pennies(who, tmp - cost);
00271         return true;
00272     }
00273     return false;
00274 }

static dbref promote_dflt ( dbref  old,
dbref  new0 
) [static]

Definition at line 1584 of file predicates.cpp.

References AMBIGUOUS, NOPERM, and NOTHING.

Referenced by match_possessed().

01585 {
01586     if (  old == NOPERM
01587        || new0 == NOPERM)
01588     {
01589         return NOPERM;
01590     }
01591     if (  old == AMBIGUOUS
01592        || new0 == AMBIGUOUS)
01593     {
01594         return AMBIGUOUS;
01595     }
01596     return NOTHING;
01597 }

dbref remove_first ( dbref  head,
dbref  thing 
)

Definition at line 52 of file predicates.cpp.

References DOLIST, Next, and s_Next.

Referenced by destroy_exit(), do_drop(), do_get(), move_object(), and move_the_exit().

00053 {
00054     if (head == thing)
00055     {
00056         return Next(thing);
00057     }
00058 
00059     dbref prev;
00060 
00061     DOLIST(prev, head)
00062     {
00063         if (Next(prev) == thing)
00064         {
00065             s_Next(prev, Next(thing));
00066             return head;
00067         }
00068     }
00069     return head;
00070 }

dbref reverse_list ( dbref  list  ) 

Definition at line 76 of file predicates.cpp.

References Next, NOTHING, and s_Next.

Referenced by process_sticky_dropto().

00077 {
00078     dbref newlist, rest;
00079 
00080     newlist = NOTHING;
00081     while (list != NOTHING)
00082     {
00083         rest = Next(list);
00084         s_Next(list, newlist);
00085         newlist = list;
00086         list = rest;
00087     }
00088     return newlist;
00089 }

void DCL_CDECL safe_tprintf_str ( char *  str,
char **  bp,
const char *  fmt,
  ... 
)

Definition at line 32 of file predicates.cpp.

References LBUF_SIZE, and mux_vsnprintf().

Referenced by do_drop(), do_malias_list(), do_newpassword(), do_page(), FUNCTION(), get_handler(), grep_util(), and unparse_boolexp1().

00033 {
00034     va_list ap;
00035     va_start(ap, fmt);
00036     size_t nAvailable = LBUF_SIZE - (*bp - str);
00037     size_t len = mux_vsnprintf(*bp, (int)nAvailable, fmt, ap);
00038     va_end(ap);
00039     *bp += len;
00040 }

char* DCL_CDECL tprintf ( const char *  fmt,
  ... 
)

Definition at line 22 of file predicates.cpp.

References LBUF_SIZE, and mux_vsnprintf().

Referenced by add_helpfile(), add_mail_message(), announce_connect(), announce_disconnect(), atr_encode(), CallBack_ShowDispatches(), canpayfees(), cf_log_notfound(), check_dead_refs(), check_floating(), check_mail(), convert_flags(), create_obj(), dbclean_CheckALISTtoAT(), dbclean_CheckALISTtoDB(), dbclean_CheckANHtoAT(), dbclean_CheckATtoANH(), debug_examine(), decode_power(), decompile_flags(), destroy_obj(), destroy_player(), did_it(), disp_from_on(), do_addcom(), do_addcommand(), do_attribute(), do_backup(), do_boot(), do_cemit(), do_chanlog(), do_channelwho(), do_chboot(), do_chopen(), do_chown(), do_chownall(), do_clone(), do_comconnectchannel(), do_comlast(), do_comlist(), do_comtitle(), do_comwho(), do_comwho_line(), do_cpattr(), do_create(), do_createchannel(), do_dbclean(), do_decomp(), do_delcom(), do_delcomchannel(), do_delcommand(), do_destroy(), do_destroychannel(), do_dig(), do_doing(), do_edit(), do_editchannel(), do_entrances(), do_examine(), do_expmail_start(), do_find(), do_fixdb(), do_flag(), do_function(), do_get(), do_halt(), do_hook(), do_icmd(), do_joinchannel(), do_kill(), do_last(), do_leavechannel(), do_link(), do_listcommands(), do_mail_cc(), do_mail_change_folder(), do_mail_debug(), do_mail_file(), do_mail_flags(), do_mail_fwd(), do_mail_list(), do_mail_nuke(), do_mail_proof(), do_mail_read(), do_mail_reply(), do_mail_retract(), do_mail_review(), do_mail_stats(), do_malias_add(), do_malias_adminlist(), do_malias_chown(), do_malias_create(), do_malias_delete(), do_malias_desc(), do_malias_list(), do_malias_list_all(), do_malias_remove(), do_malias_send(), do_malias_status(), do_motd(), do_move(), do_mvattr(), do_page(), do_pcreate(), do_pemit_single(), do_postpend(), do_prepend(), do_processcom(), do_prog(), do_queue(), do_say(), do_score(), do_shout(), do_stats(), do_toad(), do_train(), dump_database_internal(), dump_info(), dump_users(), edit_string_ansi(), FUNCTION(), fwdlist_load(), get_slave_result(), get_stats(), give_money(), give_thing(), handle_ears(), handle_prog(), hook_loop(), list_costs(), list_db_stats(), list_options(), list_process(), list_vattrs(), CGuests::ListAll(), load_game(), look_exits(), mail_check(), mail_return(), make_numlist(), CGuests::MakeGuestChar(), move_object(), new_mail_message(), open_exit(), page_check(), page_return(), parse_boolexp_L(), pool_free(), pool_free_lbuf(), pool_trace(), process_cmdent(), process_command(), process_enter_loc(), process_leave_loc(), record_login(), report_timecheck(), ReportMatchedTopics(), say_shout(), search_mark(), search_setup(), send_mail(), SendChannelMessage(), show_quota(), ShowPsLine(), SiteMonSend(), sweep_check(), tcache_finish(), view_atr(), and whisper_pose().

00023 {
00024     static char buff[LBUF_SIZE];
00025     va_list ap;
00026     va_start(ap, fmt);
00027     mux_vsnprintf(buff, LBUF_SIZE, fmt, ap);
00028     va_end(ap);
00029     return buff;
00030 }

bool ValidatePlayerName ( const char *  pName  ) 

Definition at line 486 of file predicates.cpp.

References statedata::bStandAlone, mudconf, mudstate, mux_isspace, mux_PlayerNameSet, confdata::name_spaces, and PLAYER_NAME_LIMIT.

Referenced by create_obj(), do_alias(), do_fixdb(), do_name(), and FUNCTION().

00487 {
00488     if (!pName)
00489     {
00490         return false;
00491     }
00492     size_t nName = strlen(pName);
00493 
00494     // Verify that name is not empty, but not too long, either.
00495     //
00496     if (  nName <= 0
00497        || PLAYER_NAME_LIMIT <= nName)
00498     {
00499         return false;
00500     }
00501 
00502     // Do not allow LOOKUP_TOKEN, NUMBER_TOKEN, NOT_TOKEN, or SPACE
00503     // as the first character, or SPACE as the last character
00504     //
00505     if (  strchr("*!#", *pName)
00506        || mux_isspace(pName[0])
00507        || mux_isspace(pName[nName-1]))
00508     {
00509         return false;
00510     }
00511 
00512     if (  mudstate.bStandAlone
00513        || mudconf.name_spaces)
00514     {
00515         mux_PlayerNameSet[(unsigned char)' '] = 1;
00516     }
00517     else
00518     {
00519         mux_PlayerNameSet[(unsigned char)' '] = 0;
00520     }
00521 
00522     // Only printable characters besides ARG_DELIMITER, AND_TOKEN,
00523     // and OR_TOKEN are allowed.
00524     //
00525     for (unsigned int i = 0; i < nName; i++)
00526     {
00527         if (!mux_PlayerNameSet(pName[i]))
00528         {
00529             return false;
00530         }
00531     }
00532 
00533     // Special names are specifically dis-allowed.
00534     //
00535     if (  (nName == 2 && memcmp("me", pName, 2) == 0)
00536        || (nName == 4 && (  memcmp("home", pName, 4) == 0
00537                          || memcmp("here", pName, 4) == 0)))
00538     {
00539         return false;
00540     }
00541     return true;
00542 }

dbref where_is ( dbref  what  ) 

Definition at line 2028 of file predicates.cpp.

References Exits, Good_obj, Location, NOTHING, TYPE_EXIT, TYPE_PLAYER, TYPE_THING, and Typeof.

Referenced by do_pemit_single(), do_say(), FUNCTION(), locatable(), mux_exec(), nearby(), and notify_check().

02029 {
02030     if (!Good_obj(what))
02031     {
02032         return NOTHING;
02033     }
02034 
02035     dbref loc;
02036     switch (Typeof(what))
02037     {
02038     case TYPE_PLAYER:
02039     case TYPE_THING:
02040         loc = Location(what);
02041         break;
02042 
02043     case TYPE_EXIT:
02044         loc = Exits(what);
02045         break;
02046 
02047     default:
02048         loc = NOTHING;
02049         break;
02050     }
02051     return loc;
02052 }

dbref where_room ( dbref  what  ) 

Definition at line 2059 of file predicates.cpp.

References Good_obj, Has_location, isRoom, Location, mudconf, NOTHING, and confdata::ntfy_nest_lim.

Referenced by do_teleport_single(), dump_users(), and locatable().

02060 {
02061     for (int count = mudconf.ntfy_nest_lim; count > 0; count--)
02062     {
02063         if (!Good_obj(what))
02064         {
02065             break;
02066         }
02067         if (isRoom(what))
02068         {
02069             return what;
02070         }
02071         if (!Has_location(what))
02072         {
02073             break;
02074         }
02075         what = Location(what);
02076     }
02077     return NOTHING;
02078 }


Generated on Mon May 28 04:40:22 2007 for MUX by  doxygen 1.4.7